То, почему я должен переопределить хэш-код (), когда я переопределяю, равняется () методу?

Хорошо, я получил известие от многих мест и источников, что каждый раз, когда я переопределяю равняние () метод, я должен переопределить хэш-код () метод также. Но рассмотрите следующую часть кода

package test;

public class MyCustomObject {

    int intVal1;
    int intVal2;

    public MyCustomObject(int val1, int val2){
        intVal1 = val1;
        intVal2 = val2;
    }

    public boolean equals(Object obj){
        return (((MyCustomObject)obj).intVal1 == this.intVal1) && 
                (((MyCustomObject)obj).intVal2 == this.intVal2);
    }

    public static void main(String a[]){
        MyCustomObject m1 = new MyCustomObject(3,5);
        MyCustomObject m2 = new MyCustomObject(3,5);
        MyCustomObject m3 = new MyCustomObject(4,5);

        System.out.println(m1.equals(m2));
        System.out.println(m1.equals(m3));
    }
}

Здесь вывод является верным, ложным точно способ, которым я хочу, чтобы он был, и я не забочусь переопределения хэш-кода () о методе вообще. Это означает, что хэш-код () переопределение является опцией, довольно бывшей обязательной, как все говорят.

Я хочу второе подтверждение.

29
задан bragboy 25 April 2010 в 07:53
поделиться

3 ответа

Это работает для вас, потому что ваш код не использует никаких функций (HashMap, HashTable), которым требуется hashCode () API .

Однако вы не знаете, будет ли позже вызван ваш класс (предположительно не написанный как одноразовый) в коде, который действительно использует свои объекты в качестве хеш-ключа, и в этом случае это повлияет на ситуацию.

Согласно документации для класса Object :

Общий контракт hashCode:

  • Каждый раз, когда он вызывается для одного и того же объекта более одного раза во время выполнения приложения Java, Метод hashCode должен последовательно возвращать одно и то же целое число при условии, что никакая информация, используемая в равных сравнениях объекта, не изменена. Это целое число не обязательно должно оставаться согласованным от одного выполнения приложения к другому выполнению того же самого приложения.

  • Если два объекта равны согласно методу equals (Object), то вызов метода hashCode для каждого из двух объектов должен привести к одинаковому целочисленному результату .

32
ответ дан 28 November 2019 в 01:33
поделиться

Потому что HashMap / Hashtable сначала будет искать объект с помощью hashCode ().

Если они не совпадают, hashmap будет утверждать, что объекты не совпадают, и возврат не существует на карте.

11
ответ дан 28 November 2019 в 01:33
поделиться

Причина, по которой вам нужно @Override ни то, ни другое, заключается в том, как они взаимосвязаны с остальной частью API.

Вы обнаружите, что если вы поместите m1 в HashSet , тогда не будет содержать (m2) . Это непоследовательное поведение , которое может вызвать множество ошибок и хаос.

Библиотека Java имеет множество функций. Чтобы заставить их работать для вас , вам нужно играть по правилам, и убедитесь, что равняется , а hashCode согласован - это одна из самых важных единицы.

5
ответ дан 28 November 2019 в 01:33
поделиться
Другие вопросы по тегам:

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