Класс Hashtable<K, V>
- Параметры типа:
K— тип ключей, хранящихся в этой картеV— тип сопоставленных значений
- Все реализуемые интерфейсы:
Serializable, Cloneable, Map<K,V>
- Известные прямые подклассы:
Properties, UIDefaults
public class Hashtable<K,V> extends Dictionary<K,V> implements Map<K,V>, Cloneable, Serializable
null. Для успешного сохранения и извлечения объектов из хеш-таблицы объекты, используемые в качестве ключей, должны реализовывать метод hashCode и метод equals.
Экземпляр Hashtable имеет два параметра, влияющих на его производительность: начальная ёмкость и коэффициент загрузки. Ёмкость — это количество корзин в хеш-таблице, а начальная ёмкость — это просто ёмкость на момент создания хеш-таблицы. Обратите внимание, что хеш-таблица является открытой: в случае «коллизии хешей» в одной корзине хранится несколько записей, которые необходимо искать последовательно. Коэффициент загрузки определяет, насколько заполненной может стать хеш-таблица до автоматического увеличения её ёмкости. Параметры начальной ёмкости и коэффициента загрузки являются лишь рекомендациями для реализации. Точные условия и момент вызова метода rehash зависят от реализации.
Как правило, коэффициент загрузки по умолчанию (.75) обеспечивает хороший компромисс между затратами времени и памяти. Более высокие значения уменьшают накладные расходы памяти, но увеличивают затраты времени на поиск записи (что отражается на большинстве операций Hashtable, включая get и put).
Начальная ёмкость позволяет найти компромисс между потерей свободного пространства и необходимостью выполнения операций rehash, которые требуют значительных затрат времени. Операции rehash никогда не будут выполняться, если начальная ёмкость превышает максимальное количество записей, которое будет содержать Hashtable, делённое на коэффициент загрузки. Однако слишком высокая начальная ёмкость может привести к потере пространства.
Если в Hashtable планируется добавить много записей, создание объекта с достаточно большой ёмкостью может повысить эффективность добавления записей по сравнению с автоматическим перехешированием по мере необходимости для увеличения таблицы.
В этом примере создаётся хеш-таблица чисел. В качестве ключей используются названия чисел:
Hashtable<String, Integer> numbers
= new Hashtable<String, Integer>();
numbers.put("one", 1);
numbers.put("two", 2);
numbers.put("three", 3); Чтобы получить число, используйте следующий код:
Integer n = numbers.get("two");
if (n != null) {
System.out.println("two = " + n);
} Итераторы, возвращаемые методом iterator коллекций, возвращаемых всеми «методами представления коллекций» этого класса, являются быстро отказывающими: если после создания итератора структура Hashtable каким-либо образом изменяется, кроме как посредством собственного метода remove итератора, итератор выбрасывает исключение ConcurrentModificationException. Таким образом, при параллельном изменении итератор быстро и корректно завершает работу, не рискуя привести к произвольному недетерминированному поведению в неопределённый момент в будущем. Перечисления, возвращаемые методами keys и elements класса Hashtable, не являются быстро отказывающими: если после создания перечисления структура Hashtable изменяется, результаты перечисления не определены.
Обратите внимание, что гарантировать быстрое завершение работы итератора при ошибке нельзя, поскольку, вообще говоря, невозможно дать какие-либо строгие гарантии при наличии несинхронизированного параллельного изменения. Быстро отказывающие итераторы выбрасывают ConcurrentModificationException по возможности. Поэтому полагаться на это исключение для обеспечения корректности программы неправильно: быстрое завершение работы итераторов при ошибке следует использовать только для обнаружения ошибок.
Начиная с платформы Java 2 v1.2, этот класс был доработан для реализации интерфейса Map, благодаря чему он стал частью Java Collections Framework. В отличие от новых реализаций коллекций, Hashtable является синхронизированным. Если потокобезопасная реализация не требуется, рекомендуется использовать HashMap вместо Hashtable. Если нужна потокобезопасная высокопараллельная реализация, рекомендуется использовать ConcurrentHashMap вместо Hashtable.
- Начиная с версии:
- 1.0
- См. также:
Краткое описание конструкторов
| Конструктор | Описание |
|---|---|
Hashtable() |
Создаёт новую пустую хеш-таблицу с начальной ёмкостью по умолчанию (11) и коэффициентом загрузки (0.75). |
Hashtable |
Создаёт новую пустую хеш-таблицу с указанной начальной ёмкостью и коэффициентом загрузки по умолчанию (0.75). |
Hashtable |
Создаёт новую пустую хеш-таблицу с указанными начальной ёмкостью и коэффициентом загрузки. |
Hashtable |
Создаёт новую хеш-таблицу с теми же соответствиями, что и указанная Map. |
Краткое описание методов
| Модификатор и тип | Метод | Описание |
|---|---|---|
void |
clear() |
Очищает эту хеш-таблицу, удаляя все ключи. |
Object |
clone() |
Создаёт поверхностную копию этой хеш-таблицы. |
V |
compute |
Пытается вычислить соответствие для указанного ключа и текущего сопоставленного ему значения либо null, если соответствия нет (необязательная операция). |
V |
computeIfAbsent |
Если указанному ключу ещё не сопоставлено значение (или ему сопоставлено null), пытается вычислить его значение с помощью заданной функции сопоставления и добавляет его в эту карту, если результат не равен null (необязательная операция). |
V |
computeIfPresent |
Если для указанного ключа имеется ненулевое значение, пытается вычислить новое соответствие на основе ключа и текущего сопоставленного ему значения (необязательная операция). |
boolean |
contains |
Проверяет, сопоставлен ли какой-либо ключ с указанным значением в этой хеш-таблице. |
boolean |
containsKey |
Проверяет, является ли указанный объект ключом в этой хеш-таблице. |
boolean |
containsValue |
Возвращает true, если эта хеш-таблица сопоставляет один или несколько ключей с этим значением. |
Enumeration |
elements() |
Возвращает перечисление значений этой хеш-таблицы. |
Set |
entrySet() |
Возвращает представление содержащихся в этой карте соответствий в виде Set. |
boolean |
equals |
Сравнивает указанный объект с этой Map на равенство согласно определению интерфейса Map. |
V |
get |
Возвращает значение, сопоставленное с указанным ключом, или null, если эта карта не содержит соответствия для данного ключа. |
int |
hashCode() |
Возвращает хеш-код этой Map согласно определению интерфейса Map. |
boolean |
isEmpty() |
Проверяет, сопоставляет ли эта хеш-таблица значениям какие-либо ключи. |
Enumeration |
keys() |
Возвращает перечисление ключей этой хеш-таблицы. |
Set |
keySet() |
Возвращает представление содержащихся в этой карте ключей в виде Set. |
V |
merge |
Если указанному ключу ещё не сопоставлено значение или ему сопоставлено null, сопоставляет с ним заданное ненулевое значение (необязательная операция). |
V |
put |
Сопоставляет указанный key с указанным value в этой хеш-таблице. |
void |
putAll |
Копирует все соответствия из указанной карты в эту хеш-таблицу. |
protected void |
rehash() |
Увеличивает ёмкость и внутренне реорганизует эту хеш-таблицу, чтобы обеспечить более эффективное размещение и доступ к её записям. |
V |
remove |
Удаляет ключ (и соответствующее ему значение) из этой хеш-таблицы. |
int |
size() |
Возвращает количество ключей в этой хеш-таблице. |
String |
toString() |
Возвращает строковое представление объекта Hashtable в виде набора записей, заключённых в фигурные скобки и разделённых символами ASCII « , » (запятая и пробел). |
Collection |
values() |
Возвращает представление содержащихся в этой карте значений в виде Collection. |
Методы, объявленные в интерфейсе Map
forEach, getOrDefault, putIfAbsent, remove, replace, replace, replaceAll
Подробное описание конструкторов
Hashtable
public Hashtable(int initialCapacity, float loadFactor)
- Параметры:
-
initialCapacity— начальная емкость хеш-таблицы. -
loadFactor— коэффициент загрузки хеш-таблицы. - Исключения:
-
IllegalArgumentException— если начальная емкость меньше нуля или коэффициент загрузки неположителен.
Hashtable
public Hashtable(int initialCapacity)
- Параметры:
-
initialCapacity— начальная емкость хеш-таблицы. - Исключения:
-
IllegalArgumentException— если начальная емкость меньше нуля.
Hashtable
public Hashtable()
Hashtable
public Hashtable(Map<? extends K, ? extends V> t)
- Параметры:
-
t— карта, отображения которой необходимо поместить в эту карту. - Исключения:
-
NullPointerException— если заданная карта равна null. - Начиная с версии:
- 1.2
Подробное описание методов
size
isEmpty
keys
public Enumeration<K> keys()
- Определено в:
-
keysв классеDictionary<K,V> - Возвращает:
- перечисление ключей этой хеш-таблицы.
- См. также:
elements
public Enumeration<V> elements()
- Определено в:
-
elementsв классеDictionary<K,V> - Возвращает:
- перечисление значений этой хеш-таблицы.
- См. также:
contains
public boolean contains(Object value)
containsKey. Обратите внимание, что этот метод функционально идентичен методу containsValue, который является частью интерфейса Map в платформе коллекций.
- Параметры:
-
value— значение для поиска - Возвращает:
-
trueтогда и только тогда, когда какой-либо ключ сопоставлен аргументуvalueв этой хеш-таблице, согласно методуequals;falseв противном случае. - Исключения:
-
NullPointerException— если значение равноnull
containsValue
public boolean containsValue(Object value)
Обратите внимание, что этот метод функционально идентичен методу contains (который появился до интерфейса Map).
- Определено в:
-
containsValueв интерфейсеMap<K,V> - Параметры:
-
value— значение, наличие которого в этой хеш-таблице необходимо проверить - Возвращает:
-
true, если эта карта сопоставляет одно или несколько ключей указанному значению - Исключения:
-
NullPointerException— если значение равноnull - Начиная с версии:
- 1.2
containsKey
public boolean containsKey(Object key)
- Определено в:
-
containsKeyв интерфейсеMap<K,V> - Параметры:
-
key— возможный ключ - Возвращает:
-
trueтогда и только тогда, когда указанный объект является ключом этой хеш-таблицы согласно методуequals;falseв противном случае. - Исключения:
-
NullPointerException— если ключ равенnull - См. также:
get
public V get(Object key)
null, если эта карта не содержит отображения для ключа. Формально, если эта карта содержит отображение ключа k в значение v, такое что (key.equals(k)), этот метод возвращает v; в противном случае он возвращает null. (Такое отображение может быть не более чем одно.)
- Определено в:
-
getв интерфейсеMap<K,V> - Определено в:
-
getв классеDictionary<K,V> - Параметры:
-
key— ключ, значение которого необходимо вернуть - Возвращает:
- значение, которому сопоставлен указанный ключ, или
null, если эта карта не содержит отображения для ключа - Исключения:
-
NullPointerException— если указанный ключ равен null - См. также:
rehash
protected void rehash()
put
public V put(K key, V value)
key указанному value в этой хеш-таблице. Ни ключ, ни значение не могут быть null. Значение можно получить, вызвав метод get с ключом, равным исходному ключу.
- Определено в:
-
putв интерфейсеMap<K,V> - Определено в:
-
putв классеDictionary<K,V> - Параметры:
-
key— ключ хеш-таблицы -
value— значение - Возвращает:
- предыдущее значение указанного ключа в этой хеш-таблице или
null, если его не было - Исключения:
-
NullPointerException— если ключ или значение равныnull - См. также:
remove
public V remove(Object key)
- Определено в:
-
removeв интерфейсеMap<K,V> - Определено в:
-
removeв классеDictionary<K,V> - Параметры:
-
key— ключ, который необходимо удалить - Возвращает:
- значение, которому соответствовал ключ в этой хеш-таблице, или
null, если для ключа не было отображения - Исключения:
-
NullPointerException— если ключ равенnull
putAll
public void putAll(Map<? extends K, ? extends V> t)
- Определено в:
-
putAllв интерфейсеMap<K,V> - Параметры:
-
t— отображения, которые необходимо сохранить в этой карте - Исключения:
-
NullPointerException— если указанная карта равна null - Начиная с версии:
- 1.2
clear
clone
toString
public String toString()
Hashtable в виде набора записей, заключенных в фигурные скобки и разделенных символами ASCII " , " (запятая и пробел). Каждая запись представляется в виде ключа, знака равенства = и соответствующего элемента; для преобразования ключа и элемента в строки используется метод toString.keySet
public Set<K> keySet()
Set. Множество поддерживается картой, поэтому изменения карты отражаются в множестве, и наоборот. Если карта изменена во время итерации по множеству (за исключением изменений с помощью собственной операции remove итератора), результаты итерации не определены. Множество поддерживает удаление элементов, которое удаляет соответствующее отображение из карты, с помощью операций Iterator.remove, Set.remove, removeAll, retainAll и clear. Операции add и addAll не поддерживаются.entrySet
public Set<Map.Entry<K,V>> entrySet()
Set. Множество поддерживается картой, поэтому изменения карты отражаются в множестве, и наоборот. Если карта изменена во время итерации по множеству (за исключением изменений с помощью собственной операции remove итератора или операции setValue для записи карты, возвращенной итератором), результаты итерации не определены. Множество поддерживает удаление элементов, которое удаляет соответствующее отображение из карты, с помощью операций Iterator.remove, Set.remove, removeAll, retainAll и clear. Операции add и addAll не поддерживаются.values
public Collection<V> values()
Collection. Коллекция поддерживается картой, поэтому изменения карты отражаются в коллекции, и наоборот. Если карта изменена во время итерации по коллекции (за исключением изменений с помощью собственной операции remove итератора), результаты итерации не определены. Коллекция поддерживает удаление элементов, которое удаляет соответствующее отображение из карты, с помощью операций Iterator.remove, Collection.remove, removeAll, retainAll и clear. Операции add и addAll не поддерживаются.equals
public boolean equals(Object o)
hashCode
computeIfAbsent
public V computeIfAbsent(K key, Function<? super K, ? extends V> mappingFunction)
null), пытается вычислить значение с помощью заданной функции отображения и добавить его в эту карту, если результат не равен null (необязательная операция). Если функция отображения возвращает null, отображение не сохраняется. Если сама функция отображения выбрасывает (непроверяемое) исключение, оно повторно выбрасывается, а отображение не сохраняется. Чаще всего этот метод используется для создания нового объекта в качестве начального сопоставленного значения или мемоизированного результата, например:
map.computeIfAbsent(key, k -> new Value(f(k)));
Или для реализации карты с несколькими значениями, Map<K,Collection<V>>, поддерживающей несколько значений для каждого ключа:
map.computeIfAbsent(key, k -> new HashSet<V>()).add(v);
Во время вычисления функция отображения не должна изменять эту карту.
Этот метод приложит все разумные усилия, чтобы выбросить ConcurrentModificationException, если функция отображения изменит эту карту во время вычисления.
- Определено в:
-
computeIfAbsentв интерфейсеMap<K,V> - Параметры:
-
key— ключ, с которым необходимо связать указанное значение -
mappingFunction— функция отображения для вычисления значения - Возвращает:
- текущее (существующее или вычисленное) значение, связанное с указанным ключом, или null, если вычисленное значение равно null
- Исключения:
-
ConcurrentModificationException— если обнаружено, что функция отображения изменила эту карту
computeIfPresent
public V computeIfPresent(K key, BiFunction<? super K, ? super V, ? extends V> remappingFunction)
Если функция переназначения возвращает null, отображение удаляется. Если сама функция переназначения выбрасывает (непроверяемое) исключение, оно повторно выбрасывается, а текущее отображение остается без изменений.
Во время вычисления функция переназначения не должна изменять эту карту.
Этот метод приложит все разумные усилия, чтобы выбросить ConcurrentModificationException, если функция переназначения изменит эту карту во время вычисления.
- Определено в:
-
computeIfPresentв интерфейсеMap<K,V> - Параметры:
-
key— ключ, с которым необходимо связать указанное значение -
remappingFunction— функция переназначения для вычисления значения - Возвращает:
- новое значение, связанное с указанным ключом, или null, если такого значения нет
- Исключения:
-
ConcurrentModificationException— если обнаружено, что функция переназначения изменила эту карту
compute
public V compute(K key, BiFunction<? super K, ? super V, ? extends V> remappingFunction)
null, если текущего отображения нет (необязательная операция). Например, чтобы создать или дополнить String msg для сопоставления значения: map.compute(key, (k, v) -> (v == null) ? msg : v.concat(msg)) (Для этих целей часто удобнее использовать метод merge().) Если функция переназначения возвращает null, отображение удаляется (или остается отсутствующим, если изначально его не было). Если сама функция переназначения выбрасывает (непроверяемое) исключение, оно повторно выбрасывается, а текущее отображение остается без изменений.
Во время вычисления функция переназначения не должна изменять эту карту.
Этот метод приложит все разумные усилия, чтобы выбросить ConcurrentModificationException, если функция переназначения изменит эту карту во время вычисления.
- Определено в:
-
computeв интерфейсеMap<K,V> - Параметры:
-
key— ключ, с которым необходимо связать указанное значение -
remappingFunction— функция переназначения для вычисления значения - Возвращает:
- новое значение, связанное с указанным ключом, или null, если такого значения нет
- Исключения:
-
ConcurrentModificationException— если обнаружено, что функция переназначения изменила эту карту
merge
public V merge(K key, V value, BiFunction<? super V, ? super V, ? extends V> remappingFunction)
null. Этот метод может быть полезен при объединении нескольких сопоставленных значений для одного ключа. Например, чтобы создать или дополнить String msg для сопоставления значения: map.merge(key, msg, String::concat)
Если функция переназначения возвращает null, отображение удаляется. Если сама функция переназначения выбрасывает (непроверяемое) исключение, оно повторно выбрасывается, а текущее отображение остается без изменений.
Во время вычисления функция переназначения не должна изменять эту карту.
Этот метод приложит все разумные усилия, чтобы выбросить ConcurrentModificationException, если функция переназначения изменит эту карту во время вычисления.
- Определено в:
-
mergeв интерфейсеMap<K,V> - Параметры:
-
key— ключ, с которым необходимо связать результирующее значение -
value— ненулевое значение, которое необходимо объединить с существующим значением, связанным с ключом, либо связать с ключом, если существующего значения нет или с ключом связано значение null -
remappingFunction— функция переназначения для повторного вычисления значения, если оно имеется - Возвращает:
- новое значение, связанное с указанным ключом, или null, если с ключом не связано ни одного значения
- Исключения:
-
ConcurrentModificationException— если обнаружено, что функция переназначения изменила эту карту
© 1993, 2025, Oracle and/or its affiliates. All rights reserved.
Documentation extracted from Debian's OpenJDK Development Kit package.
Licensed under the GNU General Public License, version 2, with the Classpath Exception.
Various third party code in OpenJDK is licensed under different licenses (see Debian package).
Java and OpenJDK are trademarks or registered trademarks of Oracle and/or its affiliates.
https://docs.oracle.com/en/java/javase/25/docs/api/java.base/java/util/Hashtable.html