:notebook: Эта статья была заархивирована в: "blog"
:keyboard: Пример кода в этой статье был заархивирован в: "javacore"
Введение
свойства массива
Массивы являются одной из важных структур данных для каждого языка программирования.Разумеется, разные языки реализуют и обрабатывают массивы по-разному. Массивы поддерживаются почти во всех языках программирования.
Массивы представляют ряд объектов или примитивных типов данных, все из которых инкапсулированы вместе под единым именем-идентификатором.
Определение и использование массивов необходимо передать квадратными скобками[]
.
В Java массив является ссылочным типом.
В Java массивы используются для хранения элементов фиксированного размера одного типа.
Массивы и контейнеры
В Java, поскольку есть мощные контейнеры, нет ли необходимости в массивах?
Ответ - нет.
Конечно, в большинстве случаев для хранения данных следует выбирать контейнеры.
Однако массивы тоже не бесполезны:
- В Java массивы являются наиболее эффективным способом хранения и произвольного доступа к последовательностям ссылок на объекты.Массивы более эффективны, чем контейнеры(как
ArrayList
). - Массивы могут содержать типы значений, в то время как контейнеры не могут(В этом случае необходимо использовать класс-оболочку).
Суть массивов Java — это объекты
Суть массивов Java — это объекты. У него есть некоторые основные характеристики других объектов в Java: он инкапсулирует некоторые данные, может обращаться к свойствам и может вызывать методы. Итак, массивы — это объекты.
Если есть два класса A и B, то ссылка типа A[] может указывать на объект типа B[], если B расширяет A.
Дальнейшее чтение:Особенности массивов в Java
Если вы хотите поспоритьМассивы Java по сути являются объектами, может захотеть прочитать эту статью.
Массивы Java и память
Массивы Java хранятся в памяти следующим образом:
Объекты массива (здесь можно увидеть как указатель) хранятся в стеке.
Элементы массива хранятся в куче.
Как показано на следующем рисунке: только при выполнении JVMnew String[]
Когда соответствующая область памяти открыта в куче. Массив объектов массива можно рассматривать как указатель на адрес хранения этого фрагмента памяти.
объявить массив
Синтаксис объявления переменной массива следующий:
int[] arr1; // 推荐风格
int arr2[]; // 效果相同
создать массив
Использование языка Javanew
Оператор для создания массива. Существует два способа создания массива:
- указать размеры массива
- Открывает измерение массива указанного размера для массива.
- Если элементы массива являются примитивными типами данных, каждому элементу будет присвоено значение по умолчанию; если это ссылочный тип, значение элемента будет
null
.
- Не указывать размеры массива
- Инициализируйте массив фактическими элементами в фигурных скобках, размер массива совпадает с количеством элементов.
Пример 1:
public class ArrayDemo {
public static void main(String[] args) {
int[] array1 = new int[2]; // 指定数组维度
int[] array2 = new int[] { 1, 2 }; // 不指定数组维度
System.out.println("array1 size is " + array1.length);
for (int item : array1) {
System.out.println(item);
}
System.out.println("array2 size is " + array1.length);
for (int item : array2) {
System.out.println(item);
}
}
}
// Output:
// array1 size is 2
// 0
// 0
// array2 size is 2
// 1
// 2
:bulb: инструкцияОбратите внимание, что элементы в массиве array1 не инициализированы, но их длина совпадает с указанной размерностью массива. Это указываетПосле указания размерности массива, независимо от того, будут ли элементы в массиве инициализированы позже, массив уже открыл соответствующую память.
Для всех элементов массива array1 установлены значения по умолчанию.
Пример 2:
public class ArrayDemo2 {
static class User {}
public static void main(String[] args) {
User[] array1 = new User[2]; // 指定数组维度
User[] array2 = new User[] {new User(), new User()}; // 不指定数组维度
System.out.println("array1: ");
for (User item : array1) {
System.out.println(item);
}
System.out.println("array2: ");
for (User item : array2) {
System.out.println(item);
}
}
}
// Output:
// array1:
// null
// null
// array2:
// io.github.dunwu.javacore.array.ArrayDemo2$User@4141d797
// io.github.dunwu.javacore.array.ArrayDemo2$User@68f7aae2
:bulb: инструкция
Сравнивая этот пример с примером 1, можно обнаружить, что если массив создан с использованием указанного метода измерения массива, а элементы массива имеют ссылочный тип, значение элемента элементов в массиве равно
null
.
Форма измерения массива
При создании массива указанные размеры массива могут принимать различные формы:
- Размеры массива могут быть целыми числами, символами.
- Размерность массива может быть целочисленной или символьной переменной.
- Измерения массива могут быть выражениями, которые оцениваются как целые числа или символы.
Пример:
public class ArrayDemo3 {
public static void main(String[] args) {
int length = 3;
// 放开被注掉的代码,编译器会报错
// int[] array = new int[4.0];
// int[] array2 = new int["test"];
int[] array3 = new int['a'];
int[] array4 = new int[length];
int[] array5 = new int[length + 2];
int[] array6 = new int['a' + 2];
// int[] array7 = new int[length + 2.1];
System.out.println("array3.length = [" + array3.length + "]");
System.out.println("array4.length = [" + array4.length + "]");
System.out.println("array5.length = [" + array5.length + "]");
System.out.println("array6.length = [" + array6.length + "]");
}
}
// Output:
// array3.length = [97]
// array4.length = [3]
// array5.length = [5]
// array6.length = [99]
💡инструкция
Когда указанное измерение массива является символьным, Java преобразует его в целое число. как персонажи
a
Код ASCII для 97.Подводить итоги,Размеры массивов массивов Java могут быть константами, переменными, выражениями, если они преобразуются в целые числа..
Обратите внимание, что некоторые языки программирования не поддерживают это, например языки C/C++, которые позволяют только размеры массива быть постоянными.
размер измерения массива
Размерность массива не безгранична, если значение слишком велико, во время компиляции будет сообщено об ошибке.
int[] array = new int[6553612431]; // 数组维度过大,编译报错
также,Массив слишком велик, что может привести к переполнению стека..
массив доступа
В Java это можно сделать с помощью[]
Укажите нижний индекс в для доступа к элементу массива, а позиция нижнего индекса начинается с 0.
public class ArrayDemo4 {
public static void main(String[] args) {
int[] array = {1, 2, 3};
for (int i = 0; i < array.length; i++) {
array[i]++;
System.out.println(String.format("array[%d] = %d", i, array[i]));
}
}
}
// Output:
// array[0] = 2
// array[1] = 3
// array[2] = 4
💡инструкция
В приведенном выше примере, начиная с 0, все элементы массива массива перебираются с использованием индексов, добавляя 1 к значению каждого элемента.
ссылка на массив
В Java тип массива является ссылочным типом..
Следовательно, его можно использовать в качестве ссылки функцией Java.Как параметр функции или возвращаемое значение.
Пример массива в качестве параметра функции:
public class ArrayRefDemo {
private static void fun(int[] array) {
for (int i : array) {
System.out.print(i + "\t");
}
}
public static void main(String[] args) {
int[] array = new int[] {1, 3, 5};
fun(array);
}
}
// Output:
// 1 3 5
Пример массива как возвращаемого значения функции:
public class ArrayRefDemo2 {
/**
* 返回一个数组
*/
private static int[] fun() {
return new int[] {1, 3, 5};
}
public static void main(String[] args) {
int[] array = fun();
System.out.println(Arrays.toString(array));
}
}
// Output:
// [1, 3, 5]
Дженерики и массивы
В общем, массивы и дженерики плохо сочетаются друг с другом. Вы не можете создать экземпляр массива с параметризованным типом.
Peel<Banana>[] peels = new Pell<Banana>[10]; // 这行代码非法
В Java запрещено прямое создание универсальных массивов. Однако можно создать общий массив, создав массив со стертым типом, а затем приведя его.
public class GenericArrayDemo<T> {
static class GenericArray<T> {
private T[] array;
public GenericArray(int num) {
array = (T[]) new Object[num];
}
public void put(int index, T item) {
array[index] = item;
}
public T get(int index) { return array[index]; }
public T[] array() { return array; }
}
public static void main(String[] args) {
GenericArray<Integer> genericArray = new GenericArray<Integer>(4);
genericArray.put(0, 0);
genericArray.put(1, 1);
Object[] array = genericArray.array();
System.out.println(Arrays.deepToString(array));
}
}
// Output:
// [0, 1, null, null]
Дальнейшее чтение:woo woo .cn blog on.com/ найдет меня, о…
На мой взгляд, для понимания универсальных массивов этого достаточно. На самом деле, если вам действительно нужно хранить дженерики, лучше использовать контейнер.
Многомерные массивы
Многомерный массив можно рассматривать как массив массивов, например, двумерный массив — это специальный одномерный массив, каждый элемент которого представляет собой одномерный массив.
Java может поддерживать двумерные массивы, трехмерные массивы, четырехмерные массивы и пятимерные массивы. . .
Однако со способностью понимания нормального человека, как правило, можно максимум понять трехмерные массивы. Поэтому, пожалуйста, не делайте ничего против людей, определяя массивы со слишком большим количеством измерений.
Пример использования многомерного массива:
public class MultiArrayDemo {
public static void main(String[] args) {
Integer[][] a1 = { // 自动装箱
{1, 2, 3,},
{4, 5, 6,},
};
Double[][][] a2 = { // 自动装箱
{ {1.1, 2.2}, {3.3, 4.4} },
{ {5.5, 6.6}, {7.7, 8.8} },
{ {9.9, 1.2}, {2.3, 3.4} },
};
String[][] a3 = {
{"The", "Quick", "Sly", "Fox"},
{"Jumped", "Over"},
{"The", "Lazy", "Brown", "Dog", "and", "friend"},
};
System.out.println("a1: " + Arrays.deepToString(a1));
System.out.println("a2: " + Arrays.deepToString(a2));
System.out.println("a3: " + Arrays.deepToString(a3));
}
}
// Output:
// a1: [[1, 2, 3], [4, 5, 6]]
// a2: [[[1.1, 2.2], [3.3, 4.4]], [[5.5, 6.6], [7.7, 8.8]], [[9.9, 1.2], [2.3, 3.4]]]
// a3: [[The, Quick, Sly, Fox], [Jumped, Over], [The, Lazy, Brown, Dog, and, friend]]
Класс массивов
В Java предоставляется полезный служебный класс массивов: Arrays.
Основные операции, которые он обеспечивает:
-
sort
- Сортировать -
binarySearch
- найти -
equals
- сравнивать -
fill
- Наполнять -
asList
- список поворотов -
hash
- хэш -
toString
- Преобразование строки
Дальнейшее чтение:nuggets.capable/post/684490…