Как указано в документации JDK, Hashtable не разрешает нулевые ключи или значения. HashMap позволяет использовать один нулевой ключ и любое количество нулевых значений. Почему это?
Почему Hashtable не разрешает нулевые ключи или значения?
Ответ 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