Hashtable源代码里的Entry<?,?>是什么意思?

如题,代码如下

public class Hashtable<K,V>
    extends Dictionary<K,V>
    implements Map<K,V>, Cloneable, java.io.Serializable {

    /**
     * The hash table data.
     */
    private transient Entry<?,?>[] table;

他这里的Entry<?,?>是什么写法?既然保存的是键值对,应该和Hashtable的参数类型一样也是<K,V>才对,为啥用两个问号呢?

阅读 2.1k
2 个回答

在 Hashtable 中,Entry<?,?> 是一种泛型写法,表示 Entry 是一种可以保存键值对的数据结构。

使用两个问号(?)表示 Entry 中保存的键和值的类型是不确定的。这意味着 Entry 可以保存任意类型的键和值,无论它们是什么类型。

这种写法通常用于定义泛型类型的成员变量或方法的返回值,用来表示可以接受任意类型的数据。

例如,在 Hashtable 中,Entry<?,?> 表示 Hashtable 内部使用的数据结构,用来保存键值对。但是,由于 Hashtable 的键和值的类型是不确定的,所以使用 Entry<?,?> 来保存数据可以让 Hashtable 可以接受任意类型的键和值。

例如,下面的代码展示了如何使用 Hashtable 存储字符串和整数类型的键值对:

Hashtable<String, Integer> table = new Hashtable<>();
table.put("one", 1);
table.put("two", 2);

// 获取键值对的值
int value = table.get("one");
System.out.println(value); // 输出 1

在这个例子中,Hashtable 内部使用的 Entry<?,?> 数据结构保存了字符串和整数类型的键值对。

简单一句话就是Java不支持创建泛型数组;
这里用Entry<K,V>[] 也可以。只不过在创建数组对象的时候得强转一下

Entry<K,V>[] table=(Entry<K,V>[])new Entry[size]

如果用Entry<?,?>[] 可以直接new Entry<?,?>[size]
但是这样使用就得在具体地方强转:

 public synchronized V put(K key, V value) {
        // Make sure the value is not null
        if (value == null) {
            throw new NullPointerException();
        }

        // Makes sure the key is not already in the hashtable.
        Entry<?,?> tab[] = table;
        int hash = key.hashCode();
        int index = (hash & 0x7FFFFFFF) % tab.length;
        @SuppressWarnings("unchecked")
        Entry<K,V> entry = (Entry<K,V>)tab[index];//强转操作
        for(; entry != null ; entry = entry.next) {
            if ((entry.hash == hash) && entry.key.equals(key)) {
                V old = entry.value;
                entry.value = value;
                return old;
            }
        }

        addEntry(hash, key, value, index);
        return null;
    }

至于为什么不能直接创建具体泛型数组可以参考一下这里

推荐问题
宣传栏