Подтвердить что ты не робот

Почему Hashtable не разрешает нулевые ключи или значения?

Как указано в документации JDK, Hashtable не разрешает нулевые ключи или значения. HashMap позволяет использовать один нулевой ключ и любое количество нулевых значений. Почему это?

4b9b3361

Ответ 1

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

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

Edit

От Hashtable JavaDoc:

Чтобы успешно сохранять и извлекать объекты из Hashtable, объекты, используемые в качестве ключей, должны реализовывать метод hashCode и метод equals.

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

Ответ 2

Так как в HashTable, когда вы помещаете элемент, он учитывает хэш ключа и значения. В основном у вас будет что-то вроде:

public Object put(Object key, Object value){

key.hashCode();

etc...

value.hashCode();

}

Пока в HashMap, если он равен нулю, он вычислит ключ в соответствии со значением. Тем не менее, мне лично не нравится добавлять нулевую запись.

Ответ 3

Причиной является причина принятого ответа: Hashtable - старый.

Однако использование Hashtable НЕ отчаивается в пользу HashMap в каждом сценарии.

  • Hashtable синхронизируется, поэтому THREAD-SAFE. HashMap не работает.

Ни Hashtable, ни ConcurrentHashMap не поддерживают нулевые ключи или значения. HashMap делает.

Если вам нужна замена для замены, которая не требует ничего, кроме изменения класса и работает в каждом сценарии, их нет. Наиболее похожим вариантом будет ConcurrentHashMap (который является потокобезопасным, но не поддерживает блокировку всей таблицы):

Этот класс полностью совместим с Hashtable в программах, которые полагаются по безопасности потока, но не по деталям синхронизации.

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

Источники:

Ответ 4

поэтому заключить

Так как в HashTable, когда вы помещаете элемент, он учитывает хэш ключа и значения. В основном у вас будет что-то вроде:

public Object put(Object key, Object value){

    key.hashCode();

    //some code

    value.hashCode();

}

HashTable - не разрешает нулевые ключи Это связано с тем, что в методе put (K key, V value) у нас есть key.hashcode(), который выдает исключение из null-указателя. HashTable - не разрешает нулевое значение Это связано с тем, что в методе put (K key, V value) мы имеем if (value == null) {throw new NullPointerException

HashMap допускает нулевые значения, поскольку он не имеет таких проверок, как HashTable, в то время как он допускает только один нулевой ключ. Это делается с помощью метода putForNullKey, который добавляет значение к 0-му индексу внутреннего массива каждый раз, когда ключ предоставляется как null

Ответ 5

Хэш-таблица - очень старый класс, от JDK 1.0

Чтобы понять это, прежде всего нам нужно понять комментарии, написанные автором в этом классе. "Этот класс реализует хэш-таблицу, которая отображает ключи к значениям. Любой ненулевой объект может использоваться как ключ или как значение. Чтобы успешно хранить и извлекать объекты из хеш-таблицы, объекты, используемые в качестве ключей, должны реализовывать hashCode и метод equals. "

Класс HashTable реализован в хэш-механизме, это означает сохранение любой пары ключ-значение, требуемый хэш-код ключевого объекта. Если ключ будет null, он не сможет выдавать хэш, он будет через исключение нулевого указателя и аналогичный случай для значения он бросает null, если значение равно null.

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

Для хеш-карты допустимы пустые ключи и есть нулевая проверка для ключей если ключ равен нулю, тогда этот элемент будет сохранен в нулевом местоположении в массиве Entry. нулевой ключ, который мы можем использовать для некоторого значения по умолчанию.

= > Синхронизируются методы Hashtable, они не блокируют блокировку объектов.

HashMap реализует, рассматривая его как специальную

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

Java 8 вы не можете вывести типы для хеш-таблицы.

private Map<String,String> hashtable = new Hashtable<>(); // Not Allowed

private Map<String,String> hashtable = new HashMap<>(); // Allowed

Ответ 6

HashTable - не разрешает нулевые ключи
Это связано с тем, что в методе put (K key, V value) мы имеем key.hashcode(), который генерирует исключение null-указателя.
HashTable - не разрешает нулевое значение
Это связано с тем, что в методе put (K key, V value) мы имеем if(value==null){throw new NullPointerException

HashMap допускает нулевые значения, поскольку он не имеет таких проверок, как HashTable, в то время как он допускает только один нулевой ключ. Это делается с помощью метода putForNullKey, который добавляет значение к 0-му индексу внутреннего массива каждый раз, когда ключ предоставляется как null