大家好,欢迎来到IT知识分享网。
发现很多讲entrySet原理的文章都讲到entrySet方法返回map包含的映射集合视图就没了,并没有讲到为什么entrySet没有赋值却可以取到数据,这里简单梳理下。
public static void main(String[] args) { Map<String, String> map = new HashMap<>(); map.put("1", "a"); for (Map.Entry<String, String> entry : map.entrySet()) { System.out.println("k:" + entry.getKey() + "\tv:" + entry.getValue()); } }
这是遍历hashMap常用的方式,可以看到for循环的是entrySet,但是看entrySet()方法中直接返回了一个entrySet,entrySet并没有存入数据过,那上面的遍历是怎么取到数据的?


答案就是编译器做了优化,会通过Iterator模式迭代遍历,最终操作的其实是hashmap底层结构中的table数组,并没有开辟新的空间。下面看下具体过程
1.看下上边代码对应的字节码指令(javap -verbose xx.class)。可以看到编译器优化之后最终通过Iterator遍历了,调用了hasNext和next方法。

2.entrySet方法返回的Set是EntrySet。EntrySet继承了AbstractSet,重写了iterator方法,最终使用的是EntryIterator迭代器,EntryIterator又继承了HashIterator,重新来next方法。在next方法中,调用了nextNode方法,nextNode中才是具体访问hashmap的table数组,获取元素。

EntrySet

EntryIterator

nextNode
3.debug验证下


免责声明:本站所有文章内容,图片,视频等均是来源于用户投稿和互联网及文摘转载整编而成,不代表本站观点,不承担相关法律责任。其著作权各归其原作者或其出版社所有。如发现本站有涉嫌抄袭侵权/违法违规的内容,侵犯到您的权益,请在线联系站长,一经查实,本站将立刻删除。 本文来自网络,若有侵权,请联系删除,如若转载,请注明出处:https://haidsoft.com/189593.html