Разница между HashTable и HashMap
Во-первых, унаследованные родительские классы различны.
Hashtable наследуется от класса Dictionary, а HashMap — от класса AbstractMap. Но оба реализуют интерфейс Map.
Скопируйте код кода следующим образом:
общедоступный класс Hashtable<K,V>
расширяет словарь<K,V>
реализует Map<K,V>, Cloneable, Serializable
общедоступный класс HashMap<K,V>
расширяет AbstractMap<K,V>
реализует Map<K,V>, Cloneable, Serializable
Во-вторых, потокобезопасность другая.
Методы в Hashtable синхронизированы, а методы в HashMap по умолчанию не синхронизированы. В многопоточной параллельной среде вы можете использовать Hashtable напрямую, не синхронизируя ее методы самостоятельно. Однако при использовании HashMap вы должны добавить обработку синхронизации самостоятельно.
В-третьих, стоит ли предоставлять метод contains?
HashMap удалил метод contains из Hashtable и заменил его на containsValue и containsKey, поскольку метод contains легко вводит в заблуждение.
Hashtable сохраняет три метода: contains, containsValue и containsKey, среди которых contains и containsValue имеют одинаковые функции.
В-четвертых, допускают ли ключ и значение нулевые значения.
И ключ, и значение являются объектами и не могут содержать повторяющиеся ключи, но могут содержать повторяющиеся значения.
В Hashtable не допускаются нулевые значения как в ключе, так и в значении.
В HashMap в качестве ключа можно использовать значение null, и такой ключ может быть только один; может быть один или несколько ключей, соответствующее значение которого равно нулю; Когда метод get() возвращает нулевое значение, возможно, ключ не существует в HashMap или значение, соответствующее ключу, может быть нулевым. Поэтому в HashMap метод get() нельзя использовать для определения наличия определенного ключа в HashMap, но для определения следует использовать метод containsKey().
В-пятых, внутренняя реализация двух методов обхода различна.
И Hashtable, и HashMap используют Iterator. По историческим причинам Hashtable также использует перечисление.
В-шестых, хэш-значения разные.
Использование хэш-значений отличается. HashTable напрямую использует хэш-код объекта. А HashMap пересчитывает значение хеш-функции.
В-седьмых, внутренняя реализация использует различные методы инициализации и расширения массива.
Начальный размер и методы расширения массивов в двух внутренних реализациях Hashtable и HashMap. Размер хеш-массива в HashTable по умолчанию равен 11, а метод увеличения — old*2+1.
Размер хеш-массива в HashMap по умолчанию равен 16, и он должен быть экспонентой 2.