Между массивами JAVA и классами-контейнерами есть три основных различия: эффективность, тип и возможность сохранять базовые типы . В JAVA массивы — наиболее эффективный способ хранения и случайного доступа к последовательности ссылок на объекты. Массив представляет собой простую линейную последовательность, которая обеспечивает очень быстрый доступ к элементам. Но цена за это — то, что размер массива фиксирован и не может быть изменен в течение его жизни.
Благодаря дженерикам и механизмам автоматической упаковки контейнеры теперь можно использовать с примитивными типами почти так же легко, как с массивами. И массивы, и контейнеры могут в определенной степени помешать вам злоупотреблять ими. Если они выйдут за пределы, вы получите исключение RuntimeException. Единственное остающееся преимущество массивов — это эффективность. Однако если вы хотите решать более общие задачи, массивы могут оказаться слишком ограничительными, поэтому в этом случае большинство людей все равно выберут контейнеры.
Поэтому, если вы используете последние версии JAVA, вам следует отдавать предпочтение контейнерам, а не массивам. Программы следует перерабатывать на массивы только в том случае, если производительность оказалась проблемой и переключение на массивы повышает производительность.
【инициализация】
В JAVA действуют очень строгие правила инициализации массивов, что позволяет эффективно предотвратить злоупотребление массивами. Если возникла ошибка инициализации, вы получите CompileException вместо RuntimeException напрямую. Ничего нельзя сделать с этой ссылкой на массив, пока массив не будет правильно инициализирован.
Определения массива включают int[] array и int array[]. Обычно первый стиль используется для отделения типа от имени переменной.
Существует два способа инициализации массива: статическая инициализация и динамическая инициализация. Длина должна быть указана во время инициализации. Должна быть указана длина первого измерения многомерного массива, и она должна быть определена от старшего к младшему. Действие инициализации может находиться в любом месте кода, но метод {} может появляться только там, где создается массив. См. программу для конкретных методов инициализации:
arrayA = new int[10] //Динамическая инициализация
System.out.println("Длина массиваA: " + arrayA.length);
int[] arrayC = новый int[]{1,2,3,4};
System.out.println("длина массиваC: " + arrayC.length);
//int[] arrayD = new int[1]{1} //Неправильная инициализация, размеры и значения инициализации не могут быть определены одновременно
int[][] arrayE = новый int[1][];
System.out.println("длина массиваE: " + arrayE.length);
//int[][] arrayF = new int[][2] //Сначала необходимо указать длину верхнего измерения
int[][] arrayG = новый int[][]{{1,2,3,4},{5,6,7},{7,24,23,24}};
System.out.println("длина массиваG: " + arrayG.length);
int[][][] arrayH = новый int[][][]{{{1,2,3},{4,5,6},{7,8,9},{10,11,12} }};
System.out.println("длина массиваH: " + arrayH.length);
dummyArray[] arrayI = {new dummyArray(),new dummyArray()} //Пользовательский тип массива
System.out.println("Длина массива: " + arrayI.length);
System.out.println("arrayI[1]: " + arrayI[1].getValue());
dummyArray[] arrayK = новый dummyArray[5];
System.out.println("arrayK[0]: " + arrayK[0]);
for(int я = 0; я <arrayK.length; я++){
arrayK[i] = новый dummyArray();
}
System.out.println("arrayK[0]: " + arrayK[0].getValue()); //2
}
}
класс dummyArray{
частная статическая температура int;
частный окончательный int arrayValue = temp++;
общественный ИНТ getValue () {
вернуть значение массива;
}
}
Выход:
Длина массиваB: 5
Длина массиваA: 10
Длина массиваC: 4
Длина массиваE: 1
Длина массиваG: 3
Длина массиваH: 1
Длина массива: 2
массивI[1]: 1
массивК[0]: ноль
массивК[0]: 2
int[][] arrayB = новый int[10][];
System.out.println("длина массиваB: " + arrayB.length);
int[][] arrayC = новый int[][]{{1,1,1,2,},{1,1,2,3,4,5},{4,5,6,7,7} ,};//Обратите внимание на запятую после
System.out.println("длина массиваC: " + arrayC.length);
int[][] arrayD = новый int[][]{{1,1,1,2,},{1,1,2,3,4,5},{4,5,6,7,7} , {}};
System.out.println("длина массиваD: " + arrayD.length);
}
}
Выход:
Длина массиваA: 15
Длина массиваB: 10
Длина массиваC: 3
Длина массиваD: 4
[Назначение и ссылка]
Когда массив JAVA инициализируется, он имеет только ссылку на массив, и для него не выделяется пространство для хранения. Следовательно, копирование между массивами не может просто использовать присваивание "=", поскольку используется один и тот же объект. Следующая процедура:
}
}
Выход:
Я testA, у меня ничего не изменилось: testA
Я arrayA, у меня ничего не изменилось: arrayB изменился
[Копия массива]
Как скопировать массив в JAVA:
1. Используйте цикл FOR для копирования всех или указанных элементов, что менее эффективно.
2. Используйте метод клонирования, чтобы получить значение массива вместо ссылки. Однако клон не может копировать указанные элементы и имеет низкую гибкость.
3. Используйте метод System.arraycopy(src, srcPos, dest, destPos, length). Стандартная библиотека классов Java предоставляет статический метод System.arraycopy(). Его использование для копирования массива происходит намного быстрее, чем системный цикл. .arraycopy() предназначен для всех типов. Как массивы базовых типов, так и массивы объектов можно копировать с помощью System.arraycopy(), но массивы объектов копируют только ссылки, и двух копий объектов не будет. Это называется поверхностным копированием.
src: исходный массив;
srcPos: начальная позиция копируемого исходного массива;
dest: массив назначения;
destPos: начальная позиция, в которой размещается целевой массив;
длина: длина копии.
Примечание. System.arraycopy() не выполняет автоматическую упаковку и автоматическую распаковку, поэтому два массива должны быть одного типа или могут быть преобразованы в массивы того же типа. В то же время этот метод можно использовать и для копирования самого массива.
int[] тест = {0,1,2,3,4,5,6};
System.arraycopy(тест,0,тест,3,3);
Результат: {0,1,2,0,1,2,6};
Процедура испытания следующая:
//клонируем метод
int[] arrayB = новый int[9];
массивB = массив.клон();
//тест
массивБ[1] = 19;
for(int я = 0; я <arrayB.length; я++){
System.out.print(arrayB[i] + ",");
}
System.out.println("");
for(int я = 0; я <array.length; я++){
System.out.print(array[i] + ",");
}
System.out.println("");
//Метод System.arrayCopy
int[] arrayC = новый int[9];
System.arraycopy(массив, 0, arrayC, 0, arrayC.length);
//тест
массивC[1] = 19;
for(int я = 0; я <arrayC.length; я++){
System.out.print(arrayC[i] + ",");
}
System.out.println("");
for(int я = 0; я <array.length; я++){
System.out.print(array[i] + ",");
}
}
}
String[][] arrayD = {{"a","b"},{"c","d"}};
String[][] arrayE = {{"a","b"},{"c","d"}};
System.out.println(Arrays.deepEquals(arrayD, arrayE));
}
}
[возвращаемый массив]
C и C++ не могут возвращать массив, а только указатель на массив, поскольку возврат массива затрудняет управление жизненным циклом массива и может легко вызвать утечки памяти. Java позволяет возвращать массив напрямую, и он может быть переработан механизмом сборки мусора.
[Преобразование массива и контейнера] [Невозможно преобразовать массив базового типа]
Преобразовать массив в список:
int[] arrayB = {1,2,3};
Список listB = java.util.Arrays.asList(arrayB);
System.out.println("listB: " + listB);
Целое число [] arrayC = {1,2,3};
Список listC = java.util.Arrays.asList(arrayC);
System.out.println("listC: " + listC);
}
}
Выход:
списокА: [а, б, в]
listB: [[I@de6ced]
списокC: [1, 2, 3]
Преобразовать список в массив
String[] strings = новая String[list.size()];
массив = list.toArray(строки);
for(int i = 0, j = array.length; i <j; i++){
System.out.print(array[i] + ",");
}
}
}
Результат:
список: [testA, testB, testC]
тестA, тестB, тестC
общественный статический String[] arrayUnique(String[] array){
List<String> list = новый ArrayList<String>();
for(int i = 0, j = array.length; i <j; i++){
если(!list.contains(массив[i])){
list.add(массив[я]);
}
}
String[] strings = новая String[list.size()];
String[] arrayUnique = list.toArray(strings);
вернуть массивUnique;
}
}
Double[] arrayB = новый Double[1000000];
for(int i = 0, j = arrayB.length; i <j; i++){
arrayB[i] = Math.ceil(Math.random()*1000);
}
System.out.println("старт");
длинный startTime = System.currentTimeMillis();
arrayUnique (массив);
long endTime = System.currentTimeMillis();
System.out.println("уникальное время выполнения массива: " +(endTime - startTime) +"ms");
длинный startTimeB = System.currentTimeMillis();
массивUnique (массивB);
long endTimeB = System.currentTimeMillis();
System.out.println("уникальное время выполнения массиваB: " +(endTimeB - startTimeB) +"ms");
}
public static Double[] arrayUnique(Double[] array){
List<Double> list = новый ArrayList<Double>();
for(int i = 0, j = array.length; i <j; i++){
если(!list.contains(массив[i])){
list.add(массив[я]);
}
}
Double[] doubles = новый Double[list.size()];
Double[] arrayUnique = list.toArray(doubles);
вернуть массивUnique;
}
}
Выход:
начинать
уникальное время выполнения массива: 577 мс
Уникальное время выполнения arrayB: 5663 мс