Ћекции.ќрг


ѕоиск:




 атегории:

јстрономи€
Ѕиологи€
√еографи€
ƒругие €зыки
»нтернет
»нформатика
»стори€
 ультура
Ћитература
Ћогика
ћатематика
ћедицина
ћеханика
ќхрана труда
ѕедагогика
ѕолитика
ѕраво
ѕсихологи€
–елиги€
–иторика
—оциологи€
—порт
—троительство
“ехнологи€
“ранспорт
‘изика
‘илософи€
‘инансы
’ими€
Ёкологи€
Ёкономика
Ёлектроника

 

 

 

 


√лава 7. ¬ажнейшие объектные типы




ћассивы

ћассив (array) Ц это упор€доченный набор одинаково устроенных €чеек, доступ к которым осуществл€етс€ по индексу. Ќапример, если у массива им€ a1, то a1[i] Ц им€ €чейки этого массива, имеющей с индекс i.

¬ Java массивы €вл€ютс€ объектами, но особого рода Ц их объ€вление отличаетс€ от объ€влени€ других видов объектов. ѕеременна€ типа массив €вл€етс€ ссылочной Ц в ней содержитс€ адрес объекта, а не сам объект, как и дл€ всех других объектных переменных в Java. ¬ качестве элементов (€чеек) массива могут выступать значени€ как примитивных типов, так и ссылочных типов, в том числе Ц переменные типа массив.

“ип €чейки массива называетс€ базовым типом дл€ массива.

ƒл€ задани€ массива, в отличие от объектов других типов, не требуетс€ предварительно задавать класс, и иметь специальное им€ дл€ данного объектного типа. ¬место имени класса при объ€влении переменной используетс€ им€ базового типа, после которого идут пустые квадратные скобки.

Ќапример, объ€вление

int[] a1;

задаЄт переменную a1 типа массив. ѕри этом размер массива (число €чеек в нЄм) заранее не задаЄтс€ и не €вл€етс€ частью типа.

ƒл€ того, чтобы создать объект типа массив, следует воспользоватьс€ зарезервированным словом new, после чего указать им€ базового типа, а за ним в квадратных скобках число €чеек в создаваемом массиве:

a1=new int[10];

ћожно совместить объ€вление типа переменной и создание массива:

int[] a1=new int[10];

ѕосле создани€ массивы Java всегда инициализированы Ц в €чейках содержатс€ нули. ѕоэтому если базовый тип массива примитивный, элементы массива будут нул€ми соответствующего типа. ј если базовый тип ссылочный Ц в €чейках будут значени€ null.

ячейки в массиве имеют индексы, всегда начинающиес€ с нул€. “о есть перва€ €чейка имеет номер 0, втора€ Ц номер 1, и так далее. ≈сли число элементов в массиве равно n, то последн€€ €чейка имеет индекс n-1. “ака€ своеобразна€ нумераци€ прин€та в €зыках C и C++, и €зык Java унаследовал эту не очень привлекательную особенность, часто привод€щую к ошибкам при организации циклов.

ƒлина массива хранитс€ в поле length, которое доступно только по чтению Ц измен€ть его путЄм присваивани€ нового значени€ нельз€.

ѕример работы с массивом:

int[] a=new int[100];

for(int i=0;i<a.length;i++){

a[i]=i+1;

};

≈сли у нас имеетс€ переменна€ типа массив, и ей сопоставлен массив заданной длины, в любой момент этой переменной можно сопоставить новый массив. Ќапример,

a1=new int[20];

ѕри этом прежний объект-массив, наход€щийс€ в динамической области пам€ти, будет утер€н и превратитс€ в мусор.

ѕеременные типа массив можно присваивать друг другу. Ќапример, если мы задали переменную

int[] a2;

то сначала в ней хранитс€ значение null (ссылка направлена Ув никудаФ):

 

 

ћассив с €чейками типа int

 
 

 

 


a1

јдрес массива


 

 

a2

јдрес=0
null

 

 

ѕрисваивание

a2=a1;

приведЄт к тому, что ссылочные переменные a1 и a2 будут ссылатьс€ на один и тот же массив, расположенный в динамической области пам€ти.

 

ћассив с €чейками типа int

 
 

 

 


a1

јдрес массива


 

 

a2

јдрес массива


 

 

“о есть присваивание переменных типа массив приводит к тому, что имена переменных станов€тс€ синонимами одного и того же массива Ц копируетс€ адрес массива. ј вовсе не приводит к копированию элементов из одного массива в другой, как это происходит в некоторых других €зыках программировани€.

¬ качестве элементов массивов могут выступать объекты. ¬ этом случае доступ к пол€м и методам этих объектов производитс€ через им€ €чейки массива, после которого через точку указываетс€ им€ пол€ или метода. Ќапример, если у нас имеетс€ класс Circle (УокружностьФ), у которого имеютс€ пол€ x, y и r, а также методы show() и hide(), то массив circles из 10 объектов такого типа может быть задан и инициализирован, например, так

int n=10;

Circle[] circles=new Circle[n];

for(int i=0;i<n;i++){

circles[i]=new Circle();

circles[i].x=40*i;

circles[i].y= circles[i].x/2;

circles[i].r=50;

circles[i].show();

};

¬ такого рода программах дл€ повышени€ читаемости часто примен€етс€ использование вспомогательной ссылки, позвол€ющей избежать многократного обращени€ по индексу. ¬ нашем случае мы будем использовать в этих цел€х переменную circle. Ќа скорости работы программы это почти не сказываетс€ (хот€ и может чуть повысить быстродействие), но делает код более читаемым:

int n=10;

Circle[] circles=new Circle[n];

Circle circle;

for(int i=0;i<n;i++){

circle=new Circle();

circle.x=40*i;

circle.y= circles[i].x/2;

circle.r=50;

circle.show();

circles[i]= circle;

};

— помощью переменной circle мы инициализируем создаваемые объекты и показываем их на экране, после чего присваиваем ссылку на них €чейкам массива.

ƒвумерный массив представл€ет собой массив €чеек, кажда€ из которых имеет тип Уодномерный массивФ. —оответствующим образом он и задаЄтс€. Ќапример, задание двумерного массива целых чисел будет выгл€деть так:

int[][] a=new int[10][20];

Ѕудет задана €чейка типа Удвумерный массивФ, а также создан и назначен этой ссылочной переменной массив, имеющий по первому индексу 10 элементов, а по второму 20. “о есть мы имеем 10 €чеек типа Уодномерный массивФ, кажда€ из которых ссылаетс€ на массив из 20 целых чисел. ѕри этом базовым типом дл€ €чеек по первому индексу €вл€етс€ int[], а дл€ €чеек по второму индексу int.

–ассмотрим работу с двумерными массивами на примере заполнени€ двумерного массива случайными числами:

int m=10;//10 строк

int n=20;//20 столбцов

int[][] a=new int[m][n];

for(int i=0;i<m;i++){ //цикл по строкам

for(int j=0;j<n;j++){ //цикл по столбцам

a[i][j]=(int)(100*Math.random());

System.out.print(a[i][j]+" ");

};

System.out.println();//перевод на новую строку после вывода строки матрицы

};

 

ћногомерные массивы задаютс€ аналогично двумерным Ц только указываетс€ необходимое количество пр€моугольных скобок. —ледует отметить, что массивы размерности больше 3 используют крайне редко.

ќбычно в двумерных и многомерных массивах задают одинаковый размер всех массивов, св€занных с €чейками по какому-либо индексу. “акие массивы называют регул€рными. ¬ Java, в отличие от большинства других €зыков программировани€, можно задавать массивы с разным размером массивов, св€занных с €чейками по какому-либо индексу. “акие Унепр€моугольныеФ массивы называют иррегул€рными. ќбычно их используют дл€ экономии пам€ти. ѕри работе с иррегул€рными массивами следует быть особенно аккуратными, так как разный размер УвложенныхФ массивов часто приводит к ошибкам при реализации алгоритмов.

ѕример задани€ иррегул€рного двумерного массива треугольной формы:

int n=9;

int[][] a=new int[n][];

for(int i=0;i<a.length;i++){ //цикл по строкам

a[i]=new int[i+1]; //число элементов в строке равно i+1

for(int j=0;j<a[i].length;j++){ //цикл по столбцам

a[i][j]=100*i+j;

System.out.print(a[i][j]+" ");

};

System.out.println();//перевод на новую строку после вывода строки матрицы

};

ѕосле создани€ массива требуетс€ его инициализировать Ц записать нужные значени€ в €чейки. ƒо сих пор мы делали это путЄм задани€ значений в цикле по некоторой формуле, однако часто требуетс€ задать конкретные значени€.  онечно, можно это сделать в виде

int[] a=new int[4];

a[0]=2;

a[1]=0;

a[2]=0;

a[3]=6;

Ќо гораздо удобнее следующий вариант синтаксиса:

int[] a=new int[] {2,0,0,6};

ѕри этом приходитс€ задавать массив без указани€ его размера непосредственно с помощью указани€ значений в фигурных скобках:

¬ правой части оператора присваивани€ стоит так называемый анонимный массив Ц у него нет имени. “акие массивы обычно используют дл€ инициализации, а также при написании кода дл€ различного рода проверок.

≈сли мы хотим присвоить новые значени€, приходитс€ либо присваивать поэлементно, либо создавать новый объект:

a=new int[] {2,0,0,6};

ѕри инициализации двумерных и многомерных массивов используют вложенные массивы, задаваемые с помощью фигурных скобок. Ќапример, фрагмент кода

int[][] b= new int[][]

{

{2,0,0,0}, //это b[0]

{2,0,0,1}, //это b[1]

{2,0,0,2}, //это b[2]

{1,0,0,0}, //это b[3]

{2,0,0,0}, //это b[4]

{3,0,0,0}, //это b[5]

};

приведЄт к заданию целочисленного двумерного массива b, состо€щего из 6 строк и 4 столбцов, т.е. int[6][4]. “аким образом можно задавать как регул€рные, так и иррегул€рные массивы. Ќо следует помнить, что в таком варианте синтаксиса проверки правильности размера массива по индексам не делаетс€, что может привести к ошибкам. Ќапример, следующий код при компил€ции не выдаст ошибки, а будет создан иррегул€рный массив:

int[][] b= new int[][]

{

{2,0,0,0}, //это b[0]

{2,0,0,1}, //это b[1]

{2,0,0,2}, //это b[2]

{1,0,0,0}, //это b[3]

{2,0,0,0}, //это b[4]

{3,0,0}, //это b[5] Ц массив из трЄх элементов

};

»з объектов-массивов можно вызывать метод clone(), позвол€ющий создавать копию (клон) массива:

a=new int[] {2,0,0,6};

int[] a1=a.clone();

Ќапомним, что присваивание

int[] b=a;

не приведЄт к копированию массива Ц просто переменна€ b станет ссылатьс€ на тот же объект-массив.  опирование массивов можно осуществл€ть в цикле, но гораздо быстрее использовать метод System.arraycopy.

int[] b=new int[a.length+10];

System.arraycopy(a,index1a,b, index1b,count);

»з a в b копируетс€ count элементов начина€ с индекса index1a в массиве a. ќни размещаютс€ в массиве b начина€ с индекса index1b. —одержимое остальных элементов b не мен€етс€. ƒл€ использовани€ метода требуетс€, чтобы массив b существовал и имел необходимую длину - при выходе за границы массивов возбуждаетс€ исключительна€ ситуаци€.

Ѕыстрое заполнение массива одинаковыми значени€ми может осуществл€тьс€ методом Arrays.fill(массив, значение).  ласс Arrays расположен в пакете java.util.

ѕоэлементное сравнение массива следует выполн€ть с помощью метода Arrays.equals(a,a1). «аметим, что у любого массива имеетс€ метод equals, унаследованный от класса Object и позвол€ющий сравнивать массивы. Ќо, к сожалению, метод не переопределЄн, и сравнение идЄт по адресам объектов, а не по содержимому. ѕоэтому a.equals(a1) это то же самое, что a==a1. ќба сравнени€ вернут false, так как адреса объектов, на которые ссылаютс€ переменные a и a1, различаютс€. Ќапротив, сравнени€ a.equals(a3) и a==a3 вернут true, так как a и a3 ссылаютс€ на один и тот же объект-массив.

—ортировка (упор€дочение по значени€м) массива a производитс€ методами Arrays.sort(a) и Arrays.sort(a,index1,index2). ѕервый из них упор€дочивает в пор€дке возрастани€ весь массив, второй Ц часть элементов (от индекса index1 до индекса index2). »меютс€ и более сложные методы сортировки. Ёлементы массива должны быть сравниваемы (поддерживать операцию сравнени€).

Arrays.deepEquals(a1,a2) Ц сравнение на равенство содержимого массивов объектов a1 и a2 путЄм глубокого сравнени€ (на равенство содержимого, а не ссылок Ц на произвольном уровне вложенности).

“акже в классе Arrays содержитс€ большое число других полезных методов.

 





ѕоделитьс€ с друзь€ми:


ƒата добавлени€: 2017-02-28; ћы поможем в написании ваших работ!; просмотров: 466 | Ќарушение авторских прав


ѕоиск на сайте:

Ћучшие изречени€:

Ќаука Ч это организованные знани€, мудрость Ч это организованна€ жизнь. © »ммануил  ант
==> читать все изречени€...

1194 - | 1073 -


© 2015-2024 lektsii.org -  онтакты - ѕоследнее добавление

√ен: 0.024 с.