![](/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.