☕ Java-баг, который выглядит нормально, но ломает `HashMap`
Что выведет этот код?
Многие ожидают:
Но результат:
```text
null
```
Почему?
ищет ключ через:
``` java
hashCode()
equals()
```
Когда мы сделали:
```java
map.put(key, "Ritesh");
```
ключ был:
```text
[1, 2]
```
У него был один.
Но потом:
``` java
key.add(3);
```
ключ стал:
```text
[1, 2, 3]
```
И его изменился.
уже положил объект в bucket по старому hash, а при ищет по новому.
Схема:
```text
put()
[1,2]
hash = X
↓
bucket X
key.add(3)
[1,2,3]
hash = Y
get()
ищем bucket Y
→ запись не найдена
```
Главное правило:
❌ Не изменяйте объект после того, как использовали его как ключ в .
Лучше использовать:
✅
✅
✅
✅ immutable-объекты
Например:
``` java
Map<List<Integer>, String> map = new HashMap<>();
List<Integer> key = List.of(1, 2);
map.put(key, "value");
```
Самые опасные баги вJava - те, где объект всё ещё существует, ссылка всё та же, но структура данных уже не может его нормально найти.
#java #backend #programming
Что выведет этот код?
Map<List<Integer>, String> map = new HashMap<>();
List<Integer> key = new ArrayList<>(List.of(1, 2));
map.put(key, "Ritesh");
key.add(3);
System.out.println(map.get(key));
Многие ожидают:
Ritesh
Но результат:
```text
null
```
Почему?
HashMap```
hashCode()
equals()
```
Когда мы сделали:
```
map.put(key, "Ritesh");
```
ключ был:
```text
[1, 2]
```
У него был один
hashCodeНо потом:
```
key.add(3);
```
ключ стал:
```text
[1, 2, 3]
```
И его
hashCodeHashMapget()Схема:
```text
put()
[1,2]
hash = X
↓
bucket X
key.add(3)
[1,2,3]
hash = Y
get()
ищем bucket Y
→ запись не найдена
```
Главное правило:
❌ Не изменяйте объект после того, как использовали его как ключ в
HashMapЛучше использовать:
✅
String✅
Integer✅
record✅ immutable-объекты
Например:
```
Map<List<Integer>, String> map = new HashMap<>();
List<Integer> key = List.of(1, 2);
map.put(key, "value");
```
Самые опасные баги в