Какого размера подкапотный массив HashSet если добавить два значения с hashCode равный 0 и hashCode равный 1000000

«Какого размера подкапотный массив HashSet если добавить два значения с hashCode равный 0 и hashCode равный 1000000» — вопрос из категории Java, который задают на 23% собеседований Android Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

Размер подкапотного массива (capacity) HashSet (на основе HashMap) по умолчанию — 16. При добавлении элементов массив увеличивается, когда нагрузка (load factor, по умолчанию 0.75) превышена.

Для двух элементов с hashCode = 0 и hashCode = 1_000_000:

  1. Хэш нормализуется: hash = key.hashCode() ^ (key.hashCode() >>> 16).
  2. Индекс определяется: 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