Я думаю, что было бы лучше ответить с кодом и диаграммой.Мы все знаем, что это за функция хеширования (односторонняя).В основном он принимает произвольный ввод и возвращает число (в Java это int, но это не всегда так).И int в Java имеет 32 бита.Это означает, что оно может составлять от -2 147 483 648 до 2 147 483 647.Каждый объект в каждом существующем java-хипе может вычислить свой хеш (используя метод из класса java.util.Object), и он должен находиться в этом интервале.
Теперь давайте предположим, что у нас есть 3 объекта.
21234 = obj1.hashCode();
623424 = obj2.hashCode();
23124432 = obj3.hasCode();
и мы хотим добавить их в хэш-карту, содержащую 200 сегментов.(это не рабочий код Java, я набрал его здесь)
public class MyHashMap {
private final Buckets[] buckets = new Buckets[200];
public boolean add(Object object){
int resultModulo = object.hashCode() % 200;
buckets[buckets].add(object);
}
}
Теперь для окончательного мира.Для нашего объекта resultModulo
будет 34 (21234), 24 (623424), 32 (23124432).И вычисляемое число не будет превышать 200.
Массив выделяется как непрерывный кусок памяти.Просто массив указателей (64-битных), а не реальных объектов.Таким образом, bucktes [] выглядит примерно так
0xB80000xB80020xB80670xC1101 ....
1 2 3 4 .... 200
и поэтому, когда ваш код вызывает bucket [34], bucket [24], bucket [32], то, что аппаратное обеспечение делает так:
mov eax, bucktes[ecx*19]
; eax now contains the pointer to the
; 19 element in the array
; this is a one clock instruction
Так вот почему неважно, сколько у вас ведер.