Spec-Zone.ru › OpenJDK 17

Класс Hashtable<K,V>

java.lang.Object
java.util.Dictionary<K,V>
java.util.Hashtable<K,V>
Type Parameters:
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 имеет два параметра, влияющих на его производительность: начальный размер и коэффициент заполнения. Размер — это количество корзин в хеш-таблице, а начальный размер — это просто размер в момент создания хеш-таблицы. Обратите внимание, что хеш-таблица является открытой: в случае «столкновения хешей» одна корзина хранит несколько записей, которые необходимо последовательно искать. Коэффициент заполнения — это мера того, насколько заполненной может быть хеш-таблица, прежде чем ее размер будет автоматически увеличен. Параметры начального размера и коэффициента заполнения являются лишь подсказками для реализации. Точные детали того, когда и нужно ли вызывать метод перехеширования, зависят от реализации.

Как правило, значение коэффициента заполнения по умолчанию (.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 коллекций, возвращаемых всеми методами «представления коллекций» этого класса, являются быстродействующими: если хеш-таблица структурно изменяется в любой момент после создания итератора любым способом, кроме метода самого итератора remove, итератор выбросит исключение ConcurrentModificationException. Таким образом, при одновременной модификации итератор быстро и четко завершает свою работу, а не рискует произвольным, непредсказуемым поведением в неопределенное время в будущем. Перечисления, возвращаемые методами хеш-таблицы keys и elements, не являются быстродействующими; если хеш-таблица структурно изменяется в любой момент после создания перечисления, результаты перечисления не определены.

Обратите внимание, что гарантия быстродействующего поведения итератора не может быть гарантирована, поскольку в целом невозможно дать какие-либо гарантии в случае несинхронизированной одновременной модификации. Быстродействующие итераторы выбрасывают исключение ConcurrentModificationException на основе наилучшего усилия. Поэтому было бы неправильно писать программу, которая полагалась бы на это исключение для своей корректности: быстрое поведение итераторов должно использоваться только для обнаружения ошибок.

Начиная с платформы Java 2 v1.2, этот класс был переработан для реализации интерфейса Map, что делает его частью Java Collections Framework. В отличие от новых реализаций коллекций, Hashtable синхронизирована. Если реализация, безопасная для потоков, не требуется, рекомендуется использовать HashMap вместо Hashtable. Если требуется высокопроизводительная реализация, безопасная для потоков, рекомендуется использовать ConcurrentHashMap вместо Hashtable.

С момента:
1.0
См. также:
  • Object.equals(java.lang.Object)
  • Object.hashCode()
  • rehash()
  • Collection
  • Map
  • HashMap
  • TreeMap
  • Формат сериализации

Краткое описание конструкторов

Конструктор Описание
Hashtable()
Создаёт новую пустую хеш-таблицу с начальным размером по умолчанию (11) и коэффициентом заполнения (0.75).
Hashtable(int initialCapacity)
Создаёт новую пустую хеш-таблицу со заданным начальным размером и коэффициентом заполнения по умолчанию (0.75).
Hashtable(int initialCapacity, float loadFactor)
Создаёт новую пустую хеш-таблицу со заданным начальным размером и заданным коэффициентом заполнения.
Hashtable(Map<? extends K,? extends V> t)
Создаёт новую хеш-таблицу с теми же сопоставлениями, что и в заданной Map.

Краткое описание методов

Модификатор и тип Метод Описание
void clear()
Очищает эту хеш-таблицу, чтобы она не содержала ключей.
Object clone()
Создаёт поверхностную копию этой хеш-таблицы.
V compute(K key, BiFunction<? super K,? super V,? extends V> remappingFunction)
Пытается вычислить отображение для указанного ключа и его текущего сопоставленного значения (или null, если текущего сопоставления нет).
V computeIfAbsent(K key, Function<? super K,? extends V> mappingFunction)
Если указанный ключ ещё не связан со значением (или связан с null), пытается вычислить его значение с помощью заданной функции сопоставления и записывает его в эту карту, если null.
V computeIfPresent(K key, BiFunction<? super K,? super V,? extends V> remappingFunction)
Если значение для указанного ключа присутствует и не равно null, пытается вычислить новое отображение, используя ключ и его текущее сопоставленное значение.
boolean contains(Object value)
Проверяет, отображается ли какой-либо ключ в указанное значение в этой хеш-таблице.
boolean containsKey(Object key)
Проверяет, является ли указанный объект ключом в этой хеш-таблице.
boolean containsValue(Object value)
Возвращает true, если эта хеш-таблица сопоставляет один или несколько ключей с этим значением.
Enumeration<V> elements()
Возвращает перечисление значений в этой хеш-таблице.
Set<Map.Entry<K,V>> entrySet()
Возвращает представление Set сопоставлений, содержащихся в этой карте.
boolean equals(Object o)
Сравнивает указанный объект с этой картой на равенство согласно определению в интерфейсе Map.
V get(Object key)
Возвращает значение, которому соответствует указанный ключ, или null, если эта карта не содержит сопоставления для ключа.
int hashCode()
Возвращает хеш-код значения для этой карты согласно определению в интерфейсе Map.
boolean isEmpty()
Проверяет, отображает ли эта хеш-таблица какие-либо ключи в значения.
Enumeration<K> keys()
Возвращает перечисление ключей в этой хеш-таблице.
Set<K> keySet()
Возвращает представление Set ключей, содержащихся в этой карте.
V merge(K key, V value, BiFunction<? super V,? super V,? extends V> remappingFunction)
Если указанный ключ не связан со значением или связан с null, связывает его с заданным ненулевым значением.
V put(K key, V value)
Сопоставляет указанный key с указанным value в этой хеш-таблице.
void putAll(Map<? extends K,? extends V> t)
Копирует все отображения из заданной карты в эту хеш-таблицу.
protected void rehash()
Увеличивает ёмкость и внутренне переупорядочивает эту хеш-таблицу, чтобы более эффективно размещать и получать доступ к её элементам.
V remove(Object key)
Удаляет ключ (и соответствующее значение) из этой хеш-таблицы.
int size()
Возвращает количество ключей в этой хеш-таблице.
String toString()
Возвращает строковое представление этого объекта Hashtable в виде набора записей, заключённых в фигурные скобки и разделённых символами ASCII " , " (запятая и пробел).
Collection<V> values()
Возвращает представление Collection значений, содержащихся в этой карте.

Методы, объявленные в классе java.lang.Object

finalize, getClass, notify, notifyAll, wait, wait, wait

Методы, объявленные в интерфейсе java.util.Map

forEach, getOrDefault, putIfAbsent, remove, replace, replace, replaceAll

Подробное описание конструкторов

Hashtable

public Hashtable(int initialCapacity, float loadFactor)
Создаёт новую пустую хеш-таблицу с заданной начальной ёмкостью и заданным коэффициентом заполнения.
Параметры:
initialCapacity - начальная ёмкость хеш-таблицы.
loadFactor - коэффициент заполнения хеш-таблицы.
Исключения:
IllegalArgumentException - если начальная ёмкость меньше нуля или если коэффициент заполнения неположителен.

Hashtable

public Hashtable(int initialCapacity)
Создаёт новую пустую хеш-таблицу с заданной начальной ёмкостью и стандартным коэффициентом заполнения (0.75).
Параметры:
initialCapacity - начальная ёмкость хеш-таблицы.
Исключения:
IllegalArgumentException - если начальная ёмкость меньше нуля.

Hashtable

public Hashtable()
Создаёт новую пустую хеш-таблицу со стандартной начальной ёмкостью (11) и коэффициентом заполнения (0.75).

Hashtable

public Hashtable(Map<? extends K,? extends V> t)
Создаёт новую хеш-таблицу с теми же отображениями, что и заданный объект Map. Хеш-таблица создаётся с начальной ёмкостью, достаточной для хранения отображений в заданном объекте Map, и стандартным коэффициентом заполнения (0.75).
Параметры:
t - объект Map, чьи отображения должны быть размещены в этой хеш-таблице.
Исключения:
NullPointerException - если указанный объект Map равен null.
С:
1.2

Подробное описание методов

size

public int size()
Возвращает количество ключей в этой хеш-таблице.
Указано в:
size в интерфейсе Map<K,V>
Указано в:
size в классе Dictionary<K,V>
Возвращает:
количество ключей в этой хеш-таблице.

isEmpty

public boolean isEmpty()
Проверяет, отображает ли эта хеш-таблица ключи без значений.
Указано в:
isEmpty в интерфейсе Map<K,V>
Указано в:
isEmpty в классе Dictionary<K,V>
Возвращает:
true если эта хеш-таблица не отображает ключи на значения; false в противном случае.

keys

public Enumeration<K> keys()
Возвращает перечисление ключей в этой хеш-таблице. Используйте методы перечисления для последовательной выборки ключей. Если хеш-таблица структурно изменяется во время перечисления ключей, результаты перечисления не определены.
Указано в:
keys в классе Dictionary<K,V>
Возвращает:
перечисление ключей в этой хеш-таблице.
См. также:
  • Enumeration
  • elements()
  • keySet()
  • Map

elements

public Enumeration<V> elements()
Возвращает перечисление значений в этой хеш-таблице. Используйте методы перечисления для последовательной выборки элементов. Если хеш-таблица структурно изменяется во время перечисления значений, результаты перечисления не определены.
Указано в:
elements в классе Dictionary<K,V>
Возвращает:
перечисление значений в этой хеш-таблице.
См. также:
  • Enumeration
  • keys()
  • values()
  • Map

contains

public boolean contains(Object value)
Проверяет, отображает ли какой-либо ключ на указанное значение в этой хеш-таблице. Эта операция более затратна по времени, чем метод containsKey.

Обратите внимание, что этот метод идентичен по функциональности методу containsValue (который является частью интерфейса Map в рамках коллекции).

Параметры:
value - значение для поиска
Возвращает:
true тогда и только тогда, когда какой-либо ключ отображается на аргумент value в этой хеш-таблице, как определено методом equals; false в противном случае.
Исключения:
NullPointerException - если значение является null

containsValue

public boolean containsValue(Object value)
Возвращает true, если эта хеш-таблица отображает один или несколько ключей на это значение.

Обратите внимание, что этот метод идентичен по функциональности методу 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
См. также:
  • contains(Object)

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
См. также:
  • put(Object, Object)

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
См. также:
  • Object.equals(Object)
  • get(Object)

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)
Копирует все отображения из указанной карты в этот хэш-таблицу. Эти отображения заменят любые отображения, которые эта хэш-таблица имела для любых ключей, которые в настоящее время находятся в указанной карте.
Specified by:
putAll in interface Map<K,V>
Parameters:
t - отображения, которые должны быть сохранены в этой карте
Throws:
NullPointerException - если указанная карта равна null
Since:
1.2

clear

public void clear()
Очищает эту хэш-таблицу, чтобы она не содержала ключей.
Specified by:
clear in interface Map<K,V>

clone

public Object clone()
Создаёт поверхностную копию этой хэш-таблицы. Копируется вся структура самой хэш-таблицы, но ключи и значения не клонируются. Это относительно дорогостоящая операция.
Overrides:
clone in class Object
Returns:
клонированная хэш-таблица
See Also:
  • Cloneable

toString

public String toString()
Возвращает строковое представление этого объекта Hashtable в виде набора записей, заключённых в фигурные скобки и разделённых символами ASCII " , " (запятая и пробел). Каждая запись отображается как ключ, знак равенства =, и связанный элемент, где используется метод toString для преобразования ключа и элемента в строки.
Overrides:
toString in class Object
Returns:
строковое представление этой хэш-таблицы

keySet

public Set<K> keySet()
Возвращает представление Set ключей, содержащихся в этой карте. Множество поддерживается картой, поэтому изменения в карте отражаются в множестве и наоборот. Если карта изменяется во время итерации по множеству (за исключением собственной операции итератора remove), результаты итерации не определены. Множество поддерживает удаление элементов, что удаляет соответствующее отображение из карты, через операции Iterator.remove, Set.remove, removeAll, retainAll, и clear. Оно не поддерживает операции add или addAll.
Specified by:
keySet in interface Map<K,V>
Returns:
представление множества ключей, содержащихся в этой карте
Since:
1.2

entrySet

public Set<Map.Entry<K,V>> entrySet()
Возвращает представление Set отображений, содержащихся в этой карте. Множество поддерживается картой, поэтому изменения в карте отражаются в множестве и наоборот. Если карта изменяется во время итерации по множеству (за исключением собственной операции итератора remove, или операции setValue на элементе карты, возвращённом итератором), результаты итерации не определены. Множество поддерживает удаление элементов, что удаляет соответствующее отображение из карты, через операции Iterator.remove, Set.remove, removeAll, retainAll и clear. Оно не поддерживает операции add или addAll.
Specified by:
entrySet in interface Map<K,V>
Returns:
представление множества отображений, содержащихся в этой карте
Since:
1.2

values

public Collection<V> values()
Возвращает представление Collection значений, содержащихся в этой карте. Коллекция поддерживается картой, поэтому изменения в карте отражаются в коллекции и наоборот. Если карта изменяется во время итерации по коллекции (за исключением собственной операции итератора remove), результаты итерации не определены. Коллекция поддерживает удаление элементов, что удаляет соответствующее отображение из карты, через операции Iterator.remove, Collection.remove, removeAll, retainAll и clear. Она не поддерживает операции add или addAll.
Specified by:
values in interface Map<K,V>
Returns:
представление коллекции значений, содержащихся в этой карте
Since:
1.2

equals

public boolean equals(Object o)
Сравнивает указанный объект с этой картой на равенство, согласно определению в интерфейсе Map.
Specified by:
equals in interface Map<K,V>
Overrides:
equals in class Object
Parameters:
o - объект, который сравнивается на равенство с этой хэш-таблицей
Returns:
true, если указанный объект равен этой карте
Since:
1.2
See Also:
  • Map.equals(Object)

hashCode

public int hashCode()
Возвращает значение хэш-кода для этой карты согласно определению в интерфейсе Map.
Specified by:
hashCode in interface Map<K,V>
Overrides:
hashCode in class Object
Returns:
значение хэш-кода для этого объекта.
Since:
1.2
See Also:
  • Map.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, если функция отображения изменила эту карту во время вычисления.

Specified by:
computeIfAbsent in interface Map<K,V>
Parameters:
key - ключ, с которым должно быть связано указанное значение
mappingFunction - функция отображения для вычисления значения
Returns:
текущее (существующее или вычисленное) значение, связанное с указанным ключом, или null, если вычисленное значение равно null
Throws:
ConcurrentModificationException - если будет обнаружено, что функция отображения изменила эту карту

computeIfPresent

public V computeIfPresent(K key, BiFunction<? super K,? super V,? extends V> remappingFunction)
Если значение для указанного ключа присутствует и не равно null, пытается вычислить новое отображение, используя ключ и его текущее сопоставленное значение.

Если функция переназначения возвращает null, отображение удаляется. Если сама функция переназначения вызывает (непроверенное) исключение, исключение перебрасывается, и текущее отображение остаётся неизменным.

Функция переназначения не должна изменять эту карту во время вычисления.

Этот метод будет, по возможности, вызывать исключение ConcurrentModificationException, если функция переназначения изменила эту карту во время вычисления.

Specified by:
computeIfPresent in interface Map<K,V>
Parameters:
key - ключ, с которым должно быть связано указанное значение
remappingFunction - функция переназначения для вычисления значения
Returns:
новое значение, связанное с указанным ключом, или null, если нет
Throws:
ConcurrentModificationException - если будет обнаружено, что функция переназначения изменила эту карту

compute

public V compute(K key, BiFunction<? super K,? super V,? extends V> remappingFunction)
Попытка вычислить отображение для указанного ключа и его текущего сопоставленного значения (или null если текущего отображения нет). Например, для создания или добавления String сообщения к отображению значения:
 
 map.compute(key, (k, v) -> (v == null) ? msg : v.concat(msg))
(Метод merge() часто проще использовать для таких целей.)

Если функция переназначения возвращает null, отображение удаляется (или остается отсутствующим, если изначально отсутствовало). Если сама функция переназначения вызывает (непроверенное) исключение, исключение повторно выбрасывается, а текущее отображение остается неизменным.

Функция переназначения не должна изменять эту карту во время вычисления.

Этот метод, по возможности, выбросит ConcurrentModificationException, если функция переназначения изменила эту карту во время вычисления.

Specified by:
compute в интерфейсе Map<K,V>
Parameters:
key - ключ, с которым должно быть связано указанное значение
remappingFunction - функция переназначения для вычисления значения
Returns:
новое значение, связанное с указанным ключом, или null, если нет
Throws:
ConcurrentModificationException - если обнаружено, что функция переназначения изменила эту карту

merge

public V merge(K key, V value, BiFunction<? super V,? super V,? extends V> remappingFunction)
Если указанный ключ еще не связан со значением или связан с null, связывает его с заданным ненулевым значением. В противном случае, заменяет связанное значение результатами заданной функции переназначения, или удаляет, если результат null. Этот метод может быть полезен при объединении нескольких сопоставленных значений для ключа. Например, для создания или добавления String msg к отображению значения:
 
 map.merge(key, msg, String::concat)
 

Если функция переназначения возвращает null, отображение удаляется. Если сама функция переназначения вызывает (непроверенное) исключение, исключение повторно выбрасывается, а текущее отображение остается неизменным.

Функция переназначения не должна изменять эту карту во время вычисления.

Этот метод, по возможности, выбросит ConcurrentModificationException, если функция переназначения изменила эту карту во время вычисления.

Specified by:
merge в интерфейсе Map<K,V>
Parameters:
key - ключ, с которым должно быть связано результирующее значение
value - ненулевое значение, которое должно быть объединено с существующим значением, связанным с ключом, или, если нет существующего значения или значение null связано с ключом, которое должно быть связано с ключом
remappingFunction - функция переназначения для повторного вычисления значения, если оно присутствует
Returns:
новое значение, связанное с указанным ключом, или null, если значение не связано с ключом
Throws:
ConcurrentModificationException - если обнаружено, что функция переназначения изменила эту карту

© 1993, 2021, 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/17/docs/api/java.base/java/util/Hashtable.html

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API