我有一个问题,如何Map.Entry
在Map实现中使用HashMap
。这是HashMap
在jdk8中如何实现的代码,
public interface Map<K, V> {
interface Entry<K, V> {
...
}
}
public class HashMap<K,V> extends AbstractMap<K,V>
implements Map<K,V>, Cloneable, Serializable {
static class Node<K,V> implements Map.Entry<K,V> {
public final K getKey() { return key; }
public final V getValue() { return value; }
}
transient Node<K,V>[] table;
}
我有两个问题。
据javadoc的,Map.Entry
是一个public static interface
作为public static interface Map.Entry<K,V>
。为什么static
上面缺少interface Entry<K, V>
?javadoc仅指Oracle jdk吗?
关于static
关键字,我的理解是内部Map.Entry
对象table
的元素类型没有引用,HashMap
因为它Node
是一个static
类。是table
变量static
吗?如果table
是的话static
,那么所有HashMap
类对象将共享同一对象table
; 这听起来不对。难道每个HashMap
对象都没有用于存储其内容的不同的存储器吗?
为什么
static
上面缺少interface Entry<K, V>
?
从JLS:
9.5。会员类型声明
接口中的成员类型声明隐式为
public
和static
。可以冗余地指定这两个修饰符之一或全部。
关于
static
关键字,我的理解是内部Map.Entry
对象(table
元素类型)没有对的引用,HashMap
因为它Node
是一个static
类。
它没有参考,因为它不需要参考。您将需要阅读有关哈希图数据结构的信息,以了解其工作原理。如果您要询问a Node
是否可以引用该地图,则可以,是否已将其传递给它(通过构造函数或方法)。如果您要询问a是否Node
可以访问封闭的地图,则否,因为您说的Node
是静态的。如果您尝试执行类似的操作,将会出现错误
static class Node<K,V> implements Map.Entry<K,V> {
HashMap<K,V> map = HashMap.this;
}
是No enclosing instance of the type HashMap is accessible in scope
。如果Node
不是static
,则代码将编译。
表是变量
static
吗?
不,它是transient
,这意味着它不会通过Serializable
接口的协议进行序列化。
难道每个
HashMap
对象都没有用于存储其内容的不同的存储器吗?
是的,这就是内容喜欢table
,entrySet
,keySet
和values
(后者2处于超类)被存储。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句