为什么Hashtable在内部使用Entry <! - ?,? - >?

时间:2015-10-23 16:36:48

标签: java generics collections

这是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>

1 个答案:

答案 0 :(得分:1)

Hashtable的创建早于Java 1.5中使用泛型所做的任何工作,所以这里可能出现的情况是仿制药被改造了。

虽然更大的说法可能是因为table是一个数组,但是泛型和数组不能很好地相处。

如果输入tableHashtable中的字段,则您必须处理很多这些声明......

// Generic array creation! 
Entry<K, V>[] newMap = new Entry<K, V>[newCapacity];

......可能的设计/实施决策是争取兼容性,而不是全面接受泛型。

另请注意,使用通配符创建数组类型不会导致编译时错误,而创建具有具体类型的数组将,因为具有未绑定的泛型类型通配符is considered reifiable

List<?>[] foo = new ArrayList[10]; // perfectly legal but not encouraged
List<String> bar = new ArrayList[10]; // not legal

未来的惯例将是使用HashMap,因为这个特定的实现是同步的,并且仍然使用了许多1.5之前的约定。 (如果您想要同步,甚至文档也会推荐ConcurrentHashMap。)