Класс Arrays в Java

🔥 🚀 Важно для всех, кто работает с Java! 🔥
На JavaRocks ты найдешь уникальные туториалы, практические задачи и редкие книги, которых не найти в свободном доступе. Присоединяйся к нашему Telegram-каналу JavaRocks — стань частью профессионального сообщества!

Эта статья поможет вам разобраться, зачем нужен класс Arrays и как работать с массивами в Java. Вы можете выбрать удобный для вас формат — посмотреть видеоурок на английском языке, либо же прочитать текстовую версию ниже.

Разберем несколько задач и примеров работы с массивами, которые часто встречаются на практике.

Например, представьте, что есть массив из 10 случайных чисел:

int[] numbers = {167, -2, 16, 99, 26, 92, 43, -234, 35, 80};

Задача — отсортировать этот массив по возрастанию: от наименьшего к наибольшему.

В итоге должно получиться так:

Как это сделать?

Задача на самом деле не из простых.

Для начала попробуйте догадаться самостоятельно, как ее решить.

Вот одно из решений:

  • Проходим по массиву и сравниваем элементы попарно ([0] с [1], [1] с [2], [2] с [3] и т. д.). Если текущий элемент больше следующего — меняем их местами. Если нет — оставляем как есть и переходим дальше.
  • Таким образом, после первого прохода самое большое значение (в нашем случае — 167) окажется в последней ячейке массива.
  • Теперь повторяем то же самое, но уже не до самого конца, а до предпоследнего элемента — ведь последний уже на своем месте. В результате второго прохода на предпоследнем месте окажется следующее по величине значение — 99.
  • Повторяем этот процесс столько раз, сколько элементов массива — так получим отсортированный массив.

Суть понятна. Теперь осталось только написать код. Вот как это может выглядеть:

сортировка массива
public class Main {

   public static void main(String[] args) {

       int[] numbers = {167, -2, 16, 99, 26, 92, 43, -234, 35, 80};

       for (int i = numbers.length - 1; i > 0; i--) {
           for (int j = 0; j < i; j++) {
           /* Compare the elements in pairs.
             If they are not in the right order,
             then swap them */
               if (numbers[j] > numbers[j + 1]) {
                   int tmp = numbers[j];
                   numbers[j] = numbers[j + 1];
                   numbers[j + 1] = tmp;
               }
           }
       }

   }
}
Run Code

Даже если общий принцип понятен, все равно придется написать довольно много кода для решения такой простой задачи.

Давайте попробуем что-нибудь попроще.

Например, возьмем тот же массив чисел.

int[] numbers = {167, -2, 16, 99, 26, 92, 43, -234, 35, 80};

Наша задача — скопировать его содержимое в другой массив.

int [] numbersCopy = new int[10];

Подумайте, как бы вы это сделали, используя то, что вы уже знаете о массивах?

Например, можно пройтись по массиву numbers в цикле и поочерёдно записывать его элементы в numbersCopy:

public class Main {

   public static void main(String[] args) {

       int[] numbers = {167, -2, 16, 99, 26, 92, 43, -234, 35, 80};

       int [] numbersCopy = new int[10];

       for (int i = 0; i < numbers.length; i++) {

           numbersCopy[i] = numbers[i];
       }

   }
}
Run Code

Похоже, мы справились и задача решена! Однако если вам придется выполнять подобные действия часто, код быстро заполнят однотипные циклы.

На самом деле, такие рутинные задачи уже давно решены создателями Java. Нет необходимости “изобретать велосипед” и придумывать собственное решение.

Для таких целей существует специальный статический класс — Arrays, который помогает выполнять типовые операции с массивами.

В этот класс добавлены методы для выполнения наиболее распространенных задач, с которыми сталкиваются Java-разработчики.

Методы класса Arrays в Java

Например, задача сортировки массива, с которой мы сейчас пытались справиться, решается всего одной строкой:

public class Main {

   public static void main(String[] args) {

       int[] numbers = {167, -2, 16, 99, 26, 92, 43, -234, 35, 80};

       Arrays.sort(numbers);

       System.out.println(Arrays.toString(numbers));

   }
}
Run Code

Метод Arrays.sort() сортирует массив. И делает это гораздо эффективнее, чем написанный нами алгоритм.

Вывод в консоли:

[-234, -2, 16, 26, 35, 43, 80, 92, 99, 167]

Примечание: Чтобы преобразовать массив в строку, используется другой метод класса ArraysArrays.toString().

В Java массивы по умолчанию не переопределяют метод toString(), поэтому если написать:

System.out.println(numbers.toString());

— вызовется метод toString() из класса Object. В итоге вывод будет выглядеть примерно так:

[I@4554617c 

Не будем вдаваться в подробности, почему вывод выглядит именно так. Главное, что это явно не то, что нам нужно. А вот Arrays.toString() делает именно то, что требуется.

Кстати, копирование массива также легко выполняется с помощью класса Arrays:

public class Main {

   public static void main(String[] args) {

       int[] numbers = {167, -2, 16, 99, 26, 92, 43, -234, 35, 80};

       int [] numbersCopy = Arrays.copyOf(numbers, numbers.length);
       System.out.println(Arrays.toString(numbersCopy));

   }
}
Run Code

Мы передаем методу Arrays.copyOf() исходный массив (из которого хотим скопировать значения) и длину нового массива, в который будут копироваться данные. В данном случае в качестве длины мы указали numbers.length, так как хотим скопировать весь массив целиком. Если же нужно скопировать только несколько первых элементов, можно задать меньшую длину:

public class Main {

   public static void main(String[] args) {

       int[] numbers = {167, -2, 16, 99, 26, 92, 43, -234, 35, 80};

       int [] numbersCopy = Arrays.copyOf(numbers, 4);
       System.out.println(Arrays.toString(numbersCopy));

   }
}
Run Code

Здесь в качестве длины указано значение 4, поэтому в новый массив попадут только первые четыре элемента.

Консольный вывод:

[167, -2, 16, 99] 

Кстати, Arrays также позволяет копировать часть массива из середины, а не из начала массива:

public class Main {

   public static void main(String[] args) {

       int[] numbers = {167, -2, 16, 99, 26, 92, 43, -234, 35, 80};

       int [] numbersCopy = Arrays.copyOfRange(numbers, 2,6);
       System.out.println(Arrays.toString(numbersCopy));

   }
}
Run Code

Вывод:

[16, 99, 26, 92]

В новый массив скопированы элементы со второго включительно до шестого не включительно (индексация начинается с нуля).

Иногда также может понадобиться сравнить два массива. Как и в случае с методом toString(), сами массивы не переопределяют метод equals(). Поэтому если мы попытаемся сравнить их следующим образом

public class Main {

   public static void main(String[] args) {

       int[] numbers = {1, 2, 3};
       int[] numbers2 = {1, 2, 3};

       System.out.println(numbers.equals(numbers2));
   }
}
Run Code

то мы получим false, поскольку будет вызван метод equals() из класса Object, который сравнивает ссылки на объекты, а не их содержимое.

Класс Arrays содержит переопределенный метод equals(), который сравнивает массивы по содержимому:

public class Main {

   public static void main(String[] args) {

       int[] numbers = {1, 2, 3};
       int[] numbers2 = {1, 2, 3};

       System.out.println(Arrays.equals(numbers, numbers2));
   }
}
Run Code

Вывод:

true

Кстати, класс Arrays работает не только с обычными массивами, но и с двумерными:

public class Main {

   public static void main(String[] args) {

       int[][] numbers = {{1, 2, 3}, {4, 5, 6}, {7, 8, 9}};

       int[][] numbersCopy = Arrays.copyOf(numbers, numbers.length);

       System.out.println("Are these two-dimensional arrays equal?");
       System.out.println(Arrays.deepEquals(numbers, numbersCopy));

       System.out.println(Arrays.deepToString(numbersCopy));
   }
}
Run Code

Вывод:

Are these two-dimensional arrays equal?
true
[[1, 2, 3], [4, 5, 6], [7, 8, 9]]

Как видите, метод Arrays.copyOf() успешно скопировал двумерный массив. Для сравнения и отображения двумерных массивов в классе есть специальные методы: deepEquals() и deepToString().

В дальнейшем вы не раз убедитесь и порадуетесь, что создатели Java предусмотрели множество ситуаций, с которыми часто сталкиваются программисты, и реализовали готовые решения для них. Использовать их проще и удобнее, чем разрабатывать собственные алгоритмы.

Рекомендуем также изучить документацию по классу Arrays на сайте Oracle. Удачи в изучении!

Перевод статьи «Arrays Class in Java».

Оставьте комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *

Прокрутить вверх