Ответ
Размер подкапотного массива (capacity) HashSet (на основе HashMap) по умолчанию — 16. При добавлении элементов массив увеличивается, когда нагрузка (load factor, по умолчанию 0.75) превышена.
Для двух элементов с hashCode = 0 и hashCode = 1_000_000:
- Хэш нормализуется:
hash = key.hashCode() ^ (key.hashCode() >>> 16). - Индекс определяется:
index = (capacity - 1) & hash.
Даже при большом hashCode индекс укладывается в границы массива. Если capacity = 16, то:
- Для
0:index = 15 & 0 = 0 - Для
1_000_000:index = 15 & (1_000_000 ^ 15) = некоторый индекс 0..15
Массив не увеличится, так как size = 2 < 12 (16 * 0.75).
Пример:
val set = HashSet<Int>()
set.add(0) // hashCode = 0
set.add(1_000_000) // hashCode = 1_000_000
println(set.size) // 2, capacity останется 16