Это печально известная проблема: .equals()
для массивов сильно сломан, просто не используйте его, никогда.
Тем не менее, он не «сломан», как в «кто-то сделал это действительно неправильно» - он просто делает то, что определено, а не то, что обычно ожидается. Так что для пуристов: это совершенно нормально, и это также означает, что не используйте его, никогда.
Теперь ожидаемое поведение для equals
заключается в сравнении данных. Поведение по умолчанию заключается в сравнении идентификаторов, поскольку Object
не имеет никаких данных (для пуристов: да, есть, но это не главное); Предполагается, что если вам нужно equals
в подклассах, вы реализуете его. В массивах для вас нет реализации, поэтому вы не должны ее использовать.
Таким образом, разница в том, что Arrays.equals(array1, array2)
работает так, как вы ожидаете (т.е. сравнивает содержимое), array1.equals(array2)
возвращается к реализации Object.equals
, которая, в свою очередь, сравнивает идентичность и, следовательно, лучше заменяется на ==
(для пуристов: да, я знаю о null
).
Проблема в том, что даже Arrays.equals(array1, array2)
сильно укусит вас, если элементы массива не будут правильно реализовывать equals
. Это очень наивное утверждение, я знаю, но есть очень важный, менее очевидный случай: рассмотрим двумерный массив.
2D-массив в Java - это массив массивов, и массивы equals
разбиты (или бесполезны, если вы предпочитаете), поэтому Arrays.equals(array1, array2)
не будет работать, как вы ожидаете, для 2D-массивов.
Надеюсь, это поможет.