HashMap实现中如何使用Map.Entry?

Sofabc:

我有一个问题,如何Map.Entry在Map实现中使用HashMap这是HashMapjdk8中如何实现的代码

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;

}

我有两个问题。

  1. javadoc的Map.Entry是一个public static interface作为public static interface Map.Entry<K,V>为什么static上面缺少interface Entry<K, V>javadoc仅指Oracle jdk吗?

  2. 关于static关键字,我的理解是内部Map.Entry对象table的元素类型没有引用,HashMap因为它Node是一个static类。table变量static吗?如果table是的话static,那么所有HashMap类对象将共享同一对象table; 这听起来不对。难道每个HashMap对象都没有用于存储其内容的不同的存储器吗?

user1803551:

为什么static上面缺少interface Entry<K, V>

JLS

9.5。会员类型声明

接口中的成员类型声明隐式为publicstatic可以冗余地指定这两个修饰符之一或全部。

关于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对象都没有用于存储其内容的不同的存储器吗?

是的,这就是内容喜欢tableentrySetkeySetvalues(后者2处于超类)被存储。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章