Хеширование используется Hashtable? - PullRequest
3 голосов
/ 28 декабря 2010

Какой метод хеширования используется в реализации Hashtable в Java?

Ответы [ 2 ]

6 голосов
/ 28 декабря 2010

В Java класс Object определяет метод int hashCode(). Каждый класс реализует это по-своему или не делает это вообще. Реализация по умолчанию вызывает System.identityHashCode(this).

Hashtable использует значение, возвращаемое hashCode(), но усекает его в соответствии с размером таблицы.

Кстати, Hashtable стар. Если вы хотите использовать его, вы должны использовать HashMap или ConcurrentHashMap.

3 голосов
/ 28 декабря 2010

@ Барт прав, но я хотел показать вам, как вы можете узнать это из исходного кода Hashtable. Источник доступен здесь . Ищите hash(, и вы найдете эту функцию:

119           public int getKeyHash() {
120               return key.hashCode();
121           }

Если мы посмотрим на несколько строк вверх, мы обнаружим, что key - это любое Object:

 89       private static class Entry<K, V> extends MapEntry<K, V> {
 90           Entry<K, V> next;

Затем мы рассмотрим случайный класс, такой как String, и обнаружим, что у него есть метод hashCode(). Затем мы также смотрим на класс Object, чтобы найти его также имеет метод hashCode(). Поэтому любой объект (поскольку все они наследуются от Object) имеет метод hashCode().

Из любопытства мы посмотрим на источник для Object и найдем это:

 33     public int hashCode() {
 34         return VMMemoryManager.getIdentityHashCode(this);
 35     }

Бинго!

...