Рубрики
Без рубрики

Дублировать записи хэш-набора с исходным классом

TL; DR Вы должны реализовать как хэш-код, так и равенство для использования в хэш-наборе. Завидую… Помеченный java.

Вы должны реализовать оба Хэш-кода и равно для использования в хэш-наборе.

openjdk version "1.8.0_265"
OpenJDK Runtime Environment (AdoptOpenJDK)(build 1.8.0_265-b01)
OpenJDK 64-Bit Server VM (AdoptOpenJDK)(build 25.265-b01, mixed mode)

Ниже моего класса модели находится мой примерный класс с некоторыми свойствами и предоставляет один и тот же хэш-код с одинаковыми значениями свойств. Однако равно возвращает значение false.

public class MyModel {
    private String name;
    private int age;

    public MyModel(String name, int age) {
        this.name = name;
        this.age = age;
    }

    @Override
    public boolean equals(Object o) {
        return false;
    }

    @Override
    public int hashCode() {
        int result = name != null ? name.hashCode() : 0;
        result = 31 * result + age;
        return result;
    }
}

import org.junit.Test;

import java.util.HashSet;

import static org.junit.Assert.*;

public class MyModelTest {

    @Test
    public void testHashSet() {
        HashSet set = new HashSet<>();

        // Add models with same property values.
        set.add(new MyModel("taro", 10));
        set.add(new MyModel("taro", 10));

        // We want the set has only 1 entry.
        assertEquals(1, set.size());
    }

}

Но вы увидите результат, как показано ниже.

java.lang.AssertionError: 
Expected :1
Actual   :2

Для передачи утверждения вы также должны реализовать равно .

public class MyModel {
    private String name;
    private int age;

    public MyModel(String name, int age) {
        this.name = name;
        this.age = age;
    }

    @Override
    public boolean equals(Object o) {
        if (this == o) return true;
        if (o == null || getClass() != o.getClass()) return false;

        MyModel myModel = (MyModel) o;

        if (age != myModel.age) return false;
        return name != null ? name.equals(myModel.name) : myModel.name == null;
    }

    @Override
    public int hashCode() {
        int result = name != null ? name.hashCode() : 0;
        result = 31 * result + age;
        return result;
    }
}

В OpenJDK набор хэшей зависит от реализации хэш-карты.

  • Набор хэшей::добавить

Набор хэшей::добавить

  • Хэш-карта::путВал

Хэш-карта::путВал

Оригинал: “https://dev.to/kojisaiki/duplicate-hashset-entries-with-original-class-42e3”