JavaRush /Java блог /Random UA /Масиви в Java

Масиви в Java

Стаття з групи Random UA
Уявіть осередки в камері зберігання. Кожна має свій номер і в кожній зберігається якийсь об'єкт “Багаж”. Або винна карта, де всі види вина пронумеровані і коли ви робите замовлення, вам достатньо назвати номер напою. Або список студентів групи, в якому в першому осередку буде записано студента “Андрєєва”, а в останньому – “Яковлєва”. Або список пасажирів літака, за кожним із яких закріплено місце з певним номером. У Java, щоб працювати з подібними структурами, тобто безліччю однорідних даних, часто використовують масиви в Java.

Що таке масив?

Масив – це структура даних, у якій зберігаються елементи одного типу. Його можна уявити, як набір пронумерованих осередків, у кожну з яких можна помістити якісь дані (один елемент даних в одну комірку). Доступ до конкретного осередку здійснюється через її номер. Номер елемента в масиві також називають індексом . У випадку з Java масив однорідний, тобто у всіх його осередках зберігатимуться елементи одного типу. Так, масив цілих чисел містить лише цілі числа (наприклад, типу int ), масив рядків — лише рядки, масив із елементів створеного нами класу Dog міститиме лише об'єкти Dog . Тобто в Java ми не можемо помістити в перший осередок масиву ціле число, в другу String, а третю - "собаку". Масиви в Java

Оголошення масиву

Як оголосити масив?

Як і будь-яку змінну, масив Java потрібно оголосити. Зробити це можна одним із двох способів. Вони рівноправні, але перший їх краще відповідає стилю Java. Друга ж — спадщина мови Сі (багато Сі-програмістів переходабо на Java, і для їх зручності був залишений і альтернативний спосіб). У таблиці наведено обидва способи оголошення масиву Java:
Оголошення масиву, Java-синтаксис Приклади Коментар
1.
dataType[] arrayName;
int[] myArray;

Object[]
arrayOfObjects;
Бажано оголошувати масив саме таким способом, це Java-стиль
2.
dataType arrayName[];
int myArray[];

Object
arrayOfObjects[];
Успадкований від С/С++ спосіб оголошення масивів, який працює і Java
В обох випадках dataType - тип змінних у масиві. У прикладах ми оголосабо два масиви. В одному зберігатимуться цілі числа типу int , в іншому — об'єкти типу Object . Таким чином, при оголошенні масиву у нього з'являється ім'я і тип (тип змінних масиву). arrayName - це ім'я масиву.

Створення масиву

Як створити масив?

Як і будь-який інший об'єкт створити масив Java, тобто зарезервувати під нього місце в пам'яті, можна за допомогою оператора new . Робиться це так:
new typeOfArray [length];
Де typeOfArray — це тип масиву, а length — його довжина (тобто, кількість осередків), що у цілих числах ( int ). Однак тут ми тільки виділабо пам'ять під масив, але не пов'язали створений масив ні з якою оголошеною змінною. Зазвичай масив спочатку оголошують, а потім створюють, наприклад:
int[] myArray; // оголошення масиву
myArray = new int[10]; // Створення, тобто, виділення пам'яті для масиву на 10 елементів типу int
Тут ми оголосабо масив цілих чисел на ім'я myArray , а потім повідомабо, що він складається з 10 осередків (у кожному з яких зберігатиметься якесь ціле число). Однак набагато частіше масив створюють відразу після оголошення за допомогою такого скороченого синтаксису:
int[] myArray = new int[10]; // оголошення та виділення пам'яті "в одному флаконі"
Зверніть увагу:Після створення масиву за допомогою new , у його осередках записані значення за замовчуванням. Для чисельних типів (як і прикладі) це буде 0, для booleanfalse , для посилальних типів — null . Таким чином після операції
int[] myArray = new int[10];
ми отримуємо масив із десяти цілих чисел, і, поки це не зміниться в ході програми, у кожному осередку записано 0.

Більше інформації про масиви є у статті " Дещо про масиви "

Довжина масиву в Java

Як ми вже говорабо вище, довжина масиву - це кількість елементів, під яку розрахований масив. Довжину масиву не можна змінити після створення. Зверніть увагу:Java елементи масиву нумеруються з нуля. Тобто, якщо ми маємо масив на 10 елементів, то перший елемент масиву матиме індекс 0, а останній — 9. Масиви в Java - 3Отримати доступ до довжини масиву можна за допомогою змінної length . Приклад:
int[] myArray = new int[10]; // створабо масив цілих чисел на 10 елементів і надали йому ім'я myArray
System.out.println(myArray.length); // вивели в консоль довжину масиву, тобто кількість елементів, які ми можемо помістити в масив
Висновок програми:
10

Ініціалізація масиву та доступ до його елементів

Як створити масив Java вже зрозуміло. Після цієї процедури отримуємо не порожній масив, а масив, заповнений значеннями за замовчуванням. Наприклад, у випадку int це будуть 0, а якщо у нас масив з даними типу посилання, то за замовчуванням у кожному осередку записані null . Отримуємо доступ до елемента масиву (тобто записуємо в нього значення або виводимо його на екран або проробляємо з ним якусь операцію) ми за його індексом. Ініціалізація масиву - це заповнення його конкретними даними (не за замовчуванням). Приклад: давайте створимо масив із 4 сезонів та заповнимо його рядковими значеннями – назвами цих сезонів.
String[] seasons  = new String[4]; /* оголосабо та створабо масив. Java виділила пам'ять під масив із 4 рядків, і зараз у кожному осередку записано значення null (оскільки рядок — тип посилання)*/

seasons[0] = "Winter"; /* в першу комірку, тобто в комірку з нульовим номером ми записали рядок Winter. Тут ми отримуємо доступ до нульового елементу масиву та записуємо туди конкретне значення */
seasons[1] = "Spring"; // Проробляємо ту ж процедуру з осередком номер 1 (другий)
seasons[2] = "Summer"; // ...номер 2
seasons[3] = "Autumn"; // та з останньої, номер 3
Тепер у всіх чотирьох осередках нашого масиву записані назви сезонів. Ініціалізацію також можна провести по-іншому, поєднавши з ініціалізацією та оголошенням:
String[] seasons  = new String[] {"Winter", "Spring", "Summer", "Autumn"};
Більше того, оператор new можна опустити:
String[] seasons  = {"Winter", "Spring", "Summer", "Autumn"};

Як вивести масив Java на екран?

Вивести елементи масиву на екран (тобто в консоль) можна, наприклад, за допомогою циклу for . Ще один, більш короткий спосіб виведення масиву на екран буде розглянутий у пункті "Корисні методи для роботи з масивами", нижче. А поки розглянемо приклад із циклічним висновком масиву:
String[] seasons  = new String[] {"Winter", "Spring", "Summer", "Autumn"};
for (int i = 0; i < 4; i++) {
System.out.println(seasons[i]);
}
В результаті програма виведе наступний результат:
Winter Spring Summer Autumn

Одномірні та багатовимірні Java масиви

А якщо ми захочемо створити не масив чисел, масив рядків чи масив якихось об'єктів, а масив масивів? Java дозволяє це зробити. Вже звичний масив int[] myArray = new int[8] — так званий одновимірний масив. А масив масивів називається двовимірним. Він схожий на таблицю, яка має номер рядка і номер стовпця. Або, якщо ви вчабо початки лінійної алгебри, — на матрицю. Масиви в Java - 4Навіщо потрібні такі масиви? Зокрема, для програмування тих самих матриць та таблиць, а також об'єктів, що нагадують їх за структурою. Наприклад, ігрове поле для шахів можна задати масивом 8х8. Багатовимірний масив оголошується і створюється так:
Int[][] myTwoDimentionalArray = new int [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 можна задати масив масивів масивів масивів і так далі. Щоправда, тривимірні і масивні використовуються дуже рідко. Проте за допомогою тривимірного масиву можна запрограмувати, наприклад, кубик Рубіка.

Що ще почитати

Багатовимірні масиви

Корисні методи для роботи з масивами

Для роботи з масивами Java є клас java.util.Arrays (arrays англійською і означає "масиви"). У цілому з масивами найчастіше роблять такі операції: заповнення елементами (ініціалізація), вилучення елемента (за номером), сортування та пошук. Пошук та сортування масивів – тема окрема. З одного боку дуже корисно потренуватися та написати кілька алгоритмів пошуку та сортування самостійно. З іншого боку, всі найкращі способи вже написані та включені до бібліотек Java, і ними можна законно користуватися. Ось три корисні методи цього класу

Сортування масиву

Метод void sort(int[] myArray, int fromIndex, int toIndex)сортує масив цілих чисел чи його підмасив за зростанням.

Пошук у масиві потрібного елемента

int binarySearch(int[] myArray, int fromIndex, int toIndex, int key). Цей метод шукає елемент key у вже відсортованому масиві myArray або підмасиві, починаючи зIndex і доIndex . Якщо елемент знайдено, метод повертає його індекс, якщо ні - (-fromIndex)-1.

Перетворення масиву до рядка

Метод String toString(int[] myArray)перетворює масив до рядка. Справа в тому, що Java масиви не перевизначають toString() . Це означає, що якщо ви спробуєте вивести цілий масив (а не за елементами, як у пункті “ Виведення масиву на екран ”) на екран безпосередньо ( System.out.println(myArray)), ви отримаєте ім'я класу та шістнадцятковий хеш-код масиву (це визначено Object.toString() ). Якщо ви новачок, вам, можливо, незрозуміле пояснення до методу toString. На першому етапі це й не потрібно, натомість за допомогою цього методу спрощується виведення масиву. Java дозволяє легко виводити масив на екран без використання циклу. Про це у прикладі нижче.

Приклад на sort, binarySearch і toString

Давайте створимо масив цілих чисел, виведемо його на екран за допомогою toString , відсортуємо за допомогою методу sort і знайдемо в ньому якесь число.
class Main {
    public static void main(String[] args) {
        int[] array = {1, 5, 4, 3, 7}; //оголошуємо та ініціалізуємо масив
        System.out.println(array);//намагаємося вивести наш масив на екран без методу toString - отримуємо 16-річне число
        System.out.println(Arrays.toString(array));//печатаем массив "правильно"
        Arrays.sort(array, 0, 4); //сортуємо весь масив від нульового до четвертого члена
        System.out.println(Arrays.toString(array));//Виводимо відсортований масив на екран
        int key = Arrays.binarySearch(array, 5); // ищем key - число 5 в отсортированном массиве.
        //метод binarySearch видасть індекс елемента остортованого масиву, в якому "заховано" число, яке шукає
        System.out.println(key);//распечатываем индекс искомого числа
System.out.println(Arrays.binarySearch(array, 0));//а теперь попробуем найти число, которого в массиве нет,
        // і відразу виведемо результат на екран

    }
}
Висновок програми:
[I@1540e19d [1, 5, 4, 3, 7] [1, 3, 4, 5, 7] 3 -1
У першому рядку — спроба виведення на екран масиву без toString , у другому — виведення масиву за допомогою toString , у третьому виведено відсортований масив, у четвертому — індекс шуканого числа 5 у відсортованому масиві (пам'ятайте, що рахуємо з нуля, тому четвертий елемент масиву має індекс 3). У п'ятому рядку бачимо значення -1 . Такого індексу масив не буває. Висновок сигналізує у тому, що шуканого елемента (у разі, 0) в масиві немає.

Більше про методи класу Array

Клас Arrays та його використання - у статті описані деякі методи класу Array

Головне про масиви

  • Основні властивості масиву: тип поміщених у нього даних, ім'я та довжина.
    Останнє вирішується при ініціалізації (виділенні пам'яті під масив), перші два параметри визначаються при оголошенні масиву.

  • Розмір масиву (кількість осередків) потрібно визначати в int

  • Змінити довжину масиву після створення не можна.

  • Доступ до елемента масиву можна отримати за його індексом.

  • У масивах, як і скрізь Java, елементи нумеруються з нуля.

  • Після процедури створення масиву він заповнений значеннями за замовчуванням.

  • Масиви у мові Java влаштовані негаразд, як і C++. Вони майже збігаються із покажчиками на динамічні масиви.

Корисні матеріали про масиви

Хочете знати більше про масиви? Зверніть увагу на статті нижче. Там багато цікавого та корисного з цієї теми.
  1. Щось про масиви — хороша докладна стаття про масиви

  2. Клас Arrays та його використання - у статті описані деякі методи класу Array

  3. Багатомірні масиви - докладна стаття про багатовимірні масиви з прикладами.

  4. Повертайте масив нульової довжини, а не null - автор "Ефективного програмування" Джошуа Блох розповідає про те, як краще повертати порожні масиви

Коментарі
ЩОБ ПОДИВИТИСЯ ВСІ КОМЕНТАРІ АБО ЗАЛИШИТИ КОМЕНТАР,
ПЕРЕЙДІТЬ В ПОВНУ ВЕРСІЮ