Как может я проверять, отличаются ли два ArrayList, я не забочусь о том, что изменяется

Как я могу проверить, отличаются ли два ArrayLists друг от друга? Я не забочусь о том, что является различием, я просто хочу знать, не являются ли они тем же.

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

Теперь значение ArrayList является на самом деле классом, который я создал (который содержит имя, lvl, разряд, счет).

Сделайте я должен реализовать equals() на нем?

37
задан Joachim Sauer 19 June 2013 в 06:43
поделиться

2 ответа

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

Если вы не хотите игнорировать порядок значений, то вам следует сбросить значения в два объекта Set и сравнить их с помощью equals().

12
ответ дан 27 November 2019 в 04:14
поделиться

По определению «сходства»

Как заметил Иоахим, для большинства приложений определение 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 .equals вызывает E.equals для не нулевых -элементов, согласно документации API выше).

Итак, в этом случае, если у нас есть, скажем, List , тогда Player должен @Override равно (Object o) , чтобы вернуть true if o instanceof Player и в соответствующих полях все они равны (для ссылочных типов) или == (для примитивы).

Конечно, когда вы @Override равняется , вы должны также @Override int hashCode () . Едва приемлемый минимум - вернуть 42; ; немного лучше вернуть name.hashCode (); ; Лучше всего использовать формулу, включающую все поля, в которых вы определяете равно .Хорошая IDE может автоматически сгенерировать для вас методы equals / hashCode .

См. Также

  • Эффективное 2-е издание Java
    • Правило 8: Соблюдайте общий договор при переопределении равного
    • Правило 9: Всегда переопределяйте хэш-код, когда вы переопределяете равно

Ссылки API

Связанные вопросы

На equals / hashCode combo:

На равно vs == :

79
ответ дан 27 November 2019 в 04:14
поделиться
Другие вопросы по тегам:

Похожие вопросы: