Массивы в руководстве по java: как объявлять и инициализировать массивы java
Содержание:
- Печатные элементы
- Java comparing arrays
- Processing Arrays
- Что такое массив в Java?
- Многомерные Java-массивы
- Копирование
- Бинарный поиск элемента в одномерном массиве
- Как объявить двумерный массив в Java?
- Параллельные операции над массивами
- Как создать массив в Java
- Карта массива к другому типу
- Поиск с помощью Arrays.binarySearch()
- Объекты класса
- How to Initialize Arrays in Java?
- Передача массивов в метод
- Инициализация массива
- Как инициализировать двумерный массив Java?
- Download image
Печатные элементы
Что делать, если мы хотим напечатать элементы нашего многомерного массива?
Одним из очевидных способов было бы использовать логику итераций, которую мы уже рассмотрели. Это включает в себя повторение каждого элемента в нашем многомерном массиве, который сам по себе является массивом, а затем повторение этого дочернего массива- по одному элементу за раз.
Другой вариант, который у нас есть, – это использовать java.util.Arrays.toString() вспомогательный метод:
void printElements(int[][] multiDimensionalArr) { for (int index = 0; index < multiDimensionalArr.length; index++) { System.out.println(Arrays.toString(multiDimensionalArr)); } }
И в итоге мы получаем чистый и простой код. Сгенерированный вывод консоли будет выглядеть следующим образом:
Java comparing arrays
There are two methods for comparing arrays. The method and
the method. The method
also compares references to arrays inside arrays.
com/zetcode/ComparingArrays.java
package com.zetcode; import java.util.Arrays; public class ComparingArrays { public static void main(String[] args) { int[] a = {1, 1, 2, 1, 1}; int[] b = {0, 0, 3, 0, 0}; int[][] c = { {1, 1, 2, 1, 1}, {0, 0, 3, 0, 0} }; int[][] d = { a, b }; System.out.print("equals() method: "); if (Arrays.equals(c, d)) { System.out.println("Arrays c, d are equal"); } else { System.out.println("Arrays c, d are not equal"); } System.out.print("deepEquals() method: "); if (Arrays.deepEquals(c, d)) { System.out.println("Arrays c, d are equal"); } else { System.out.println("Arrays c, d are not equal"); } } }
The example explains the difference between the two methods.
int[] a = {1, 1, 2, 1, 1}; int[] b = {0, 0, 3, 0, 0};
We have two arrays of integers.
int[][] c = { {1, 1, 2, 1, 1}, {0, 0, 3, 0, 0} };
The c array has two inner arrays. The elements of the inner arrays are equal
to the and arrays.
int[][] d = { a, b };
The d array contains references to and
arrays.
System.out.print("equals() method: "); if (Arrays.equals(c, d)) { System.out.println("Arrays c, d are equal"); } else { System.out.println("Arrays c, d are not equal"); } System.out.print("deepEquals() method: "); if (Arrays.deepEquals(c, d)) { System.out.println("Arrays c, d are equal"); } else { System.out.println("Arrays c, d are not equal"); }
Now the and arrays are compared using
both methods. For the method, the arrays are
not equal. The method goes deeper in the
referenced arrays and retrieves their elements for comparison. For this
method, the and arrays are equal.
$ java ComparingArrays.java equals() method: Arrays c, d are not equal deepEquals() method: Arrays c, d are equal
This is the example output.
Processing Arrays
When processing array elements, we often use either for loop or foreach loop because all of the elements in an array are of the same type and the size of the array is known.
Example
Here is a complete example showing how to create, initialize, and process arrays −
public class TestArray { public static void main(String[] args) { double[] myList = {1.9, 2.9, 3.4, 3.5}; // Print all the array elements for (int i = 0; i < myList.length; i++) { System.out.println(myList + " "); } // Summing all elements double total = 0; for (int i = 0; i < myList.length; i++) { total += myList; } System.out.println("Total is " + total); // Finding the largest element double max = myList; for (int i = 1; i < myList.length; i++) { if (myList > max) max = myList; } System.out.println("Max is " + max); } }
This will produce the following result −
Что такое массив в Java?
Массив (array)— это структура данных, которая предназначена для хранения однотипных данных. Представьте что Вы выстроили некоторое количество людей в шеренгу и каждому вручили в руки табличку с порядковым номером.
Когда Вам например будет нужен человек под номером 5, Вы просто позовете его по номеру. А если Вам нужно будет узнать сколько людей в шеренге — можно посмотреть на порядковый номер последнего человека в строю. Удобно не правда?
Вот примерно тоже самое и с данным объектом. Данная структура позволяет групировать определенный набор однотипных данных по ячейках и при этом у каждой ячейки есть свой порядковый номер.
Только в программировании принято начинать нумерацию не с единицы а с нуля. Первый елемент в массиве будет иметь порядковый номер . Еще в программировании говорят не «порядковый номер», а «индекс».
Допустим, Вам нужно создать 5 целочисленных переменных и задать им некоторое значение. Как Вы это будете делать? Не зная массивов, Вы скорее всего начнете писать вот так: int a = 2, b = 3, c = 5, d = 21, e = 2.
Имея в арсенале такой тип данных как массивы, Вы можете писать так: int a = {2, 3, 5, 21, 2}.
Многомерные Java-массивы
Массивы, у которых только один индекс называется одномерным, мы уже рассмотрели. Но в них можно помещать не только примитивные типы данных и ссылки на объекты, но и другие массивы. В таком случае их называют многомерными.
Давайте на примере выясним, что они из себя представляют. Предположим, нам нужен массив для хранения числа имеющихся свободных мест в кинотеатре. Вот визуальное представление того, о чем я говорю:
Структура многомерного массива в Java (здесь мы видим свободные места в кинотеатре)
Конечно в реальной жизни кинотеатр был бы больше, но этот нам как раз подойдет в качестве примера.
— означает, что место доступно, 1 — что занято. Мы также могли бы добавить еще и 2 для зарезервированных мест и так далее. Но пока ограничимся более простым примером.
Java не предоставляет никакой специальной поддержки для многомерных массивов, но мы можем легко объявить их как массив массивов. Это будет выглядеть вот так:
int [] [] cinema = новый int ;
Первое число указывает количество столбцов, второе — количество строк. Все числовые массивы в Java автоматически инициализируются нулевыми значениями после объявления. Мы только что создали таблицу, полную нулей.
Теперь давайте заполним кинозал единицами, как на картинке выше. Для создания строки из единиц используем несколько циклов . Чтобы открыть доступ к элементам 2D-массива, мы должны ввести координаты столбцов и строк:
cinema = 1; // центр for (int i = 1; i < 4; i++) { // четвертая строка cinema = 1; } for (int i = 0; i < 5; i++) { // последняя строка cinema = 1; }
Нужно иметь в виду, что если мы запросим , он будет содержать количество столбцов (длину внешнего массива, представляющего столбцы). Чтобы определить количество строк (длину внутреннего массива), необходимо запросить cinema
Обратите внимание, что для работы должен быть хотя бы один столбец
Мы будем вкладывать циклы по порядку, чтобы внешний цикл проходил по строкам, а внутренний — по столбцам текущей строки. После вывода строки в консоль мы должны разорвать ее, ведь оба цикла должны иметь разные управляющие переменные:
for (int j = 0; j < cinema.length; j++) { for (int i = 0; i < cinema.length; i++) { System.out.print(cinema); } System.out.println(); }
Результат:
00000 00000 00100 01110 11111
Иногда может быть полезно создать массив с большим количеством измерений. Например, трехмерный. Вернемся к примеру с кинотеатром. Теперь представим, что в нем несколько этажей. Схематично это будет выглядеть так:
3D-массив
Давайте создадим 3D-массив:
int [] [] [] cinemas = новый int ;
Доступ к элементам приведенного выше трехмерного массива мы можем получить, как и раньше, через индекс, но теперь нам нужно ввести три координаты:
cinemas = 1; // кинотеатр на втором этаже, третий ряд, четвертое место
В такой ситуации, если мы запросим , то получим количество этажей.
Копирование
Возможно несколькими способами.
Копирование массива путем итерации массива
Первый способ – это перебрать массив и скопировать каждое значение исходного массива в целевой массив. Вот как выглядит копирование массива с использованием этого метода:
int[] source = new int; int[] dest = new int; for(int i=0; i < source.length; i++) { source = i; } for(int i=0; i < source.length; i++) { dest = source; }
Первые два массива int созданы. Во-вторых, исходный массив инициализируется значениями от 0 до 9 (от 0 до длины массива минус 1). В-третьих, каждый элемент в исходном массиве копируется в целевой массив.
Копирование с помощью Arrays.copyOf()
Вот как выглядит копирование массива:
int[] source = new int; for(int i=0; i < source.length; i++) { source = i; } int[] dest = Arrays.copyOf(source, source.length);
Метод Arrays.copyOf() принимает 2 параметра. Первый – это массив для копирования. Второй – это длина нового массива – можно использовать для указания количества копируемых элементов из исходного массива.
Копирование с использованием Arrays.copyOfRange()
Метод Arrays.copyOfRange() копирует диапазон массива, не обязательно полный массив. Процесс копирования с ним:
int[] source = new int; for(int i=0; i < source.length; i++) { source = i; } int[] dest = Arrays.copyOfRange(source, 0, source.length);
Метод Arrays.copyOfRange() принимает 3 параметра. Первый – это массив для копирования. Второй – это первый индекс в исходном массиве, который нужно включить в копию. Третий – это последний индекс в исходном массиве, который будет включен в копию (исключено – поэтому передача 10 будет копировать до и включая индекс 9).
Бинарный поиск элемента в одномерном массиве
Бинарный поиск – алгоритм поиска элемента в отсортированном массиве. Алгоритм основывается на принципе последовательного деления массива пополам.
Формат метода
int index=Arrays.binarySearch([]a,элемент x),
х — искомое значение
Метод возвращает:
index – индекс элемента в массиве, если поиск успешный,
отрицательное число – если в массиве элемент не найден
Примечание.
Массив должен быть отсортирован! В противном случае результат будет неопределенным.
Пример.
int[] a = {7, 2, 9, 1, 0, 3, 4, 8, 5, 6}; int x=5; //сортируем массив Arrays.sort(a); int index = Arrays.binarySearch(a, x); System.out.println("Массив= " + Arrays.toString(a)); System.out.println("искомое значение = " + x); System.out.println("индекс = " + index);
Будет выведено:
Массив=
искомое значение = 5
индекс = 5
Пример.
String [] month = {"январь","февраль","март", "апрель","май","июнь", "июль","август","сентябрь", "октябрь","ноябрь","декабрь"}; String strSearch="март"; Arrays.sort(month); int index = Arrays.binarySearch(month,strSearch ); System.out.println("Массив= " + Arrays.toString(month)); System.out.println("искомое значение = " + strSearch); System.out.println("индекс = " + index);
Будет выведено:
Массив=
искомое значение = март
индекс = 6
Как объявить двумерный массив в Java?
Вместо одной скобки вы будете использовать две, например, int [] [] – двумерный целочисленный массив. Определяется это следующим образом:
int[][] multiples = new int; // 2D integer array 4 строки и 2 столбца String[][] cities = new String; // 2D String array 3 строки и 3 столбца
Кстати, когда вы изначально объявляете, вы должны помнить, что нужно указать первое измерение, например, следующее объявление является неверным:
int[][] wrong = new int[][]; // not OK, you must specify 1st dimension int[][] right = new int[];
Выражение выдаст ошибку “переменная должна предоставить либо выражения измерения, либо инициализатор массива” во время компиляции. С другой стороны, при заполнении, второе измерение является необязательным и даже если вы не укажете, компилятор не будет ругаться, как показано ниже:
String[][] myArray = new String[]; // OK String[][] yourArray = new String; // OK
Потому что двумерный массив не что иное, как массив из одномерных массивов, из-за этого, вы также можете создать двумерный, где отдельные одномерные имеет разную длину, как показано в следующем примере.
class TwoDimensionalArray { public static void main(String[] args) { String[][] salutation = { {"Mr. ", "Mrs. ", "Ms. "}, {"Kumar"} }; // Mr. Kumar System.out.println(salutation + salutation); // Mrs. Kumar System.out.println(salutation + salutation); } } The output from this program is: Mr. Kumar Mrs. Kumar
В этом примере вы можете видеть объявление двумерного массива, но его первая строка имеет 3 элемента, а вторая строка имеет только один элемент.
Вы можете получить доступ к элементам, используя оба индекса или только один индекс. Например, salutation представляет единственную строку в Java, в то время как salutation представляет одномерный.
Пока мы только что объявили и создали массив, но не инициализировали. Здесь можно увидеть значения по умолчанию для различных типов.
boolean[][] booleans = new boolean; System.out.println("booleans : " + booleans); byte[][] bytes = new byte; System.out.println("bytes : " + bytes); char[][] chars = new char; System.out.println("chars : " + (int)chars); short[][] shorts = new short; System.out.println("short : " + shorts); int[][] ints = new int; System.out.println("ints : " + ints); long[][] longs = new long; System.out.println("longs : " + longs); float[][] floats = new float; System.out.println("floats : " + floats); double[][] doubles = new double; System.out.println("doubles : " + doubles); Object[][] objects = new Object; System.out.println("objects : " + objects); Output booleans : false bytes : 0 chars : 0 short : 0 ints : 0 longs : 0 floats : 0.0 doubles : 0.0 objects : null
Массив символов немного сложнее, потому что, если вы печатаете 0 как символ, он напечатает нулевой символ, и поэтому я использовал его целочисленное значение, приведя к int.
Параллельные операции над массивами
Последнее обновление: 30.04.2018
В JDK 8 к классу Arrays было добавлено ряд методов, которые позволяют в параллельном режиме совершать обработку элементов массива.
И хотя данные методы формально не входят в Stream API, но реализуют схожую функциональность, что и параллельные потоки:
-
parallelPrefix(): вычисляет некоторое значение для элементов массива (например, сумму элементов)
-
parallelSetAll(): устанавливает элементы массива с помощью лямбда-выражения
-
parallelSort(): сортирует массив
Используем метод для установки элементов массива:
import java.util.Arrays; public class Program { public static void main(String[] args) { int[] numbers = initializeArray(6); for(int i: numbers) System.out.println(i); } public static int[] initializeArray(int size) { int[] values = new int; Arrays.parallelSetAll(values, i -> i*10); return values; } }
В метод передается два параметра: изменяемый массив и функция, которая устанавливает элементы массива. Эта
функция перебирает все элементы и в качестве параметра получает индекс текущего перебираемого элемента. Выражение означает,
что по каждому индексу в массиве будет хранится число, равное i * 10. В итоге мы получим следующий вывод:
0 10 20 30 40 50
Рассмотрим более сложный пример. Пусть у нас есть следующий класс Phone:
class Phone{ private String name; private int price; public Phone(String name, int price){ this.name=name; this.price = price; } public String getName() { return name; } public void setName(String val) { this.name=val; } public int getPrice() { return price; } public void setPrice(int val) { this.price=val; } }
Теперь произведем манипуляции с массивом объектов Phone:
Phone[] phones = new Phone[]{new Phone("iPhone 8", 54000), new Phone("Pixel 2", 45000), new Phone("Samsung Galaxy S9", 40000), new Phone("Nokia 9", 32000)}; Arrays.parallelSetAll(phones, i -> { phones.setPrice(phones.getPrice()-10000); return phones; }); for(Phone p: phones) System.out.printf("%s - %d \n", p.getName(), p.getPrice());
Теперь лямбда-выражение в методе представляет блок кода. И так как лямбда-выражение должно возвращать объект, то нам надо явным образом использовать
оператор return. В этом лямбда-выражении опять же функция получает индексы перебираемых элементов, и по этим индексам мы можем обратиться
к элементам массива и их изменить. Конкретно в данном случае происходит уменьшение цены смартфонов на 10000 единиц. В итоге мы получим следующий
консольный вывод:
iPhone 8 - 44000 Pixel 2 - 35000 Samsung Galaxy S9 - 30000 Nokia 9 - 22000
Сортировка
Отсортируем массив чисел в параллельном режиме:
int[] nums = {30, -4, 5, 29, 7, -8}; Arrays.parallelSort(nums); for(int i: nums) System.out.println(i);
Метод в качестве параметра принимает массив и сортирует его по возрастанию:
-8 -4 5 7 29 30
Если же нам надо как-то по-другому отсортировать объекты, например, по модулю числа, или у нас более сложные объекты, то мы можем создать свой компаратор и передать его в качестве второго параметра в
. Например, возьмем выше определенный класс Phone и создадим для него компаратор:
import java.util.Arrays; import java.util.Comparator; public class Program { public static void main(String[] args) { Phone[] phones = new Phone[]{new Phone("iPhone 8", 54000), new Phone("Pixel 2", 45000), new Phone("Samsung Galaxy S9", 40000), new Phone("Nokia 9", 32000)}; Arrays.parallelSort(phones,new PhoneComparator()); for(Phone p: phones) System.out.println(p.getName()); } } class PhoneComparator implements Comparator<Phone>{ public int compare(Phone a, Phone b){ return a.getName().toUpperCase().compareTo(b.getName().toUpperCase()); } }
Метод parallelPrefix
Метод походит для тех случаев, когда надо получить элемент массива или объект того же типа, что и элементы массива, который обладает некоторыми признаками.
Например, в массиве чисел это может быть максимальное, минимальное значения и т.д. Например, найдем произведение чисел:
int[] numbers = {1, 2, 3, 4, 5, 6}; Arrays.parallelPrefix(numbers, (x, y) -> x * y); for(int i: numbers) System.out.println(i);
Мы получим следующий результат:
1 2 6 24 120 720
То есть, как мы видим из консольного вывода, лямбда-выражение из , которое представляет бинарную функцию, получает два элемента и
выполняет над ними операцию. Результат операции сохраняется и передается в следующий вызов бинарной функции.
НазадВперед
Как создать массив в Java
При объявлении массива создается только ссылка на массив. Чтобы фактически создать или предоставить память массиву, надо создать массив следующим образом: общая форма new применительно к одномерным и выглядит следующим образом:
Здесь type указывает тип данных, size – количество элементов в массиве, а var-name-имя переменной массива.
Пример:
int intArray[]; //объявление intArray = new int; // выделение памяти
или
int[] intArray = new int; // объединение
Литералы массива
В ситуации, когда размер массива и переменные уже известны, можно использовать литералы.
int[] intArray = new int[]{ 1,2,3,4,5,6,7,8,9,10 }; // Declaring array literal
- Длина этого массива определяет длину созданного массива.
- Нет необходимости писать int[] в последних версиях Java
Доступ к элементам массива Java с помощью цикла for
Доступ к каждому элементу массива осуществляется через его индекс. Индекс начинается с 0 и заканчивается на (общий размер)-1. Все элементы могут быть доступны с помощью цикла for.
// accessing the elements of the specified array for (int i = 0; i < arr.length; i++) System.out.println("Element at index " + i + " : "+ arr);
// Пример для иллюстрации создания array // целых чисел, помещает некоторые значения в массив, // и выводит каждое значение.
class GFG { public static void main (String[] args) { // declares an Array of integers. int[] arr;
// allocating memory for 5 integers. arr = new int;
// initialize the first elements of the array arr = 10;
// initialize the second elements of the array arr = 20;
//so on… arr = 30; arr = 40; arr = 50;
// accessing the elements of the specified array for (int i = 0; i < arr.length; i++) System.out.println(“Element at index ” + i + ” : “+ arr); } } В итоге получаем:
Element at index 0 : 10 Element at index 1 : 20 Element at index 2 : 30 Element at index 3 : 40 Element at index 4 : 50
Карта массива к другому типу
Часто полезно применять операции на всех элементов массива, возможно, превращая их в другой тип объекта.
С этой целью, Мы постараемся создать гибкий метод помощников с использованием Generics:
public static U[] mapObjectArray( T[] array, Function function, Class targetClazz) { U[] newArray = (U[]) Array.newInstance(targetClazz, array.length); for (int i = 0; i < array.length; i++) { newArray = function.apply(array); } return newArray; },>,>
Если мы не используем Java 8 в нашем проекте, мы можем отказаться от Функциональные аргумент, и создать метод для каждого отображения, что мы должны выполнить.
Теперь мы можем повторно использовать наш общий метод для различных операций. Давайте создадим два тестовых случая, чтобы проиллюстрировать это:
@Test public void whenMapArrayMultiplyingValues_thenReturnMultipliedArray() { Integer[] multipliedExpectedArray = new Integer[] { 6, 10, 4, 10, 28, 8 }; Integer[] output = MyHelperClass.mapObjectArray(array, value -> value * 2, Integer.class); assertThat(output).containsExactly(multipliedExpectedArray); } @Test public void whenMapDividingObjectArray_thenReturnMultipliedArray() { Double[] multipliedExpectedArray = new Double[] { 1.5, 2.5, 1.0, 2.5, 7.0, 2.0 }; Double[] output = MyHelperClass.mapObjectArray(array, value -> value / 2.0, Double.class); assertThat(output).containsExactly(multipliedExpectedArray); }
Для примитивных типов, мы должны боксировать наши значения в первую очередь.
В качестве альтернативы мы можем обратиться к Потоки Java 8 для выполнения отображения для нас.
Нам нужно превратить массив в Поток Объект s в первую очередь. Мы можем сделать это с Arrays.stream метод.
Например, если мы хотим составить карту наших int значения пользовательского Струнные представительство, мы будем осуществлять это:
String[] stringArray = Arrays.stream(array) .mapToObj(value -> String.format("Value: %s", value)) .toArray(String[]::new);
Поиск с помощью Arrays.binarySearch()
Класс Arrays содержит набор методов с именем binarySearch(). Этот метод поможет вам выполнить бинарный поиск в массиве. Сначала массив должен быть отсортирован. Вы можете сделать это самостоятельно или с помощью метода Arrays.sort(), описанного ранее в этом тексте. Вот пример:
int[] ints = {0,2,4,6,8,10}; int index = Arrays.binarySearch(ints, 6); System.out.println(index);
Вторая строка этого примера ищет в массиве значение 6. Метод binarySearch() возвращает индекс в массиве, в котором был найден элемент. В приведенном выше примере метод binarySearch() вернет 3.
Если в массиве существует более одного элемента с искомым значением, нет гарантии, какой элемент будет найден.
Если элемент с данным значением не найден, будет возвращено отрицательное число. Отрицательным числом будет индекс, по которому будет вставлен искомый элемент, а затем минус один. Посмотрите на этот пример:
int[] ints = {0,2,4,6,8,10}; int index = Arrays.binarySearch(ints, 7); System.out.println(index);
Число 7 не найдено в массиве. Номер 7 должен был быть вставлен в массив по индексу 4, если 7 должен был быть вставлен в массив (и порядок сортировки сохранен). Следовательно, binarySearch() возвращает -4 – 1 = -5.
Если все элементы в массиве меньше искомого значения, то двоичная Search() вернет – длина массива – 1. Посмотрите на этот пример:
int[] ints = {0,2,4,6,8,10}; int index = Arrays.binarySearch(ints, 12); System.out.println(index);
В этом примере мы ищем 12 в массиве, но все элементы в массиве меньше 12. Поэтому binarySearch() вернет -length(-6) – 1 = -6 -1 = -7.
Метод Arrays.binarySearch() для поиска части массива. Вот как это выглядит:
int[] ints = {0,2,4,6,8,10}; int index = Arrays.binarySearch(ints, 0, 4, 2); System.out.println(index);
В этом примере выполняется поиск в массиве значения 2, но только между индексами 0 и 4 (без 4).
Эта версия binarySearch() работает так же, как и другая версия, за исключением случаев:
- Если не найдено ни одного элемента, совпадающего в пределах интервала индекса, то все равно вернется индекс того места, где должно было быть вставлено значение.
- Если все значения в интервале меньше искомого значения, вернется -toIndex -1, а не -array length – 1.
Таким образом, этот пример:
int[] ints = {0,2,4,6,8,10}; int index = Arrays.binarySearch(ints, 0, 4, 12);
вернет -5, а не -7, как в двоичном поиске (целых, 12).
Объекты класса
Каждый массив имеет связанный объект класса, совместно используемый со всеми другими массивами с тем же типом компонента.
// Java program to demonstrate // Class Objects for Arrays class Test { public static void main(String args[]) { int intArray[] = new int; byte byteArray[] = new byte; short shortsArray[] = new short; // array of Strings String[] strArray = new String; System.out.println(intArray.getClass()); System.out.println(intArray.getClass().getSuperclass()); System.out.println(byteArray.getClass()); System.out.println(shortsArray.getClass()); System.out.println(strArray.getClass()); } }
Теперь, как вы знаете, что массивы являются объектом класса. Членами массива являются следующие элементы:
- Конечная длина открытого поля, содержащего количество компонентов. Длина может быть положительной или нулевой.
- Все члены наследуются от класса Object; единственный метод объекта, который не наследуется, является метод clone.
- Открытый метод clone () переопределяет метод clone в объекте класса.
Клонирование массивов
При клонировании одномерного массива, например Object[], выполняется копия с новым массивом, содержащим копии элементов исходного, а не ссылки.
// Java program to demonstrate // cloning of one-dimensional arrays class Test { public static void main(String args[]) { int intArray[] = {1,2,3}; int cloneArray[] = intArray.clone(); // will print false as deep copy is created // for one-dimensional array System.out.println(intArray == cloneArray); for (int i = 0; i < cloneArray.length; i++) { System.out.print(cloneArray+" "); } } }
Клон многомерного массива (например, Object [] []) является копией и это означает, что он создает только один новый массив с каждым элементом и ссылкой на исходный массив элементов, но вложенные массивы являются общими.
// Java program to demonstrate // cloning of multi-dimensional arrays class Test { public static void main(String args[]) { int intArray[][] = {{1,2,3},{4,5}}; int cloneArray[][] = intArray.clone(); // will print false System.out.println(intArray == cloneArray); // will print true as shallow copy is created // i.e. sub-arrays are shared System.out.println(intArray == cloneArray); System.out.println(intArray == cloneArray); } }
Оцени статью
Оценить
Средняя оценка / 5. Количество голосов:
Видим, что вы не нашли ответ на свой вопрос.
Помогите улучшить статью.
Спасибо за ваши отзыв!
How to Initialize Arrays in Java?
In Java, we can initialize arrays during declaration. For example,
Here, we have created an array named age and initialized it with the values inside the curly brackets.
Note that we have not provided the size of the array. In this case, the Java compiler automatically specifies the size by counting the number of elements in the array (i.e. 5).
In the Java array, each memory location is associated with a number. The number is known as an array index. We can also initialize arrays in Java, using the index number. For example,
Java Arrays initialization
Note:
- Array indices always start from 0. That is, the first element of an array is at index 0.
- If the size of an array is n, then the last element of the array will be at index n-1.
Передача массивов в метод
Как и переменные, мы можем передавать массивы в методы.
// Java program to demonstrate // passing of array to method class Test { // Driver method public static void main(String args[]) { int arr[] = {3, 1, 2, 5, 4}; // passing array to method m1 sum(arr); } public static void sum(int[] arr) { // getting sum of array values int sum = 0; for (int i = 0; i < arr.length; i++) sum+=arr; System.out.println("sum of array values : " + sum); } }
На выходе получим:
sum of array values : 15
Возврат массивов из методов
Как обычно, метод также может возвращать массив. Например, ниже программа возвращает массив из метода m1.
// Java program to demonstrate // return of array from method class Test { // Driver method public static void main(String args[]) { int arr[] = m1(); for (int i = 0; i < arr.length; i++) System.out.print(arr+" "); } public static int[] m1() { // returning array return new int[]{1,2,3}; } }
Инициализация массива
Инициализация — это заполнение массива конкретными данными, а не данными по умолчанию.
Нижеследующий код позволит создать массив, включающий в себя 4 сезона года. Также мы выполним заполнение массива строками-названиями сезонов:
String[] seasons = new String4]; /* выполнили объявление и создание массива из 4 строк, где по умолчанию записано null, ведь строка — ссылочный тип данных*/ seasons = "Winter"; /* в первую ячейку записали строку Winter*/ seasons1 = "Spring"; /* во вторую ячейку (номер 1) записали строку Spring и т. д.*/ seasons2 = "Summer"; seasons3 = "Autumn";
Так мы записали названия всех сезонов. Но в принципе можно всё сделать проще, совместив инициализацию и объявление:
String[] seasons = new String[] {"Winter", "Spring", "Summer", "Autumn"};
Или даже так, опустив оператор new:
String[] seasons = {"Winter", "Spring", "Summer", "Autumn"};
Как инициализировать двумерный массив Java?
Ниже приводится пример инициализации двумерного массива Java:
int[][] a = { {1, 2, 3}, {4, 5, 6, 9}, {7}, };
Каждый компонент массива также представляет собой массив, и длина каждого ряда отличается:
Давайте напишем программу, чтобы это доказать:
class MultidimensionalArray { public static void main(String[] args) { int[][] a = { {1, 2, 3}, {4, 5, 6, 9}, {7}, }; System.out.println("Длина ряда 1: " + a.length); System.out.println("Длина ряда 2: " + a.length); System.out.println("Длина ряда 3: " + a.length); } }
При запуске этой программы мы получим:
Длина ряда 1: 3 Длина ряда 2: 4 Длина ряда 3: 1
Поскольку многомерный массив состоит из отдельных массивов (a, a and a), можно использовать метод length для определения длины каждого ряда длины двумерного массива Java.
Пример: вывод на экран всех элементов двумерного массива с помощью циклов:
class MultidimensionalArray { public static void main(String[] args) { int[][] a = { {1, -2, 3}, {-4, -5, 6, 9}, {7}, }; for (int i = 0; i < a.length; ++i) { for(int j = 0; j < a.length; ++j) { System.out.println(a); } } } }
Всегда лучше использовать цикл for…each, когда нужно пройти по элементам массива. Пример сортировки двумерного массива Java можно записать с помощью цикла for…each следующим образом:
class MultidimensionalArray { public static void main(String[] args) { int[][] a = { {1, -2, 3}, {-4, -5, 6, 9}, {7}, }; for (int[] innerArray: a) { for(int data: innerArray) { System.out.println(data); } } } }
При запуске этой программы мы получим следующий результат заполнения двумерного массива Java:
1 -2 3 -4 -5 6 9 7
Как инициализировать многомерный массив Java?
Многомерный или трёхмерный массив инициализируется почти так же, как двухмерный:
// test — трёхмерный массив int[][][] test = { { {1, -2, 3}, {2, 3, 4} }, { {-4, -5, 6, 9}, {1}, {2, 3} } };
Трёхмерный массив — это массив, состоящий из двумерных массивов. Как и у двумерных массивов Java, его ряды могут быть различной длины.
Пример: программа для вывода элементов трёхмерного массива с помощью циклов:
class ThreeArray { public static void main(String[] args) { // test – трёхмерный массив int[][][] test = { { {1, -2, 3}, {2, 3, 4} }, { {-4, -5, 6, 9}, {1}, {2, 3} } }; // цикл for..each проходит по элементам трёхмерного массива for (int[][] array2D: test) { for (int[] array1D: array2D) { for(int item: array1D) { System.out.println(item); } } } } }
При запуске программы вывода двумерного массива Java получаем следующий результат:
1 -2 3 2 3 4 -4 -5 6 9 1 2 3
Пожалуйста, опубликуйте ваши комментарии по текущей теме статьи. За комментарии, отклики, дизлайки, лайки, подписки огромное вам спасибо!
МКМихаил Кузнецовавтор-переводчик статьи «Java Multidimensional Arrays»
Download image
In the next example, we show how to download an image.
com/zetcode/DownloadImage.java
package com.zetcode; import java.io.FileOutputStream; import java.io.IOException; import java.net.URL; public class DownloadImage { public static void main(String[] args) throws IOException { var imageUrl = "http://webcode.me/favicon.ico"; var destinationFile = "favicon.ico"; var url = new URL(imageUrl); try (var is = url.openStream(); var fos = new FileOutputStream(destinationFile)) { byte[] buf = new byte; int noOfBytes; while ((noOfBytes = is.read(buf)) != -1) { fos.write(buf, 0, noOfBytes); } } } }
The example downloads a small image.
byte[] buf = new byte;
An image is an array of bytes. We create an empty array of
values big enough to hold the icon.
while ((noOfBytes = is.read(buf)) != -1) { fos.write(buf, 0, noOfBytes); }
We read the binary data and write it to the file.
In this part of the Java tutorial, we worked with arrays. We have described how
to initialize arrays, access array elements, traverse arrays, work with
multidimensional arrays, compare arrays and search for array elements.
Contents
Previous
Next