Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
2 Лекция Java.doc
Скачиваний:
0
Добавлен:
01.04.2025
Размер:
273.41 Кб
Скачать

Контрольные вопросы Литература

  1. http://kostin.ws/java/

Массивы в языке Java, класс Arrays

Массивы являются элементом практически любой программы. Поэтому разработчики языка Java уделили этому вопросу достаточно много времени и проделали большую работу, что бы ими было пользоваться как можно удобней. В этой статье я рассмотрю, как самые известные способы работы, так и то, о чём часто даже не догадываются начинающие программисты, но что значительно упрощает программирование.

Для того чтобы начать работать с массивом какого либо типа нужно объявить переменную типа массив например для типа int это будет выглядеть так:

view plainprint?

  1. int[] numbers;  

Или так: 

view plainprint?

  1. int numbers[];  

В особых случая можно даже так: 

view plainprint?

  1. public static void main(String... args){  

  2. }  

Но первый вариант более предпочтителен, так как в нём явно отделяются тип переменной от её имени и его можно использовать в любом месте кода, где можно объявить переменную. Именно этим вариантом я и буду пользоваться в дальнейшем. 

После этого необходимо выделить память под этот массив. Обычно это происходит вот так:

view plainprint?

  1. int[] numbers;  

  2. numbers = new int[10];  

Можно объявлять переменную и инициализировать её в одной строке: 

view plainprint?

  1. int[] numbers = new int[10];  

Если же элементы будущего массива известны заранее, то можно использовать такой синтаксис:

view plainprint?

  1. int[] numbers = {23,43,22,34,14,56,86,77,810,9};  

Что бы теперь обратиться к элементам этого массива, мы можем использовать индекс элемента от 0 до 9 (в Java элементы массива нумеруются от 0, поэтому верхняя граница на 1 меньше, чем при инициализации):

view plainprint?

  1. int[] numbers = new int[10];  

  2. int first = numbers[0];  

  3. number[4] = 76;  

  4. int last = numbers[9];  

  5. for(int i = 0; i < 10; i++){  

  6.   System.out.println(number[i]);  

  7. }  

Рис 1. Ссылка на массив

При этом следует помнить, что в переменной хранится не весь массив, а только ссылка на этот массив. Это можно увидеть наглядо на рисунке 1. Казалось бы, как нам разница, хранится весь массив или только ссылка на него? В реальности же оказывается если не учитывать этого момента, то можно попасть в достаточно неприятную ситуацию. Рассмотрим простой пример:

view plainprint?

  1. int[] numbers = {1,23, 13};  

  2. int[] numbersCopy = numbers;  

  3. numbersCopy[1] = 43;  

  4.   

  5. for(int i = 0; i < 3; i++){  

  6.   System.out.print(numbers[i]);  

  7. }  

  8. System.out.println();  

  9.   

  10. for(int i = 0; i < 3; i++){  

  11.   System.out.print(numbersCopy[i]);  

  12. }  

Рис 2. Копирование ссылки

Если считать, что в переменных хранятся не ссылки а массивы целиком, то результат должен был бы быть вывод двух строк: "12313" и "14313", но в реальности мы получим две одинаковые строки: "14313". Это происходит из-за того, что мы переменной nubmersCopy присваеваем не копию массива, а копию ссылки. И у нас получаются две переменные с одинаковыми значениями, но значения эти не массивы, как мы хотели, а ссылки на массив. Графически это можно изобразить так, как на рисунке 2. Самый простой способ избежать этого, это использовать метод clone у любого объекта типа массив. Так же объект класса массив имеет константу, в которой хранится количество элементов массива —length. Таким образом код можно переписать следующим образом:

view plainprint?

  1. int[] numbers = {1,23, 13};  

  2. int[] numbersCopy = numbers.clone();  

  3. numbersCopy[1] = 43;  

  4.   

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

  6.   System.out.print(numbers[i]);  

  7. }  

  8. System.out.println();  

  9.   

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

  11.   System.out.print(numbersCopy[i]);  

  12. }  

Рис 3. Массив массивовВ языке Java не существует многомерных массивов, но тем не менее у нас есть возможность в элементе массива хранить другой массив, что позволяет имитировать многомерные массивы. Благодаря этому мы можем создавать многомерные массивы с произвольной длинной элементов. Это проиллюстрированно на рисунке 3. В коде это выглядит следующим образом:

view plainprint?

  1. /*Простой двумерный массив*/  

  2. int[][] twoDimensionsArray = new int[3][5];  

  3. /*Массив с разными размерностями, как на рис. 3*/  

  4. int[][] twoDimenstionsArray2 = {  

  5.   {2,4,223},  

  6.   {54,215},  

  7.   {25,64,26,67}  

  8. };  

  9. /*Массив с разными размерностями, как на рис. 3*/  

  10. int[][] twoDimenstionsArray3 = new int[3][];  

  11. differentDimensions[0] = new int[3];  

  12. differentDimensions[1] = new int[2];  

  13. differentDimensions[2] = new int[4];  

При работе с такими массивами полезно знать один трюк: всегда старайтесь располагать массивы с наименьшем числом элементов ближе к правой стороне, например:

view plainprint?

  1. int[][] twoDimensionsArray = new int[3][500][2000][10000];  

Дело в том, что для хранения каждого массива JVM хранит дополнительную информацию, и расположив массивы подобным образом вы уменьшите количество необходимой дополнительной информации до минимума.

Класс java.util.Arrays

Класс Arrays предназначен для работы с массивами. Он содержит методы для работы с целыми массивами, например:

  •  copyOf — предназначен для копирования массива;

  • copyOfRange — копирует часть массива;

  • toString — позволяет получить все элементы в виде одной строки;

  • sort — сортирует массив методом quick sort; 

  • binarySearch — ищет элемент методом бинарного поиска; 

  • fill — заполняет массив переданным значением (удобно использовать, если нам необходимо значение по умалчанию для массива); 

  • equals — проверяет на идентичность массивы; 

  • deepEquals — проверяет на идентичность массивы массивов; 

  • asList — возвращает массив как коллекцию (коллекции будут рассмотрены в следующий раз).

Пример использования класса Arrays:

view plainprint?

  1. int[] first = {31,25,3,324,22,33,643,12};  

  2. int[] second;  

  3.   

  4. second = Arrays.copyOf(first, first.length);  

  5. System.out.println(Arrays.equals(first, second));  

  6.   

  7. Arrays.sort(first);  

  8. System.out.println(Arrays.equals(first, second));   

  9. System.out.println(Arrays.toString(first));  

  10. System.out.println(Arrays.toString(second));  

  11.   

  12. Arrays.fill(second, 100);  

  13. System.out.println(Arrays.toString(second));  

Если мы запустим этот код, то получим такой вывод: true false [3, 12, 22, 25, 31, 33, 324, 643] [31, 25, 3, 324, 22, 33, 643, 12] [100, 100, 100, 100, 100, 100, 100, 100]

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]