Почему происходит изменение размера, если все элементы заканчиваются в одном буфере? - PullRequest
0 голосов
/ 08 июля 2019

Ниже приведен код для проверки поведения hashmap, когда все элементы заканчиваются в одном сегменте: -

public class DerivedMain {

int data = 10;

@Override
public int hashCode() {
    return data;
}

public static void main(String[] args) {

    HashMap m = new HashMap();
    for(int i=0;i<20;i++) {
        m.put(i, i);
    }

    Field tableField = null;
    try {
        tableField = HashMap.class.getDeclaredField("table");
    } catch (NoSuchFieldException | SecurityException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }
    tableField.setAccessible(true);
    Object[] table = null;
    try {
        table = (Object[]) tableField.get(m);
    } catch (IllegalArgumentException | IllegalAccessException e) 
            {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }
    System.out.println(table == null ? 0 : table.length);
}

}

Я получил следующий вывод: - 32

Почему происходит изменение размера, даже если все элементы заканчиваются в одном сегменте?

Ответы [ 2 ]

2 голосов
/ 08 июля 2019

Так как HashMap работает так:

Когда число записей в хеш-таблице превышает произведение коэффициента загрузки и текущей емкости, хеш-таблицаrehashed.

HashMap знает только, что, как только предел достигнут, вероятность коллизий становится слишком высокой, и он должен перефразировать, чтобы снизить эту вероятность и оставить место для будущих записей.Он предполагает хорошую реализацию hashCode и абсолютно не может узнать, вызваны ли коллизии действительно неудачей из-за плохой реализации hashCode.

0 голосов
/ 08 июля 2019

Вы можете отлаживать свой код, и тогда вы обнаружите, что метод 'hashcode', определенный в вашем классе 'DerivedMain', никогда не будет вызываться, поэтому все элементы не находятся в одном сегменте.Но настоящая причина, по которой вывод равен 32, заключается в том, что размер (20) hashmap превышает пороговое значение (table.size * loadfactor). Если вы хотите узнать больше рабочих деталей hashmap, вам следует прочитать исходный код в jdk.

...