![](/img/trans.png)
[英]Why does HashMap in java internally use array to store Entry Objects and not an ArrayList?
[英]Why does Hashtable use Entry<?,?> internally?
這是Hashtable#get
:
@SuppressWarnings("unchecked")
public synchronized V get(Object key) {
Entry<?,?> tab[] = table;
int hash = key.hashCode();
int index = (hash & 0x7FFFFFFF) % tab.length;
for (Entry<?,?> e = tab[index] ; e != null ; e = e.next) {
if ((e.hash == hash) && e.key.equals(key)) {
return (V)e.value;
}
}
return null;
}
為什么使用Entry<?,?>
而不是Entry<K,V>
?
Hashtable
的創建早於Java 1.5中使用泛型的任何工作,因此這里可能出現的情況是泛型被改造了。
雖然更大的說法可能是因為table
是一個數組,而泛型和數組只是不能很好地相處。
如果table
(在現場Hashtable
) 的類型,你必須處理很多這些聲明...
// Generic array creation!
Entry<K, V>[] newMap = new Entry<K, V>[newCapacity];
......可能的設計/實施決策是爭取兼容性,而不是全面接受泛型。
另請注意,使用通配符創建數組類型不會導致編譯時錯誤,而創建具有特定類型的數組將會因為帶有未綁定通配符的泛型類型被認為是可恢復的 :
List<?>[] foo = new ArrayList[10]; // perfectly legal but not encouraged
List<String> bar = new ArrayList[10]; // not legal
未來的慣例將是使用HashMap
,因為這個特定的實現是同步的,並且仍然在其中使用了許多1.5之前的約定。 (如果你想要同步,甚至文檔也推薦使用ConcurrentHashMap
。)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.