Java String: действительно ли хэш-код является хэш-значением? - PullRequest
4 голосов
/ 27 января 2012

A hastable использует некоторую хеш-функцию для хранения объекта.

Эта хеш-функция по существу вычисляет положение объекта в таблице.

Если мы используем HashTable или HashMap, а размер не может вместить больше элементов, то эти коллекции изменяются, чтобы вместить больше элементов.
Это означает, что каждый сохраненный элемент должен быть повторно обработан для вычисленияновая позиция в новом большем столе.

У меня следующий вопрос (что вышеизложенное верно):
Я прочитал, что String вычисляет его hashcode, используя символы, которые он хранит, и дополнительно, что hashvalue хранится внутри(кэшируется) для лучшей производительности, так как не нужно пересчитывать.

Это часть, которую я не понимаю. Если hashcode основан на символах, которые хранит String, то как рассчитывается позиция в hashtable?

Есть ли какая-то дополнительная логика, использующая hashcode из String?То есть String hashcode на самом деле не hashvalue?

1 Ответ

2 голосов
/ 27 января 2012

Хеш-код не изменяется. Только позиция во внутренней таблице есть. Откройте HashMap и посмотрите:

static int indexFor(int h, int length) {
    return h & (length-1);
}

Индекс в таблице (собственно массив) определяется на основе хеша и размера массива.

Итак, когда происходит «перефразировка», он использует тот же хеш-код, но другой длины, что означает, что элемент помещается в другое ведро.

...