HashMap迭代遍历节点为什么只能声明entry不能声明为Node

本文揭示了HashMap中Node作为Entry的实现但不能直接使用的原因——Node是HashMap的静态内部类,修饰符为默认,只能在本包内访问。通过实例说明为何需要通过Entry接口操作并遵循抽象编程原则。
摘要由CSDN通过智能技术生成

问题: 

当我使用迭代器遍历HashMap只可以将Node强制转换成Entry才可以得到getValue和getKey方法。

但是我们在源码中可以发现Node节点继承了Entry 

这意味着Node节点也一定有 getValue和getKey方法。

但我们却不能使用Node去接收迭代器找到的值。

询问了学校老师 答案是:

原来Node静态内部类的限定符是默认,而不能是public(因为内部类都不可以是public),在别的包调用的时候是不可以直接声明静态内部类对象的。

所以只能用Entry接收,刚好符合了抽象编程的思想。

总结:

在通过new HashMap().entrySet()获取到Set entrySet的时候,使用迭代器获取的Object类型的对象的getClass()方法拿到的类是class java.util.HashMap$Node,但是不能够将(Object)entrySet.iterator().next() 强制向下转换为 HashMap$Node,因为Node是HashMap的 静态内部类,并且该类的修饰符是缺省的,只能在同一个包中使用,但是Node是Map.Entry的实现类,所以这个(Object)entrySet.iterator().next()只能强制转换为Map.Entry类型,才能调用里边的getKey()、getValue()方法(小爽大佬回复我的)

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值