Массивы
Массивы в Java — это структура данных, которая хранит упорядоченные коллекции фиксированного размера элементов нужного типа. В Java массив используется для хранения коллекции данных, но часто бывает полезно думать о массиве как о совокупности переменных одного типа.
Вместо объявления отдельных переменных, таких как number0, number1, . и number99, Вы объявляете одну переменную массива, например, numbers и используете numbers[0], numbers[1], . и numbers[99], для отображения отдельных переменных.
Данная статья ознакомит Вас как в Java объявить массив переменных, создать и обрабатывать массив с помощью индексированных переменных.
Объявление массива
Чтобы использовать массив в программе, необходимо объявить переменную для ссылки на массив, и Вы должны указать тип массива, который может ссылаться на переменную. Синтаксис для объявления переменной массива:
Примечание: стиль dataType[] arrayRefVar является предпочтительным. Стиль dataType arrayRefVar[] происходит из языка C/C++ и был принят в Java для C/C++-программистов.
Пример
Следующие фрагменты кода примеры использования данного синтаксиса:
Создание массива
В Java создать массив можно с помощью оператора new с помощью следующего синтаксиса:
Вышеуказанное объявление делает две вещи:
- Создает массив, используя new dataType[arraySize];
- Ссылка на недавно созданный массив присваивается переменной arrayRefVar.
Объявление переменной, создание и присвоение переменной ссылки массива могут быть объединены в одном операторе, как показано ниже:
В качестве альтернативы массивы в Java можно создавать следующим образом:
Элементы массива доступны через индекс. Отсчет индексов ведется от 0; то есть они начинают от 0 и до arrayRefVar.length-1.
Пример
Следующий оператор объявляет массив переменных myList, создает массив из 10 элементов типа double и присваивает ссылку myList:
Изображение отображает массив myList. Здесь myList имеет десять значений double и индексы от 0 до 9.
Работа с массивами
При работе с элементами массива, часто используют цикл for или цикл foreach потому, что все элементы имеют одинаковый тип и известный размер.
Пример
Полный пример, показывающий, как создавать, инициализировать и обработать массив:
Получим следующий результат:
Цикл foreach
JDK 1.5 представила новый цикл for, известный как цикл foreach или расширенный цикл for, который позволяет последовательно пройти весь массив без использования индекса переменной.
Пример
Следующий код отображает все элементы в массиве myList:
Получим следующий результат:
Передача массива в метод
Также как можно передать значение примитивного типа в метод, можно также передать массив в метод. Например, следующий метод отображает элементы в int массиве:
Его можно вызвать путем передачи массива. Например, следующий оператор вызывает метод printArray для отображения 3, 1, 2, 6, 4 и 2:
Возврат массива из метода
Метод может также возвращать массив. Например, метод, показанный ниже, возвращает массив, который является реверсирование другого массива:
Методы для массива
Класс java.util.Arrays содержит различные статические методы для поиска, сортировки, сравнения и заполнения элементов массива. Методы перегружаются для всех примитивных типов.
| № | Описание |
| 1 | public static int binarySearch(Object[] a, Object key) Ищет заданный массив объектов (byte, int, double, и т.д.) для указанного значения, используя алгоритм двоичного поиска. Массив должен быть отсортирован до выполнения этого вызова. Это возвращает индекс ключа поиска, если он содержится в списке; в противном случае (-(точка вставки + 1). |
| 2 | public static boolean equals(long[] a, long[] a2) Возвращает значение true, если два указанных массивах равны друг другу. Два массива считаются равными, если оба массива содержат одинаковое количество элементов, и все соответствующие пары элементов в двух массивах равны. Такой же метод может быть использован всеми другими примитивными типами данных (byte, short, int и т.д.). |
| 3 | public static void fill(int[] a, int val) Присваивает определенное значение int к каждому элементу указанного целочисленного массива. Такой же метод может быть использован всеми другими примитивными типами данных (byte, short, int и т.д.). |
| 4 | public static void sort(Object[] a) Этот метод сортировки сортирует указанный массив объектов в порядке возрастания, в соответствии с естественным порядком его элементов. Такой же метод может быть использован всеми другими примитивными типами данных (byte, short, int и т.д.). |
Пример 1: создание, объявление переменных, определение (выделение памяти) и инициализация массива
В качестве примера возьмем тип данных int. Вы же можете использовать любой другой тип данных.
Пример 2: длина массива
Узнать размер массива в Java можно с помощью метода length(). Данный метод позволяет определить размерность массива.
Получим следующий результат:
Пример 3: максимальный элемент массива
Простые способы для того, чтобы найти максимальное число в массиве в Java. Сперва воспользуемся методом Math.max().
Получим следующий результат:
Ещё один пример нахождения максимального числа в массиве в Java. Здесь мы не будем использовать какие-либо методы.
Получим следующий результат:
Пример 4: минимальный элемент массива
Написанный ниже код практически ничем не отличается от кода, описанного в примере 3. Он в точности наоборот, просто здесь мы ищем минимальное число в массиве в Java. В первом способе воспользуемся методом Math.min().
Получим следующий результат:
Ещё один пример нахождения максимального числа в массиве в Java. Здесь мы не будем использовать какие-либо методы.
Получим следующий результат:
Пример 5: сумма массива
В этом примере рассмотрим как получить сумму элементов массива в Java.
Получим следующий результат:
А в этом примере используем улучшенный цикл for, чтобы найти сумму массива.
Получим следующий результат:
Пример 6: вывод массива
В данном примере рассмотрим как вывести массив на экран в Java.
Получим следующий результат:
Пример 7: вывод четных и нечетных элементов массива
В примере показано как вывести четные и нечетных элементы массива в Java.
Получим следующий результат:
Пример 8: вывод элементов массива с четным и нечетным индексом
В примере показано как вывести на экран элементы массива с четным и нечетным индексом.
Arrays
An array is a container object that holds a fixed number of values of a single type. The length of an array is established when the array is created. After creation, its length is fixed. You have seen an example of arrays already, in the main method of the "Hello World!" application. This section discusses arrays in greater detail.
An array of 10 elements.
Each item in an array is called an element, and each element is accessed by its numerical index. As shown in the preceding illustration, numbering begins with 0. The 9th element, for example, would therefore be accessed at index 8.
The following program, ArrayDemo , creates an array of integers, puts some values in the array, and prints each value to standard output.
The output from this program is:
In a real-world programming situation, you would probably use one of the supported looping constructs to iterate through each element of the array, rather than write each line individually as in the preceding example. However, the example clearly illustrates the array syntax. You will learn about the various looping constructs ( for , while , and do-while ) in the Control Flow section.
Declaring a Variable to Refer to an Array
The preceding program declares an array (named anArray ) with the following line of code:
Like declarations for variables of other types, an array declaration has two components: the array's type and the array's name. An array's type is written as type[] , where type is the data type of the contained elements; the brackets are special symbols indicating that this variable holds an array. The size of the array is not part of its type (which is why the brackets are empty). An array's name can be anything you want, provided that it follows the rules and conventions as previously discussed in the naming section. As with variables of other types, the declaration does not actually create an array; it simply tells the compiler that this variable will hold an array of the specified type.
Similarly, you can declare arrays of other types:
You can also place the brackets after the array's name:
However, convention discourages this form; the brackets identify the array type and should appear with the type designation.
Creating, Initializing, and Accessing an Array
One way to create an array is with the new operator. The next statement in the ArrayDemo program allocates an array with enough memory for 10 integer elements and assigns the array to the anArray variable.
If this statement is missing, then the compiler prints an error like the following, and compilation fails:
The next few lines assign values to each element of the array:
Each array element is accessed by its numerical index:
Alternatively, you can use the shortcut syntax to create and initialize an array:
Here the length of the array is determined by the number of values provided between braces and separated by commas.
You can also declare an array of arrays (also known as a multidimensional array) by using two or more sets of brackets, such as String[][] names . Each element, therefore, must be accessed by a corresponding number of index values.
In the Java programming language, a multidimensional array is an array whose components are themselves arrays. This is unlike arrays in C or Fortran. A consequence of this is that the rows are allowed to vary in length, as shown in the following MultiDimArrayDemo program:
The output from this program is:
Finally, you can use the built-in length property to determine the size of any array. The following code prints the array's size to standard output:
Copying Arrays
The System class has an arraycopy method that you can use to efficiently copy data from one array into another:
The two Object arguments specify the array to copy from and the array to copy to. The three int arguments specify the starting position in the source array, the starting position in the destination array, and the number of array elements to copy.
The following program, ArrayCopyDemo , declares an array of String elements. It uses the System.arraycopy method to copy a subsequence of array components into a second array:
The output from this program is:
Array Manipulations
Arrays are a powerful and useful concept used in programming. Java SE provides methods to perform some of the most common manipulations related to arrays. For instance, the ArrayCopyDemo example uses the arraycopy method of the System class instead of manually iterating through the elements of the source array and placing each one into the destination array. This is performed behind the scenes, enabling the developer to use just one line of code to call the method.
For your convenience, Java SE provides several methods for performing array manipulations (common tasks, such as copying, sorting and searching arrays) in the java.util.Arrays class. For instance, the previous example can be modified to use the copyOfRange method of the java.util.Arrays class, as you can see in the ArrayCopyOfDemo example. The difference is that using the copyOfRange method does not require you to create the destination array before calling the method, because the destination array is returned by the method:
As you can see, the output from this program is the same, although it requires fewer lines of code. Note that the second parameter of the copyOfRange method is the initial index of the range to be copied, inclusively, while the third parameter is the final index of the range to be copied, exclusively. In this example, the range to be copied does not include the array element at index 9 (which contains the string Lungo ).
Some other useful operations provided by methods in the java.util.Arrays class are:
Searching an array for a specific value to get the index at which it is placed (the binarySearch method).
Comparing two arrays to determine if they are equal or not (the equals method).
Filling an array to place a specific value at each index (the fill method).
Sorting an array into ascending order. This can be done either sequentially, using the sort method, or concurrently, using the parallelSort method introduced in Java SE 8. Parallel sorting of large arrays on multiprocessor systems is faster than sequential array sorting.
Creating a stream that uses an array as its source (the stream method). For example, the following statement prints the contents of the copyTo array in the same way as in the previous example:
See Aggregate Operations for more information about streams.
Converting an array to a string. The toString method converts each element of the array to a string, separates them with commas, then surrounds them with brackets. For example, the following statement converts the copyTo array to a string and prints it:
Массивы в Java

Массив — это структура данных, в которой хранятся элементы одного типа. Его можно представить, как набор пронумерованных ячеек, в каждую из которых можно поместить какие-то данные (один элемент данных в одну ячейку). Доступ к конкретной ячейке осуществляется через её номер. Номер элемента в массиве также называют индексом . В случае с Java массив однороден, то есть во всех его ячейках будут храниться элементы одного типа. Так, массив целых чисел содержит только целые числа (например, типа int ), массив строк — только строки, массив из элементов созданного нами класса Dog будет содержать только объекты Dog . То есть в Java мы не можем поместить в первую ячейку массива целое число, во вторую String , а в третью — “собаку”.
Объявление массива
Как объявить массив?
| № | Объявление массива, Java-синтаксис | Примеры | Комментарий |
|---|---|---|---|
| 1. | Желательно объявлять массив именно таким способом, это Java-стиль | ||
| 2. | Унаследованный от С/С++ способ объявления массивов, который работает и в Java |
Создание массива
Как создать массив?
Больше информации о массивах есть в статье “Кое-что о массивах”
Длина массива в Java

Как мы уже говорили выше, длина массива — это количество элементов, под которое рассчитан массив. Длину массива нельзя изменить после его создания. Обратите внимание: в Java элементы массива нумеруются с нуля. То есть, если у нас есть массив на 10 элементов, то первый элемент массива будет иметь индекс 0, а последний — 9. Получить доступ к длине массива можно с помощью переменной length . Пример: Вывод программы:
Инициализация массива и доступ к его элементам
Как вывести массив в Java на экран?
Одномерные и многомерные Java массивы

А что, если мы захотим создать не массив чисел, массив строк или массив каких-то объектов, а массив массивов? Java позволяет это сделать. Уже привычный нам массив int[] myArray = new int[8] — так называемый одномерный массив. А массив массивов называется двумерным. Он похож на таблицу, у которой есть номер строки и номер столбца. Или, если вы учили начала линейной алгебры, — на матрицу. Для чего нужны такие массивы? В частности, для программирования тех же матриц и таблиц, а также объектов, напоминающих их по структуре. Например, игровое поле для шахмат можно задать массивом 8х8. Многомерный массив объявляется и создается следующим образом: В этом массиве ровно 64 элемента: myTwoDimentionalArray[0][0] , myTwoDimentionalArray[0][1] , myTwoDimentionalArray[1][0] , myTwoDimentionalArray[1][1] и так далее вплоть до myTwoDimentionalArray[7][7] . Так что если мы с его помощью представим шахматную доску, то клетку А1 будет представлять myTwoDimentionalArray[0][0] , а E2 — myTwoDimentionalArray[4][1] . Где два, там и три. В Java можно задать массив массивов… массив массивов массивов и так далее. Правда, трёхмерные и более массивы используются очень редко. Тем не менее, с помощью трёхмерного массива можно запрограммировать, например, кубик Рубика.
Что еще почитать
Полезные методы для работы с массивами
Статьи на поиск и сортировку:
Сортировка и поиск в курсе CS50:
Сортировка массива
Поиск в массиве нужного элемента
Преобразование массива к строке
Пример на sort, binarySearch и toString
Больше о методах класса Array
Класс Arrays и его использование — в статье описаны некоторые методы класса Array
Главное о массивах
Главные характеристики массива: тип помещённых в него данных, имя и длина.
Последнее решается при инициализации (выделении памяти под массив), первые два параметра определяются при объявлении массива.
Размер массива (количество ячеек) нужно определять в int
Изменить длину массива после его создания нельзя.
Доступ к элементу массива можно получить по его индексу.
В массивах, как и везде в Java, элементы нумеруются с нуля.
После процедуры создания массива он наполнен значениями по умолчанию.
Массивы в языке Java устроены не так, как в C++. Они почти совпадают с указателями на динамические массивы.
Полезные материалы о массивах
Кое-что о массивах — хорошая подробная статья о массивах
Класс Arrays и его использование — в статье описаны некоторые методы класса Array
Многомерные массивы — подробная статья о многомерных массивах с примерами.
Возвращайте массив нулевой длины, а не null — автор “Эффекктивного программирования” Джошуа Блох рассказывает о том, как лучше возвращать пустые массивы
Rukovodstvo
статьи и идеи для разработчиков программного обеспечения и веб-разработчиков.
Как напечатать массив на Java
Введение Печать массива — это быстрый способ дать нам представление о значениях содержимого внутри. Иногда значения массива являются желаемым результатом работы программы. В этой статье мы рассмотрим, как распечатать массив в Java четырьмя различными способами. Хотя «лучший способ» зависит от того, что нужно делать вашей программе, мы начнем с простейшего метода печати, а затем покажем более подробные способы сделать это. * Распечатать массив с помощью Arrays.toString () и Arrays.deepToString () * Печать
Время чтения: 8 мин.
Вступление
Печать массива — это быстрый способ дать нам представление о значениях содержимого внутри. Иногда значения массива являются желаемым результатом работы программы.
В этой статье мы рассмотрим, как распечатать массив в Java четырьмя различными способами.
Хотя «лучший способ» зависит от того, что нужно делать вашей программе, мы начнем с простейшего метода печати, а затем покажем более подробные способы сделать это.
- Распечатайте массив с помощью Arrays.toString () и Arrays.deepToString ()
- Печать массива с использованием потоков Java 8
- Распечатать массив путем преобразования в список
- Распечатать массив с помощью циклов For
- Преобразование в список и использование итератора
Распечатайте массив с помощью Arrays.toString () и Arrays.deepToString ()
Встроенный toString() — чрезвычайно простой способ распечатать отформатированные версии объектов в Java.
Каждый тип данных в Java считается классом, и по умолчанию каждый класс наследуется от java.lang.Object , корня иерархии классов Java. Вот почему в каждом классе есть метод toString() Однако массивы не переопределяют метод toString() для правильного форматирования вывода, а просто возвращает унаследованное значение, которое является хешем объекта.
Мы печатаем массивы с помощью toString() из класса в java.util.Arrays .
Возьмем этот пример, в котором мы печатаем значения массива целых чисел:
Приведенный выше код выведет следующее:
Обратите внимание, как все элементы разделены запятыми и заключены в квадратные скобки. Этот метод похож на визуальное представление массива.
Мы также можем использовать этот метод для печати массивов разных типов:
Это соответственно приводит к:
Метод toString() эффективен только для одномерных массивов. Когда у нас есть вложенные массивы, нам нужно использовать метод deepToString() :
Если вам нужно с первого взгляда deepToString() что находится в вашем массиве, лучше всего подойдут методы toString() и deepToString ().
Однако эти методы не позволяют форматировать вывод. Этот подход в основном является обходным решением того факта, что массивы по умолчанию toString()
Если вы предпочитаете некоторую гибкость форматирования, вы можете рассмотреть возможность использования Java 8 Streams .
Печать массива с использованием потоков Java 8
Один из вариантов печати массива — преобразовать его в поток объектов, а затем распечатать каждый элемент в потоке. У нас есть несколько вариантов использования потоков для печати нашего массива.
Например, мы можем напечатать наш массив построчно, вот так:
В этом случае мы используем статический метод stream() Arrays для создания последовательного потока наших данных. Для каждого элемента в нашем потоке мы вызываем на нем println() , заставляя его построчно отображаться следующим образом:
Примечание. Мы println() следующим образом: System.out::println . :: в Java — это оператор ссылки на метод. Функция forEach() может использовать лямбда-функцию или ссылку на метод.
В качестве альтернативы мы можем использовать класс Stream java.util.stream.Stream для аналогичного вызова функции println() в потоке данных нашего массива. Мы можем создать Stream из этих данных с помощью Stream.of() :
С помощью этого кода мы получим тот же результат:
Давайте попробуем это и с вложенными массивами, добавив даты выпуска начальных версий этих языков:
Вывод для каждой печати через потоки будет выглядеть примерно так:
Это не очень хорошо работает . Мы снова вызываем println() для объектов массива. Нам придется снова передать эти объекты в поток и распечатать их элементы.
Чтобы распечатать вложенные массивы, мы можем использовать лямбда-выражение в функции forEach() которое может перейти на второй уровень, создав другой поток каждого уровня и распечатав записи таким образом:
Эта лямбда-функция печатает элементы в каждом вложенном массиве. При компиляции и выполнении мы получим такой вывод:
Потоки упрощают работу с коллекциями. Но Java гибка и предоставляет еще больше возможностей. Традиционный цикл for по-прежнему многое делает для нас. Давайте посмотрим на печать массива с циклами.
Распечатать массив путем преобразования в список
Вы можете легко преобразовать массив Java в реализацию List Есть разные способы сделать это, и мы подробно рассмотрели каждый в нашей статье « Как преобразовать массив Java в ArrayList».
Короче говоря, вызов toString() или просто распечатка (которая неявно вызывает toString() ) в List распечатает содержимое:
Кроме того, вы можете использовать .forEach() изначально для любой Collection , которой является List . Итак, вы можете просто пойти дальше и сделать это:
Хотя это не очень хорошо отформатированный вариант:
Вы можете отказаться от ссылки на метод и просто использовать лямбда для большего контроля:
Распечатать массив с помощью циклов For
Более известный подход к печати массива в Java — использование цикла for С помощью for мы получаем индекс элемента, и мы можем использовать индекс для получения элемента массива.
Мы настраиваем for с переменной, обычно называемой i , в качестве счетчика, начиная с элемента 0 . Затем следует условие, которое сравнивает i с количеством элементов в массиве.
Примечание . Число элементов в массиве, которые будут использоваться в условии цикла, никогда не следует жестко задавать. Java предоставляет атрибут с именем length который позволяет программисту динамически вычислять количество элементов в массиве.
И последнее, но не менее важное: for принимает инкрементное значение, в нашем случае мы будем использовать i++ чтобы увеличивать счетчик на один элемент в каждой итерации.
Как только наш цикл настроен и готов, мы просто воспользуемся System.out.println() для отображения каждого элемента в массиве, используя обозначение прямоугольных скобок [i] принимая в качестве входных данных наш счетчик i .
Вот пример, в котором мы печатаем все элементы целочисленного массива построчно:
Выполнение этого кода выведет на консоль следующее:
Больше не нужно использовать циклы for Они довольно гибкие и концептуально простые. Например, если у вас были вложенные массивы, вы будете использовать вложенные циклы for
Наконец, давайте взглянем на итераторы и списки.
Преобразование в список и использование итератора
Объект итератора Java позволяет нам отображать каждый элемент нашего массива без необходимости использовать индексный подход, который мы рассмотрели в разделе цикла for
Чтобы использовать итераторы, мы должны изменить тип данных массива на List . Мы можем сделать это с помощью Array.asList() и сохранить возвращаемые значения списка в новой переменной. Метод asList() принимает массив и превращает его в реализацию List
Затем вам понадобится объект-итератор для настройки итератора массива. Итератор похож на указатель, указывающий на каждый элемент массива. Итератор помогает вам исследовать каждый элемент в индивидуальном порядке.
Чтобы создать объект-итератор, мы будем использовать метод iterator() нашего List . После того, как наш объект итератора был создан мы используем while цикл , как это предлагает более компактный способ печати каждого элемент возвращения итератора.
В while условие цикла будет содержать призыв к hasNext() метод нашего итератора. Внутри в while цикла, мы выводим каждый элемент с помощью вызова System.out.println() . Мы получаем элементы из итератора, вызывая метод next() . В while цикл будет держать итерации над каждым элементом , пока мы не проходится наш массив (по List ).
Вот пример, в котором мы берем массив целых чисел и печатаем каждый элемент построчно с помощью итератора:
По сравнению с циклами for этот метод предпочитают разработчики, которые предпочитают не иметь дело с индексами массивов. Вам гарантирован следующий элемент с помощью next() . Итераторы мощны, потому что мы используем этот же поток для любого типа List такого как ArrayList или LinkedList , а также для других коллекций, таких как Map или Set !
Заключение
В этой статье мы рассмотрели основные методы, используемые для печати массива в Java. Мы начали с использования встроенных методов Java toString() и deepToString() .
Оттуда мы использовали потоки, чтобы мы могли быстро печатать элементы массива построчно. Мы также рассмотрели, как преобразовать массив в список, который вы можете либо просто вызвать, либо использовать Java 8 Stream API для более детального контроля.
Затем мы использовали традиционную for для печати каждого элемента по отдельности.
И последнее , но не в последнюю очередь, мы использовали объект итератора для печати каждый элемент по отдельности с помощью next() метод внутри в while цикла. Подходы, описанные в этой главе, могут использоваться в зависимости от варианта использования и проблемы, которую вы пытаетесь решить.