java.util
類 Hashtable<K,V>
java.lang.Object
java.util.Dictionary<K,V>
java.util.Hashtable<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
的執行個體有兩個參數影響其性能:初始容量 和加載因子。容量
是哈希表中桶 的數量,初始容量 就是哈希表建立時的容量。注意,哈希表的狀态為
open:在發生“哈希沖突”的情況下,單個桶會存儲多個條目,這些條目必須按順序搜尋。加載因子
是對哈希表在其容量自動增加之前可以達到多滿的一個尺度。初始容量和加載因子這兩個參數隻是對該實作的提示。關于何時以及是否調用 rehash
方法的具體細節則依賴于該實作。
通常,預設加載因子(.75)在時間和空間成本上尋求一種折衷。加載因子過高雖然減少了空間開銷,但同時也增加了查找某個條目的時間(在大多數
Hashtable 操作中,包括 get 和 put 操作,都反映了這一點)。
初始容量主要控制空間消耗與執行
rehash
操作所需要的時間損耗之間的平衡。如果初始容量大于
Hashtable 所包含的最大條目數除以加載因子,則永遠 不會發生
rehash
操作。但是,将初始容量設定太高可能會浪費空間。
如果很多條目要存儲在一個
Hashtable
中,那麼與根據需要執行自動 rehashing
操作來增大表的容量的做法相比,使用足夠大的初始容量建立哈希表或許可以更有效地插入條目。
下面這個示例建立了一個數字的哈希表。它将數字的名稱用作鍵:
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);
}
}
由所有類的“collection 視圖方法”傳回的 collection 的 iterator
方法傳回的疊代器都是快速失敗 的:在建立 Iterator 之後,如果從結構上對 Hashtable 進行修改,除非通過 Iterator
自身的 remove 方法,否則在任何時間以任何方式對其進行修改,Iterator 都将抛出
ConcurrentModificationException
。是以,面對并發的修改,Iterator
很快就會完全失敗,而不冒在将來某個不确定的時間發生任意不确定行為的風險。由 Hashtable 的鍵和元素方法傳回的 Enumeration
不 是快速失敗的。
注意,疊代器的快速失敗行為無法得到保證,因為一般來說,不可能對是否出現不同步并發修改做出任何硬性保證。快速失敗疊代器會盡最大努力抛出
ConcurrentModificationException。是以,為提高這類疊代器的正确性而編寫一個依賴于此異常的程式是錯誤做法:疊代器的快速失敗行為應該僅用于檢測程式錯誤。
從Java 2 平台 v1.2起,此類就被改進以實作
Map
接口,使它成為 Java Collections
Framework 中的一個成員。不像新的 collection 實作,
Hashtable
是同步的
- 從以下版本開始:
- JDK1.0
- 另請參見:
-
,Object.equals(java.lang.Object)
Object.hashCode()
rehash()
Collection
Map
HashMap
, 序列化表格TreeMap
構造方法摘要 |
---|
用預設的初始容量 (11) 和加載因子 (0.75) 構造一個新的空哈希表。 |
用指定初始容量和預設的加載因子 (0.75) 構造一個新的空哈希表。 |
用指定初始容量和指定加載因子構造一個新的空哈希表。 |
構造一個與給定的 Map 具有相同映射關系的新哈希表。 |
方法摘要 | |
---|---|
| 将此哈希表清空,使其不包含任何鍵。 |
| 建立此哈希表的淺表副本。 |
| 測試此映射表中是否存在與指定值關聯的鍵。 |
| 測試指定對象是否為此哈希表中的鍵。 |
| 如果此 Hashtable 将一個或多個鍵映射到此值,則傳回 true。 |
| 傳回此哈希表中的值的枚舉。 |
| 傳回此映射中包含的鍵的 視圖。 |
| 按照 Map 接口的定義,比較指定 Object 與此 Map 是否相等。 |
| 傳回指定鍵所映射到的值,如果此映射不包含此鍵的映射,則傳回 . 更确切地講,如果此映射包含滿足 的從鍵 到值 的映射,則此方法傳回 ;否則,傳回 。 |
| 按照 Map 接口的定義,傳回此 Map 的哈希碼值。 |
| 測試此哈希表是否沒有鍵映射到值。 |
| 傳回此哈希表中的鍵的枚舉。 |
| |
| 将指定 映射到此哈希表中的指定 |
| 将指定映射的所有映射關系複制到此哈希表中,這些映射關系将替換此哈希表擁有的、針對目前指定映射中所有鍵的所有映射關系。 |
| 增加此哈希表的容量并在内部對其進行重組,以便更有效地容納和通路其元素。 |
| 從哈希表中移除該鍵及其相應的值。 |
| 傳回此哈希表中的鍵的數量。 |
| 傳回此 Hashtable 對象的字元串表示形式,其形式為 ASCII 字元 ", " (逗号加空格)分隔開的、括在括号中的一組條目。 |
| |
從類 java.lang.Object 繼承的方法 |
---|
|
構造方法詳細資訊 |
---|
Hashtable
public Hashtable (int initialCapacity,
float loadFactor)
-
- 參數:
-
- 哈希表的初始容量。initialCapacity
-
- 哈希表的加載因子。loadFactor
- 抛出:
-
- 如果初始容量小于零,或者加載因子為非正數。IllegalArgumentException
public Hashtable (int initialCapacity)
-
-
initialCapacity
-
- 如果初始容量小于零。IllegalArgumentException
public Hashtable ()
public Hashtable (Map<? extends K,? extends V> t)
-
構造一個與給定的 Map 具有相同映射關系的新哈希表。該哈希表是用足以容納給定 Map
中映射關系的初始容量和預設的加載因子(0.75)建立的。
-
- 其映射關系将存放在此映射中的映射。t
-
- 如果指定映射為 null。NullPointerException
- 1.2
方法詳細資訊 |
---|
size
public int size ()
-
- 指定者:
- 接口
中的Map<K,V>
size
- 類
Dictionary<K,V>
size
-
- 傳回:
- 此哈希表中的鍵的數量。
isEmpty
public boolean isEmpty ()
-
-
Map<K,V>
isEmpty
-
Dictionary<K,V>
isEmpty
-
- 如果此哈希表沒有将任何鍵映射到值,則傳回
;否則傳回true
false
keys
public Enumeration<K> keys ()
-
-
Dictionary<K,V>
keys
-
- 此哈希表中的鍵的枚舉。
-
Enumeration
elements()
keySet()
Map
elements
public Enumeration<V> elements ()
- 傳回此哈希表中的值的枚舉。對傳回的對象使用 Enumeration 方法,以便按順序擷取這些元素。
-
-
Dictionary<K,V>
elements
-
- 此哈希表中的值的枚舉。
-
Enumeration
keys()
values()
Map
contains
public boolean contains (Object value)
- 測試此映射表中是否存在與指定值關聯的鍵。此操作比
containsKey
方法的開銷更大。
注意,此方法在功能上等同于
方法,containValue 是 collection 架構中containsValue
接口的一部分。Map
-
-
- 要搜尋的值。value
- 當且僅當此哈希表中某個鍵映射到
參數(由 equals 方法确定)時,傳回value
true
false
-
- 如果該值為NullPointerException
null
containsValue
public boolean containsValue (Object value)
- 如果此 Hashtable 将一個或多個鍵映射到此值,則傳回 true。
-
-
Map<K,V>
containsValue
-
-
- 将要測試是否存在此哈希表中的值value
- 如果此映射将一個或多個鍵映射到指定值,則傳回 true
-
NullPointerException
null
containsKey
public boolean containsKey (Object key)
-
-
Map<K,V>
containsKey
-
-
- 可能的鍵key
- 當且僅當指定對象(由 equals 方法确定)是此哈希表中的鍵時,才傳回
true
false
-
- 如果該鍵為NullPointerException
null
-
contains(Object)
get
public V get (Object key)
-
.null
-
-
Map<K,V>
get
-
Dictionary<K,V>
get
-
-
- 要傳回其相關值的鍵key
- 指定鍵映射到的值,如果此映射不包含到鍵的映射,則傳回
null
-
- 如果指定鍵為 nullNullPointerException
-
put(Object, Object)
rehash
protected void rehash ()
- 增加此哈希表的容量并在内部對其進行重組,以便更有效地容納和通路其元素。當哈希表中的鍵的數量超出哈希表的容量和加載因子時,自動調用此方法。
put
public V put (K key,
V value)
-
key
。鍵和值都不可以為value
null
-
-
Map<K,V>
put
-
Dictionary<K,V>
put
-
-
- 哈希表的鍵key
-
- 值value
- 此哈希表中指定鍵的以前的值;如果不存在該值,則傳回
null
-
- 如果鍵或值為NullPointerException
null
-
Object.equals(Object)
get(Object)
remove
public V remove (Object key)
- 從哈希表中移除該鍵及其相應的值。如果該鍵不在哈希表中,則此方法不執行任何操作。
-
-
Map<K,V>
remove
-
Dictionary<K,V>
remove
-
-
- 需要移除的鍵key
- 此哈希表中與該鍵存在映射關系的值;如果該鍵沒有映射關系,則傳回
null
-
NullPointerException
null
putAll
public void putAll (Map<? extends K,? extends V> t)
-
-
Map<K,V>
putAll
-
-
- 将存儲在此映射中的映射關系。t
-
- 如果指定的映射為 null。NullPointerException
clear
public void clear ()
-
-
Map<K,V>
clear
clone
public Object clone ()
- 建立此哈希表的淺表副本。複制哈希表自身的所有結構,但不複制它的鍵和值。這是一個開銷相對較大的操作。
-
- 覆寫:
-
Object
clone
-
- 哈希表的一個副本
-
Cloneable
toString
public String toString ()
-
(逗号加空格)分隔開的、括在括号中的一組條目。每個條目都按以下方式呈現:鍵,一個等号 = 和相關元素,其中 toString
方法用于将鍵和元素轉換為字元串。
-
-
Object
toString
-
- 此哈希表的字元串表示形式
keySet
public Set<K> keySet ()
-
Set
視圖。此 set 受映射支援,是以對映射的更改可在
set 中反映出來,反之亦然。如果在此 set 上的疊代器處于進行中時修改此映射(除非通過疊代器自身的 remove
操作),則疊代器的結果是不确定的。通過
Iterator.remove、Set.remove、removeAll、
retainAll、和 clear 操作,此 set 支援元素移除,可從映射中移除相應的映射關系。它不支援
add 或 addAll 操作。
-
-
Map<K,V>
keySet
-
- 此映射中包含的鍵的 set 視圖
entrySet
public Set<Map.Entry<K,V>> entrySet ()
-
Set
操作,或通過由疊代器傳回的映射條目上的 setValue 操作),則疊代器的結果是不确定的。通過
retainAll、 和 clear 操作,此set 支援元素移除,可從映射中移除相應的映射關系。它不支援
-
-
Map<K,V>
entrySet
-
- 此映射中包含的映射關系的 set 視圖
values
public Collection<V> values ()
-
Collection
視圖。此
collection 受映射支援,是以對映射的更改可在 collection 中反映出來,反之亦然。如果在此 collection
上的疊代器處于進行中時修改此映射(除非通過疊代器自身的 remove 操作),則疊代器的結果是不确定的。通過
Iterator.remove、Collection.remove、removeAll、
-
-
Map<K,V>
values
-
- 此映射中包含的值的 collection 視圖
equals
public boolean equals (Object o)
-
-
Map<K,V>
equals
-
Object
equals
-
-
- 将與此哈希表進行比較相等性的對象o
- 如果指定的 Object 與此 Map 相等,則傳回 true。
-
Map.equals(Object)
hashCode
public int hashCode ()
-
-
Map<K,V>
hashCode
-
Object
hashCode
-
- 此對象的一個哈希碼值。
-
Map.hashCode()