public V put(K key, V value) {
return putVal(hash(key), key, value, false, true);
}
static final int hash(Object key) {
int h;
return (key == null) ? 0 : (h = key.hashCode()) ^ (h >>> 16); //видно, что на знак всем пофиг, а это нужно, чтобы учесть старшие биты хешкода, тк см ниже
}
final V putVal(int hash, K key, V value, boolean onlyIfAbsent, boolean evict) {
...
tab[i = (n - 1) & hash] // это возможно, тк n - степень двойки, соответственно n-1 будет иметь вид 0b0..01..1. Здесь старшие биты просто не учитываются, соотвественно, их немного учли выше.
...
На собеседовании спросили. "Поскольку объект меняет местоположение в памяти, как же дефолтовый хеш код остается неизменным, если он завязан на память".Я много собеседую. Такую дурость я не спрашиваю, это детали реализации, ты не обязан их знать, если только ты собеседуешься не на разработчика компиляторов. Я, например, этого не знаю, и знать мне это абсолютно не нужно. Можно предположить, что несмотря на изменение физического расположения объекта в памяти, некий internal address остаётся у него неизменным. Возможно, рассуждений в таком духе от тебя и ожидали.
никогда прямо не скажут ничего
ребята, хотите изучить джаву? нет проблем, открываем исходники и читаемТо, что ты спрашиваешь, это не изучение джавы, это изучение незначительных(для прикладного разработчика) деталей реализации JVM.
Заругают, когда руки дойдут, или засветишься гденить хорошо. если на требования не выполнишь - прикроют.