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<?,?>是什么意思? 的全部内容, 来源链接: utcz.com/p/944927.html