TGViewer
Java tests Java tests @java_quizes · 2.42K subscribers
Post #251 403
Java-баг, который выглядит нормально, но ломает `HashMap`

Что выведет этот код?


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 ищет ключ через:

```java
hashCode()
equals()
```

Когда мы сделали:

```java
map.put(key, "Ritesh");
```

ключ был:

```text
[1, 2]
```

У него был один
hashCode.

Но потом:

```java
key.add(3);
```

ключ стал:

```text
[1, 2, 3]
```

И его
hashCode изменился.

HashMap уже положил объект в bucket по старому hash, а при get() ищет по новому.

Схема:

```text
put()

[1,2]
hash = X

bucket X


key.add(3)

[1,2,3]
hash = Y


get()

ищем bucket Y
→ запись не найдена
```

Главное правило:

❌ Не изменяйте объект после того, как использовали его как ключ в
HashMap.

Лучше использовать:

String
Integer
record
✅ immutable-объекты

Например:

```java
Map<List<Integer>, String> map = new HashMap<>();

List<Integer> key = List.of(1, 2);

map.put(key, "value");
```

Самые опасные баги в Java - те, где объект всё ещё существует, ссылка всё та же, но структура данных уже не может его нормально найти.

#java #backend #programming
  • ❤ 1
More from @java_quizes
  1. Aug 22, 2026Post #254
  2. Aug 22, 2026photo post
  3. Aug 22, 2026Вам доклады по Go или Java? VK приглашает на митап с двойной начинкой 26 августа VK собира…
  4. Jul 19, 2026Post #250
  5. Jul 19, 2026❓Что из вариантов лучше всего описывается определением: Операция, которая содержит серию з…
  6. Jul 2, 2026Post #248
Threads Profile ViewerView any public Threads profile without an account.Open ThreadLook →Writing with AI? Make it sound human.Metric37 rewrites AI drafts so they read naturally. Free AI detector, 1,500 words free.Try Metric37 →