Вы должны реализовать оба Хэш-кода
и равно
для использования в хэш-наборе.
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() { HashSetset = 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”