Progress28.ru

IT Новости


09ae9cb0
11 просмотров
Рейтинг статьи
1 звезда2 звезды3 звезды4 звезды5 звезд
Загрузка...

Arrays equals java

Вводный курс. Язык программирования Java

11. Класс Arrays. Работа с массивами

Большая часть методов работы с массивами определена в специальном классе Arrays пакета java.util. Ряд методов определены в классах java.lang.Object и java.lang.System.

На практике наиболее часто в основном используются методы класса java.util.Arrays, а также несколько методов классов java.lang.Object и java.lang.System. Указанные методы представлены ниже.

Методы перегружены для всех примитивных типов

[]b=Arrays.copyOf([]a, int newLength)

[]a – исходный массив

[]b – новый массив

newLength – длина нового массива

[]b=Arrays.copyOfRange ([]a, int index1, int index2)

копирование части массива,

[]a – исходный массив

[]b – новый массив

index1, index2– начальный и конечный индексы копирования

java.lang.System.arraycopy([] a, indexA , []b, indexB, count)

[]a – исходный массив

[]b – новый массив

indexA-начальный индекс копирования исходного массива

indexB-начальный индекс нового массива

count— количество элементов копирования

[]b= a.java.lang.Object.clone()

[]a – исходный массив

[]b – новый массив

Arrays.sort([]a)

Сортировка. Упорядочивание всего массива в порядке возрастания

Arrays.sort([]a,index1,index2)

Сортировка части массива

в порядке возрастания

Arrays.sort([]a, Collections.reverseOrder());

Сортировка. Упорядочивание всего массива в порядке убывания

Boolean f=Arrays.equals([]a,[]b)

String str=Arrays.toString([]a);

Вывод одномерных массивов. Все элементы представлены в виде одной строки

int index=Arrays.binarySearch([]a,элемент a)

поиск элемента методом бинарного поиска

Arrays.fill([]a, элемент заполнения)

заполнение массива переданным значением

Boolean f=Arrays.deepEquals([]a, []b)

сравнение двумерных массивов

List Arrays.asList( []a);

Перевод массива в коллекцию

Для работы с классом необходимо подключить библиотеку java.util.Arrays.

Методы работы с массивами

Копирование массивов

Метод java.util.Arrays.copyOf()

Arrays.copyOf возвращает массив-копию новой длины. Если новая длина меньше исходной, то массив усекается до этой длины, а если больше, то дополняется значениями по умолчанию соответствующего типа.

[]b=Arrays.copyOf([]a, int newLength),

[]a – исходный массив

[]b – новый массив

newLength – длина нового массива

Пример 1.

длина массива a:6
длина массива b: 6
массив a
0.0 1.0 2.0 3.0 4.0 5.0
новая длина массива b: 3
массив b
0.0 1.0 2.0

Пример 2.

массив flag1
true true true
массив flag2
false false false false false
длина массива flag2: 5
массив flag2
true true true false false

Метод java.util. Arrays.copyOf()

Arrays.copyOfRange возвращает массив-копию новой длины, при этом копируется часть оригинального массива от начального индекса до конечного –1.

[]b=Arrays.copyOfRange ([]a, int index1, int index2),

[]a – исходный массив

[]b – новый массив

index1, index2– начальный и конечный индексы копирования

Пример.

Дни недели:
Понедельник Вторник Среда Четверг Пятница Суббота Воскресенье
Рабочие дни
Понедельник Вторник Среда Четверг Пятница

Метод arraycopy() из класса System

Быстродействие метода System.arraycopy() выше по сравнению с использованием цикла for для выполнения копирования. Метод System.arraycopy( ) перегружен для обработки всех типов.

java.lang.System.arraycopy([] a, indexA , []b, indexB, count),

[]a – исходный массив

[]b – новый массив

indexA-начальный индекс копирования исходного массива

indexB-начальный индекс нового массива

count— количество элементов копирования

Пример.

Пример.

Метод clone() из класса Object

[]b= a.java.lang.Object.clone();

[]a – исходный массив

[]b – новый массив

Пример.

Сортировка массивов

Метод Arrays.sort([]a)

Метод sort() из класса Arrays использует усовершенствованный алгоритм Быстрой сортировки (Quicksort), который эффективен для большинства набора данных. Метод упорядочивает весь массив в порядке возрастания значений элементов.

Arrays.sort([]a),

[]a – исходный массив, после работы метода массив будет содержать упорядоченные значения элементов в порядке возрастания.

Читать еще:  Java object hashcode

Пример.

Метод Arrays.sort([]a,index1,index2)

выполняет сортировку части массива по возрастанию массива от index1 до index2 минус единица

Arrays.sort([]a,index1,index2),

[]a – исходный массив

index1, index2 — начальный и конечный индексы, определяющие диапазон упорядочивания элементов по возрастанию.

Сортировка массива по убыванию

Arrays.sort([]a, Collections.reverseOrder());

При сортировке массива в обратном порядке (по убыванию) нужно использовать вместо примитивного типа, объектный тип.

15,39 1,54 17,47 15,50 3,83 16,43 18,87 15,54 8,23 12,97

Массив,отсотированный по убыванию

18,87 17,47 16,43 15,54 15,50 15,39 12,97 8,23 3,83 1,54

Сравнение массивов

Чтобы быть равными, массивы должны иметь одинаковый тип и число элементов, а каждый элемент должен быть равен каждому соответствующему элементу другого массива.

Класс Object имеет метод equals , который наследуется массивами и не является перегруженным и сравнение идет по адресам объектов, а не по содержимому. Метод equals перегружен только в классе Arrays . Отсюда вытекает правило сравнения массивов:

  • a == b сравниваются адреса массивов
  • a.equals(b) сравниваются адреса массивов
  • Arrays.equals(a, b) сравнивается содержимое массивов
  • Arrays.deepEquals(a, b) сравнивается содержимое многомерных массивов

Boolean f=Arrays.equals([]a,[]b);

Метод вернет true, если содержимое массивов равно, в противном случае false.

Вывод одномерных массивов

Имеется достаточно удобный метод вывода данных одномерного массива — Arrays.toString([]a, который возвращает строковое представление массива со строковым представлением элементов, заключенных в квадратные скобки.

String str=Arrays.toString([]a);

Это адрес: [Ljava.lang.String;@1db9742

Это значения: [Красный, Синий, Зеленый]

До сортировки: [7, 2, 9, 1, 0, 3, 4, 8, 5, 6]

После сортировки: [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]

Вывод многомерных массивов

Для вывода многомерных массивов метод Arrays.deepToString.

String str= Arrays.deepToString([][]a);

массив a: [[1, 2, 3], [4, 5, 6], [7, 8, 9]]

массив ch: [[а, б, в], [г, д, е], [ё, ж, з]]

Бинарный поиск элемента в одномерном массиве

Бинарный поиск – алгоритм поиска элемента в отсортированном массиве. Алгоритм основывается на принципе последовательного деления массива пополам.

int index=Arrays.binarySearch([]a,элемент x),

х — искомое значение

index – индекс элемента в массиве, если поиск успешный,

отрицательное число – если в массиве элемент не найден

Массив должен быть отсортирован! В противном случае результат будет неопределенным.

Массив= [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]

искомое значение = 5

Массив= [август, апрель, декабрь, июль, июнь, май, март, ноябрь, октябрь, сентябрь, февраль, январь]

искомое значение = март

Заполнение массива

Метод Arrays.fill() позволяет заполнить массив одинаковыми данными.

Имеется два метода

Arrays.fill([]a, value);

Arrays.fill(a[], int index1, int index2, value),

[]a – заполняемый массив,

index1, index2- индексы диапазона заполнения,

До заполнения a: [0, 0, 0, 0, 0, 0, 0, 0, 0, 0]

До заполнения b: [0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0]

До заполнения bool: [false, false, false, false, false, false, false, false, false, false]

После заполнения a: [9, 9, 9, 9, 9, 9, 9, 9, 9, 9]

После заполнения b: [0.0, 0.0, 0.0, 0.0, 0.0, 2.0, 2.0, 2.0, 2.0, 2.0]

После заполнения: bool[true, true, true, true, true, false, false, false, false, false]

equals vs Arrays.equals in Java

When comparing arrays in Java, are there any differences between the following 2 statements?

And if so, what are they?

Читать еще:  Error java java lang exceptionininitializererror

8 Answers 8

array1.equals(array2) is the same as array1 == array2 , i.e. is it the same array. As @alf points out it’s not what most people expect.

Arrays.equals(array1, array2) compares the contents of the arrays.

Similarly array.toString() may not be very useful and you need to use Arrays.toString(array) .

It’s an infamous problem: .equals() for arrays is badly broken, just don’t use it, ever.

That said, it’s not «broken» as in «someone has done it in a really wrong way» — it’s just doing what’s defined and not what’s usually expected. So for purists: it’s perfectly fine, and that also means, don’t use it, ever.

Now the expected behaviour for equals is to compare data. The default behaviour is to compare the identity, as Object does not have any data (for purists: yes it has, but it’s not the point); assumption is, if you need equals in subclasses, you’ll implement it. In arrays, there’s no implementation for you, so you’re not supposed to use it.

So the difference is, Arrays.equals(array1, array2) works as you would expect (i.e. compares content), array1.equals(array2) falls back to Object.equals implementation, which in turn compares identity, and thus better replaced by == (for purists: yes I know about null ).

Problem is, even Arrays.equals(array1, array2) will bite you hard if elements of array do not implement equals properly. It’s a very naive statement, I know, but there’s a very important less-than-obvious case: consider a 2D array.

2D array in Java is an array of arrays, and arrays’ equals is broken (or useless if you prefer), so Arrays.equals(array1, array2) will not work as you expect on 2D arrays.

Hope that helps.

Look inside the implementation of the two methods to understand them deeply:

Sigh. Back in the 70s I was the «system programmer» (sysadmin) for an IBM 370 system, and my employer was a member of the IBM users group SHARE. It would sometimes happen thatsomebody submitted an APAR (bug report) on some unexpected behavior of some CMS command, and IBM would respond NOTABUG: the command does what it was designed to do (and what the documentation says).

SHARE came up with a counter to this: BAD — Broken As Designed. I think this might apply to this implementation of equals for arrays.

There’s nothing wrong with the implementation of Object.equals. Object has no data members, so there is nothing to compare. Two «Object»s are equal if and only if they are, in fact, the same Object (internally, the same address and length).

But that logic doesn’t apply to arrays. Arrays have data, and you expect comparison (via equals) to compare the data. Ideally, the way Arrays.deepEquals does, but at least the way Arrays.equals does (shallow comparison of the elements).

So the problem is that array (as a built-in object) does not override Object.equals. String (as a named class) does override Object.equals and give the result you expect.

Other answers given are correct: [. ].equals([. ]) simply compares the pointers and not the contents. Maybe someday somebody will correct this. Or maybe not: how many existing programs would break if [. ].equals actually compared the elements? Not many, I suspect, but more than zero.

Читать еще:  Win 10 журнал ошибок

Java.util.Arrays.equals () в Java с примерами

Сегодня мы обсудим самый простой способ проверить, равны ли два массива или нет. Два массива считаются равными, если оба массива содержат одинаковое количество элементов, и все соответствующие пары элементов в двух массивах равны. Другими словами, два массива равны, если они содержат одинаковые элементы в одинаковом порядке. Кроме того, две ссылки на массив считаются равными, если обе равны нулю .

Класс массивов в java предоставляет метод Arrays.equals (), чтобы проверить, равны ли два массива или нет.

Другие варианты:

  • public static boolean equals (byte [] a, byte [] a2)
  • public static логическое equals (short [] a, short [] a2)
  • public static логическое equals (long [] a, long [] a2)
  • public static логическое equals (float [] a, float [] a2)
  • public static boolean equals (double [] a, double [] a2)
  • public static логическое equals (char [] a, char [] a2)
  • public static boolean equals (логическое [] a, логическое [] a2)
  • public static логическое equals (Object [] a, Object [] a2)

// Java-программа для демонстрации работы Arrays.equals ()

public class ArrayEqualDemo

public static void main(String[] args)

// Давайте создадим разные массивы целых чисел

int [] arr1 = new int [] < 1 , 2 , 3 , 4 >;

int [] arr2 = new int [] < 1 , 2 , 3 , 4 >;

int [] arr3 = new int [] < 1 , 2 , 4 , 3 >;

System.out.println( «is arr1 equals to arr2 : » +

System.out.println( «is arr1 equals to arr3 : » +

Мы также можем использовать Arrays.equals () для проверки равенства массива объектов определенного пользователем класса. Посмотрим на последний вариант метода Arrays.equals ()

Примечание: — В случае массивов объектов вы должны переопределить метод equals, чтобы предоставить собственное определение равенства, в противном случае вы получите выходные данные, зависящие от того, что возвращает метод equals () класса Object . В приведенной ниже программе мы проверяем равенство роллно, имени и адреса учащегося.

// Java-программа для демонстрации работы Arrays.equals ()
// для пользовательских объектов.

public class ArrayEqualDemo

public static void main (String[] args)

new Student( 131 , «aaaa» , «nyc» ),

new Student( 121 , «cccc» , «jaipur» )>;

new Student( 131 , «aaaa» , «nyc» ),

new Student( 121 , «cccc» , «jaipur» )>;

new Student( 121 , «dddd» , «jaipur» ),

new Student( 131 , «aaaa» , «nyc» ),

System.out.println( «is arr1 equals to arr2 : » +

System.out.println( «is arr1 equals to arr3 : » +

// Класс для представления студента.

String name, address;

public Student( int rollno, String name,

this .rollno = rollno;

this .name = name;

this .address = address;

public boolean equals(Object obj) <

// Typecast obj to Student, чтобы мы могли сравнивать студентов

Student s = (Student) obj;

return this .rollno == s.rollno && this .name.equals(s.name)

Эта статья предоставлена Гауравом Миглани . Если вы как GeeksforGeeks и хотели бы внести свой вклад, вы также можете написать статью с помощью contribute.geeksforgeeks.org или по почте статьи contribute@geeksforgeeks.org. Смотрите свою статью, появляющуюся на главной странице GeeksforGeeks, и помогите другим вундеркиндам.

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

Ссылка на основную публикацию