java - 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 个问题。
根据javadoc,
Map.Entry
是一个public static interface
, aspublic 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
andstatic
。允许冗余指定这些修饰符中的一个或两个。
关于
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
和(后两个在超类中)之类的内容的地方。entrySet
keySet
values
推荐阅读
- sql - 如何在sql中获取最近3天的数据
- sql-server - FreeTDS 和 unixodbc 安装和配置
- angular - 如何在 TypeScript 中使用附加属性扩展 fabric.Object
- javascript - 类型上不存在属性“defaultProps”
- python - 替换 Pandas 数据框中的值
- asp.net - 点网中数据的长期加密
- python - Mask-RCNN 项目
- android - 如何在android中正确运行多个线程进行api调用?
- matlab - MATLAB R2019a 中的 contourf 函数中的“ShowText”和“LineStyle”之间存在冲突吗?
- javascript - 扩展语法和手动分配属性之间的区别