Задался таким банальным вопросом как "хочу увидеть коллизию своими глазами в 8 джаве". Из истоков известно, что колизия возникает в том случае, когда хешкод одинаковый, но по equals обьекты разные.
При коллизии, обьект (ключ HashMap-ы) должен помещаться в некую структуру внутри ОДНОЙ корзины. В джаве 8 (на сколько я слышал) в виде красно-черного дерева.
Пример класса:
public class Service {
private int age;
public Service(int age) {
this.age = age;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
@Override
public boolean equals(Object o) {
return false;
}
@Override
public int hashCode() {
return 1;
}
}
Как видно, hashCode() данного класса всегда будет равен единице (для всех его создаваемых обьектов). Также equals() будет всегда говорить о том, что объекты не равны между собой.
Пример реализации:
public class Work {
private static Map<Service, String> map;
public static void main(String[] args) {
Service service = new Service(1);
Service service2 = new Service(2);
Service service3 = new Service(3);
Service service4 = new Service(4);
Service service5 = new Service(5);
map = new HashMap<>();
map.put(service, "empty");
map.put(service2, "empty");
map.put(service3, "empty");
map.put(service4, "empty");
map.put(service5, "empty");
}
}
Стоит также заметить, как всем известно, что hashCode() + equals() работают ТОЛЬКО для ключа в HashMap.
Результат:
Никакой структуры я не вижу, обычная HashMap.
ВОПРОС: что я упускаю? Как воссоздать коллизию?
Просто то, что Вы видите на скрине, это map.entrySet() в режиме debug.
Вам просто нужно посмотреть ((HashMap) map).table, и тогда наглядно видно, что "корзинка" всего одна.
Это без реализации hashcode
Это с hashcode 1
Сборка персонального компьютера от Artline: умный выбор для современных пользователей