Метод equals
для типа массива Java эквивалентен ==
, поскольку "классы" массива Java не переопределяют Object.equals
.
Если вы хотите сравнивать массивы «по значению», вам нужно либо использовать соответствующий метод java.util.Arrays.equals(...)
, либо реализовать его самостоятельно.
Если ваш HashHap
использует массивы в качестве ключей или значений, то он вызовет метод массива equals
, чтобы проверить, совпадают ли ключи и / или значения между двумя картами. Это заставит HashMap.equals
вести себя странно (с вашей точки зрения). Вот что говорит связанная статья. Однако семантический массив только влияет на равенство HashMap
, если вы используете массивы в качестве классов ключей или значений. Если вы этого не сделаете, то HashMap::equals
должен просто работать как положено.
Javadocs для равенства в Map
классах немного вовлечены, но они в основном сводятся к тому, чтобы взять два набора записей, сравнить их размеры, а затем выполнить s1.containsAll(s2)
. Конечно, это дорого, но должно работать для всех классов Map
, которые правильно реализуют интерфейс Map
.
Обратите внимание, что использование массивов в качестве ключей для карт является плохой идеей по нескольким причинам:
- Семантика массива
equals
и hashCode
неверна для HashMap
в большинстве сценариев. В большинстве случаев вам нужна карта для сравнения ключей по значению, а не по идентификатору объекта.
- Массивы изменчивы. Если мы предположили, что для решения проблемы
equals
/ hashcode
был найден обходной путь, вы могли бы все же сломать инварианты карты, изменив ключ массива.