Об определении "одинаковости"
Как отметил Иоахим, для большинства приложений определение List.equals(Object o)
работает:
Сравнивает указанный объект сэтот список на равенство.Возвращает true
тогда и только тогда, когда указанный объект также является списком, оба списка имеют одинаковый размер, и все соответствующие пары элементов в двух списках равны.(Два элемента e1
и e2
равны, если (e1==null ? e2==null : e1.equals(e2))
.) Другими словами, два списка определяются как равные, если они содержат одинаковые элементы в одинаковом порядке.Это определение гарантирует, что метод equals
работает должным образом в различных реализациях интерфейса List
.
Однако, в зависимости от того, как вы его используете, он может работать не так, как ожидалось.Например, если у вас есть List<int[]>
, он не совсем работает, потому что массивы наследуют equals
от 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"
Кроме того, два списка различного типапараметр может быть equals
:
List<Number> list1 = new ArrayList<Number>();
List<String> list2 = new ArrayList<String>();
System.out.println(list1.equals(list2)); // prints "true"
Вы также упомянули, что список должен содержать элементы того же типа.Вот еще один пример, где элементы не имеют одинаковый тип, и все же они equals
:
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
.
При реализации equals
Информация после обновления говорит о том, что List.equals
отлично справится с работой, при условии , что элементы правильно реализуют equals
(потому что List<E>.equals
вызывает E.equals
для не null
-элементов согласно документации API выше).
Так что в этом случае,если у нас есть, скажем, List<Player>
, то Player
должен @Override equals(Object o)
вернуть true
, если o instanceof Player
и в соответствующих полях, они все equals
(для ссылочных типов) или ==
(для примитивов).
Конечно, когда вы @Override equals
, вы должны также @Override int hashCode()
.Едва приемлемый минимум составляет return 42;
;немного лучше - до return name.hashCode();
;Лучше всего использовать формулу, которая включает все поля, в которых вы определяете equals
.Хорошая среда разработки может автоматически генерировать equals/hashCode
методы для вас.
См. Также
- Effective Java 2nd Edition
- Элемент8: Соблюдайте общий контракт, если переопределение равно
- Пункт 9: Всегда переопределять хэш-код, когда переопределение равно
APIссылки
Смежные вопросы
Вкл. equals/hashCode
Комбо:
Вкл. equals
против ==
: