Как я могу проверить, отличаются ли два ArrayLists друг от друга? Я не забочусь о том, что является различием, я просто хочу знать, не являются ли они тем же.
Я выбираю список очков от базы данных каждую минуту, и только если список очков, который я выбрал, отличается от того, который я выбрал минуту назад, я хочу отправить его клиенту.
Теперь значение ArrayList является на самом деле классом, который я создал (который содержит имя, lvl, разряд, счет).
Сделайте я должен реализовать equals()
на нем?
Используйте equals()
. Пока элементы внутри списков правильно реализуют equals()
, он будет возвращать правильные значения.
Если вы не хотите игнорировать порядок значений, то вам следует сбросить значения в два объекта Set
и сравнить их с помощью equals()
.
Как заметил Иоахим, для большинства приложений определение List.equals (Объект o)
работает:
Сравнивает указанное объект с этим списком для равенства. Возвращает
истину
тогда и только тогда, когда указанный объект также является списком, оба списка имеют одинаковый размер и все соответствующие пары элементов в двух списках равны. (Два элементаe1
иe2
равны, если(e1 == null? E2 == null: e1.equals (e2))
.) Другими словами , два списка считаются равными, если они содержат одинаковые элементы в одном порядке. Это определение гарантирует, что методравно
правильно работает в различных реализациях интерфейсаList
.
Однако в зависимости от того, как вы его используете, это может работать не так, как ожидалось. Если у вас есть List
, например, он не совсем работает, потому что массивы наследуют , равное
от Object
, которое определяет равенство как эталонную идентичность. .
List<int[]> list1 = Arrays.asList(new int[] { 1, 2, 3 });
List<int[]> list2 = Arrays.asList(new int[] { 1, 2, 3 });
System.out.println(list1.equals(list2)); // prints "false"
Кроме того, два списка с разными параметрами типа могут быть равно
:
List<Number> list1 = new ArrayList<Number>();
List<String> list2 = new ArrayList<String>();
System.out.println(list1.equals(list2)); // prints "true"
Вы также упомянули, что список должен содержать элементы одного типа. Вот еще один пример, когда элементы имеют разные типы, но они равны
:
List<Object> list1 = new ArrayList<Object>();
List<Object> list2 = new ArrayList<Object>();
list1.add(new ArrayList<Integer>());
list2.add(new LinkedList<String>());
System.out.println(list1.equals(list2)); // prints "true"
Итак, если вы четко не определите, что для вас означает равенство, на вопрос могут быть очень разные ответы. Однако для большинства практических целей List.equals
должно быть достаточно.
равно
Информация после обновления предполагает, что List.equals
отлично справится с задачей, при условии , что элементы реализуют равняется
] правильно (поскольку List
вызывает E.equals
для не нулевых
-элементов, согласно документации API выше).
Итак, в этом случае, если у нас есть, скажем, List
, тогда Player
должен @Override равно (Object o)
, чтобы вернуть true
if o instanceof Player
и в соответствующих полях все они равны
(для ссылочных типов) или ==
(для примитивы).
Конечно, когда вы @Override равняется
, вы должны также @Override int hashCode ()
. Едва приемлемый минимум - вернуть 42;
; немного лучше вернуть name.hashCode ();
; Лучше всего использовать формулу, включающую все поля, в которых вы определяете равно
.Хорошая IDE может автоматически сгенерировать для вас методы equals / hashCode
.
Object.equals ( Object)
Object.hashCode ()
java.lang.Comparable
- здесь не нужен, но другой важный контракт Java API На equals / hashCode
combo:
На равно
vs ==
: