Ввод ключа как пустой строки или ноль в HashMap - PullRequest
0 голосов
/ 09 апреля 2019

В Hashmap для нулевого ключа индекс равен 0, но для пустой строки это будет индекс. Я отладил его и обнаружил, что он создает связанный список по 0-му индексу и сохраняет там оба значения.

Так почему пустое строковое значение хранится в 0-й позиции и если оно вычисляет индекс, используя хэш-карту пустой строки, то что будет хеш-код пустой строки.

HashMap<String, String> hm= new HashMap<>();
hm.put("", "");
hm.put(null, null);

Ответы [ 3 ]

1 голос
/ 09 апреля 2019

Хеш-код пустой строки будет 0, по крайней мере, в реализации Oracle 8 для Java.

Это фрагмент исходного кода `java.util.HashMap в Java 1.8 метода, используемого для вычисления хеша:

static final int hash(Object key) {
    int h;
    return (key == null) ? 0 : (h = key.hashCode()) ^ (h >>> 16);
}

Это соответствующий метод, который вычисляет хэш.

По сути, это то, как он вычисляет хэш-код пустой строки:

System.out.println(("".hashCode()) ^ ("".hashCode() >>> 16));

В любом случае хеш-код null будет 0. См. Код выше с помощью метода hash.

1 голос
/ 09 апреля 2019

Поскольку хеш-код для пустой строки возвращает 0, и это то же самое значение для нулевого объекта.Таким образом, у вас есть коллизия хеша, поэтому она переходит в ту же ячейку.

* По крайней мере, для текущей реализации в классе String - это может измениться однажды

0 голосов
/ 09 апреля 2019

Хеш-коды в Java должны соответствовать следующему требованию :

  • Всякий раз, когда он вызывается для одного и того же объекта более одного раза во время выполнения приложения Java, метод hashCode должен последовательно возвращать одно и то же целое число при условии, что никакая информация, используемая в сравнениях сравнения объекта, не изменяется. Это целое число не должно оставаться согласованным при выполнении одного приложения другим исполнением того же приложения.

Обратите внимание на последнее предложение. Это позволяет непредсказуемым хэш-кодам между различными запусками одного и того же приложения, что защищает от определенного класса атак отказа в обслуживании.

Таким образом, невозможно предсказать, каким будет хеш-код какого-либо конкретного объекта (будь то null или фактического объекта). Вы знаете только, что это будет одинаково для одного и того же объекта и для объектов, которые равны ему в соответствии с методом equals.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...