HTML Diff
0 added 0 removed
Original 2026-01-01
Modified 2026-02-26
1 <p>Прямое сравнение объектов в Java почти всегда (кроме строк) будет возвращать false для разных объектов, даже если их содержимое идентично:</p>
1 <p>Прямое сравнение объектов в Java почти всегда (кроме строк) будет возвращать false для разных объектов, даже если их содержимое идентично:</p>
2 <p>Иногда необходимо другое поведение, например, сравнение на основе каких-то значений. Пример с городами:</p>
2 <p>Иногда необходимо другое поведение, например, сравнение на основе каких-то значений. Пример с городами:</p>
3 <h2>equals()</h2>
3 <h2>equals()</h2>
4 <p>Эта задача тесно связана с классом Object. Именно в нем реализован механизм, который мы используем для сравнения строк.</p>
4 <p>Эта задача тесно связана с классом Object. Именно в нем реализован механизм, который мы используем для сравнения строк.</p>
5 <p>В случае строк equals() сравнивает сами строки. Для всех остальных типов объектов, стандартная реализация возвращает true только в том случае, если объект сравнивается сам с собой. Это поведение идентично сравнению через ==.</p>
5 <p>В случае строк equals() сравнивает сами строки. Для всех остальных типов объектов, стандартная реализация возвращает true только в том случае, если объект сравнивается сам с собой. Это поведение идентично сравнению через ==.</p>
6 <p>Но это поведение можно изменить так как нам нужно, благодаря возможности переопределить этот метод в нужном классе. Предположим что у нас есть класс User с полями firstName и age. Его реализация:</p>
6 <p>Но это поведение можно изменить так как нам нужно, благодаря возможности переопределить этот метод в нужном классе. Предположим что у нас есть класс User с полями firstName и age. Его реализация:</p>
7 <p>Допустим мы хотим сравнивать пользователей на основе равенства их firstName и возраста. Если имя и возраст одинаковые, то мы считаем, что это тот же самый пользователь. Реализовать эту проверку можно напрямую:</p>
7 <p>Допустим мы хотим сравнивать пользователей на основе равенства их firstName и возраста. Если имя и возраст одинаковые, то мы считаем, что это тот же самый пользователь. Реализовать эту проверку можно напрямую:</p>
8 <p>Но нам бы хотелось сравнивать через метод equals, что значительно упрощает процесс, особенно если проверок по коду много.</p>
8 <p>Но нам бы хотелось сравнивать через метод equals, что значительно упрощает процесс, особенно если проверок по коду много.</p>
9 <p>Чтобы иметь возможность сравнивать пользователей на основе их firstName и возраста, нам понадобится реализовать метод equals() с таким содержимым:</p>
9 <p>Чтобы иметь возможность сравнивать пользователей на основе их firstName и возраста, нам понадобится реализовать метод equals() с таким содержимым:</p>
10 <p>Большая часть этого кода идентична для всех классов. Разница появляется только в самом конце, где мы выбираем по каким полям происходит сравнение и то как это делается.</p>
10 <p>Большая часть этого кода идентична для всех классов. Разница появляется только в самом конце, где мы выбираем по каким полям происходит сравнение и то как это делается.</p>
11 <h2>hashCode()</h2>
11 <h2>hashCode()</h2>
12 <p>Переопределение equals() при сравнении объектов, важное условие работы этой системы, но недостаточное. Этот метод работает в связке с методом hashCode(), который нужно переопределять тогда, когда переопределяется equals(). Почему? hashCode() возвращает числовой хеш-код, используемый в коллекциях для хранения объектов. Этот код должен быть одинаковым у объектов, считающихся одинаковыми с точки зрения метода equals(). Подробнее мы с этим столкнемся тогда, когда начнем изучать коллекции.</p>
12 <p>Переопределение equals() при сравнении объектов, важное условие работы этой системы, но недостаточное. Этот метод работает в связке с методом hashCode(), который нужно переопределять тогда, когда переопределяется equals(). Почему? hashCode() возвращает числовой хеш-код, используемый в коллекциях для хранения объектов. Этот код должен быть одинаковым у объектов, считающихся одинаковыми с точки зрения метода equals(). Подробнее мы с этим столкнемся тогда, когда начнем изучать коллекции.</p>
13 <p>Для класса User, объекты которого сравниваются на основе firstName и age его реализация может быть такой:</p>
13 <p>Для класса User, объекты которого сравниваются на основе firstName и age его реализация может быть такой:</p>
14 <p>Статический метод Objects.hash() возвращает уникальный (с оговорками) числовой код для всех переданных в него параметров. То есть ровно то, что требуется от метода hashCode()</p>
14 <p>Статический метод Objects.hash() возвращает уникальный (с оговорками) числовой код для всех переданных в него параметров. То есть ровно то, что требуется от метода hashCode()</p>
15 <h2>Вывод</h2>
15 <h2>Вывод</h2>
16 <p>Сравнение объектов в Java реализуется с помощью методов equals() и hashCode(). Основные правила при работе с equals() и hashCode() звучат так:</p>
16 <p>Сравнение объектов в Java реализуется с помощью методов equals() и hashCode(). Основные правила при работе с equals() и hashCode() звучат так:</p>
17 <ul><li>Если переопределяется equals(), то должен переопределяться hashCode().</li>
17 <ul><li>Если переопределяется equals(), то должен переопределяться hashCode().</li>
18 <li>Одинаковые объекты должны возвращать одинаковый хеш-код.</li>
18 <li>Одинаковые объекты должны возвращать одинаковый хеш-код.</li>
19 <li>Разные объекты могут возвращать одинаковый хеш-код.</li>
19 <li>Разные объекты могут возвращать одинаковый хеш-код.</li>
20 </ul>
20 </ul>