До сих пор я знаю, что после перезагрузки в HashMap все записи перерисовываются с новой длиной таблицы. Но я хочу знать, что произойдет, когда у меня будут столкновения.Могут ли элементы, хранящиеся в одном ковше, переназначаться, чтобы разделить ведра после повторной посылки?
например.
Map<String, String> map = new HashMap<>(5);
map.put("a", "ape");
map.put("b", "bird");
map.put("c", "chicken");
Пусть они имеют разные hashcodes, но "b"
и "c"
сохраняются в том же ведре после внутреннего хэширования.
Теперь я вставить четвертую запись, чтобы достигнуть коэффициента нагрузки поэтому перефразируя таблицу:
map.put("d", "dynamite");
Могут ли записи с соударений храниться в отдельных ведер, или они всегда будут вместе (в обратном порядке по из того, что я читал) ?.
Я полагаю, что ответ на заголовок - нет, потому что я получаю такое же внутреннее хеширование для
"b"
и
"c"
, но я не уверен.
Спасибо, просто для того, чтобы быть лаконичным маскам и мод mod дают тот же результат? – EMER
@EMER Да, предположим, что мы использовали более короткие хэши, всего 5 бит. Объект A имеет хэш-код (двоичный), равный 11000, объект B имеет хеш-код 10000. Для массива длиной 8 мы используем битовую маску из 3 бит, в результате чего в обоих случаях ведро 000. Если мы увеличим размер массива до 16 и будем использовать 4 бита для маски, объект A будет в ведре 1000, но объект B будет в 0000: поэтому они попадают в разные ведра с большим массивом. –