1. разница между HashMap и Hashtable
Давайте сначала посмотрим на определение двух классов
Hashtable Public Class Extends Dictionary реализует карту, клонируемый, java.io.serializable
Hashmap Public Class расширяет AbstractMap реализует карту, клонируемый, сериализуемый
Можно видеть, что хэштатные наследие от словаря и хэшмапа наследуют от AbstractMap
Метод пута хэштата выглядит следующим образом
public Synchronized v Put (k Key, v value) {// ######### Примечание здесь 1 // Убедитесь, что значение не является null if (value == null) {// ####### Примечание здесь 2 бросьте New NullPointerException (); } // Убедитесь, что ключ еще не в хэштебе. Вкладка входа [] = таблица; int hash = key.hashcode (); // ######## Примечание здесь 3 int index = (hash & 0x7fffffff) % tab.length; for (запись e = tab [index]; e! = null; e = e.next) {if (e.hash == hash) && e.key.equals (key)) {v old = e.value; e.value = значение; вернуться старым; }} modcount ++; if (count> = threshold) {// перефразируется таблица, если порог превышен rehash (); Tab = таблица; index = (hash & 0x7ffffffff) % tab.length; } // Создает новую запись. Вход E = Tab [Index]; Tab [index] = новая запись (хэш, ключ, значение, E); count ++; вернуть ноль; } Примечание 1 Метод синхронно
Примечание 2 Метод не разрешает значение == NULL
Примечание 3 Метод вызывает метод хэшкода ключа. Если Key == NULL, будет брошено исключение NULL Pointer. Метод посадки HashMap заключается в следующем.
public v put (k key, v value) {// ########## Примечание здесь 1 if (key == null) // ######### Примечание здесь 2 return putfornullkey (value); int hash = hash (key.hashcode ()); int i = indexfor (hash, table.length); for (inpit e = table [i]; e! = null; e = e.next) {объект k; if (e.hash == hash && ((k = e.key) == key || key.equals (k))) {v oldvalue = e.value; e.value = значение; e.recordaccess (это); вернуть OldValue; }} modcount ++; AddEntry (хэш, ключ, значение, i); // ######## Примечание здесь возвращает null; } Примечание 1 Метод асинхронно
Примечание 2 Метод разрешает ключ == null
ПРИМЕЧАНИЕ 3 Метод не выполняет никаких вызовов к значению, поэтому ему разрешено быть нулевым.
Пополнить:
Hashtable имеет метод содержимого, который может легко вызвать недоразумения, поэтому он был удален в HashMap.
Конечно, оба класса используют содержимый и содержит методы.
| Hashmap | Хэштат | |
| Родительский класс | AbstractMap | Словарь |
| Это синхронизировано | нет | да |
| k, может v null | да | нет |
HashMap-это легкая реализация хэштата (реализация без ratread). Все они завершают интерфейс карты. Основное отличие состоит в том, что HashMap позволяет нулевые ключи. Из-за непреодолимого, это может быть более эффективным, чем хэштата.
HashMap позволяет NULL в качестве ключа или значения записи, а Hashtable - нет.
HashMap Удаляет хэштаб, содержит метод и изменяет его на содержит Value и содержит. Потому что метод содержит легко вызвать недоразумение.
Hashtable от наследства от класса словаря, а HashMap - это реализация интерфейса карты, представленной Java 1.2.
Самое большое отличие состоит в том, что хэштатный метод синхронизируется, а Hashmap - нет. Когда несколько потоков получают доступ к хэштебе, им не нужно синхронизировать для самих его методов, и Hashmap должен обеспечивать внешнюю синхронизацию (Collections.synchronizedMap).
Алгоритмы хэш/перефразировки, используемые хэштабильными и хешмапом, примерно одинаковы, поэтому не будет большой разницы в производительности.
Суммировать:
Ключевые значения в HashMap разрешены пустыми и асинхронны
Ключевое значение в хэштебе не разрешено быть нулевым и синхронизировано
Наследование отличается, но оба реализуют интерфейс карты
Выше всего содержание этой статьи. Я надеюсь, что это будет полезно для каждого обучения, и я надеюсь, что все будут поддерживать Wulin.com больше.