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>才对,为啥用两个问号呢?


回答:

在 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;

}

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

以上是 Hashtable源代码里的Entry&lt;?,?&gt;是什么意思? 的全部内容, 来源链接: utcz.com/p/944927.html

回到顶部