hashCode не изменяется в методе при изменении параметров - PullRequest
0 голосов
/ 19 марта 2020

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

public class Cat {
    public int age;
    public int weight;
    public int strength;

    public Cat() {
    }

    public boolean fight(Cat anotherCat) {
        int score = 0;
        if (this.age > anotherCat.age)
            score++;
        if (this.weight > anotherCat.weight)
            score++;
        if (this.strength > anotherCat.strength)
            score++;

        if ((this.weight == anotherCat.weight) && (this.strength == anotherCat.strength) && (this.age == anotherCat.age)) {
            long a = this.hashCode();
            long b = anotherCat.hashCode();
            System.out.println(a);
            System.out.println(b);


        }


        return score >= 2;
    }

    public static void main(String[] args) {
        Cat cat1 = new Cat();
        cat1.weight = 10;
        cat1.strength = 5;
        cat1.age = 7;
        Cat cat2 = new Cat();
        cat2.weight = 10;
        cat2.strength = 5;
        cat2.age = 7;
        System.out.println(cat1.fight(cat2));

    }
}
        cat1.fight(cat2)
        951007336
        2001049719 

        cat2.fight(cat1) 
        951007336
        2001049719  

почему это так?

1 Ответ

2 голосов
/ 19 марта 2020

hashCode не изменяется в методе при изменении параметров

Это нормальное поведение для Object.hashCode. И ваш Cat метод использует унаследованный hashCode.

. Реализация hashCode в Object возвращает «хэш-код идентификации»; то есть тот, который вычисляется (каким-то образом) из идентичности объекта. Это не изменится за время существования объекта.

Если вам нужно значение хеш-кода, которое зависит от полей вашего объекта, вам необходимо переопределить Object.hashCode; например,

   @Override
   public int hashCode() {
       return age + (weight * 31) + (strength * 31 * 67);
   }

Обратите внимание, что значения хеш-кода НЕ гарантированно являются уникальными. Уникальность не является частью контракта равно / хэш-код . (Многие кошки могут иметь один и тот же хэш-код.)

Кроме того, изменение хэш-кодов может быть проблемой. Если вы заставите хеш-код объекта измениться, когда он является членом HashSet или ключом HashMap, структура данных будет работать непоследовательно.

...