首页 > 解决方案 > Map.Entry 在 HashMap 实现中是如何使用的?

问题描述

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

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;

}

我有 2 个问题。

  1. 根据javadocMap.Entry是一个public static interface, as 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吗?如果tablestatic,那么所有HashMap类对象将共享相同的table;这听起来不对。不是每个HashMap对象都有不同的内存存储来托管它们的内容吗?

标签: javainterfacestatichashmap

解决方案


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

JLS

9.5。成员类型声明

接口中的成员类型声明是隐式的publicand static。允许冗余指定这些修饰符中的一个或两个。

关于static关键字,我的理解是内部Map.Entry对象table的元素类型没有引用,HashMap因为Node是一个static类。

它没有参考,因为它不需要参考。您需要阅读散列映射数据结构以了解其工作原理。如果您询问 aNode 是否可以引用地图,那么可以,如果它传递给它(通过构造函数或方法)。如果您询问 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和(后两个在超类中)之类的内容的地方。entrySetkeySetvalues


推荐阅读