博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Java集合--HashIterator
阅读量:6263 次
发布时间:2019-06-22

本文共 2748 字,大约阅读时间需要 9 分钟。

hot3.png

循环遍历一个 HashMap 可以通过下面的方式

for (Map.Entry entry : hashMap.entrySet()) {    Object key = entry.getKey();    Object value = entry.getValue();    ....}

或者用迭代器

Iterator iterator = hashMap.entrySet().iterator();while (iterator.hasNext()) {    Object object = iterator.next();    ....}

其实是一样的 foreach 底层就是调用了 iterator.next() 方法。

 

下面通过源码分析一下究竟如何遍历一个map和遍历一个map具体发生了哪些事情。

进入到这个 entrySet() 方法里面

public Set
> entrySet() { Set
> es; return (es = entrySet) == null ? (entrySet = new EntrySet()) : es;}final class EntrySet extends AbstractSet
> { public final int size() { return size; } public final void clear() { HashMap.this.clear(); } public final Iterator
> iterator() { return new EntryIterator(); } ...}

如果是空的就new一个EntrtSet(),如果不是空的就直接返回,在看下EntrySet这个类,里面有一个 iterator() 方法,new一个EntryIterator()

final class EntryIterator extends HashIterator implements Iterator
> { public final Map.Entry
next() { return nextNode(); }}abstract class HashIterator { Node
next; // next entry to return Node
current; // current entry int expectedModCount; // for fast-fail int index; // current slot HashIterator() { expectedModCount = modCount; Node
[] t = table; current = next = null; index = 0; if (t != null && size > 0) { // advance to first entry do {} while (index < t.length && (next = t[index++]) == null); } } public final boolean hasNext() { return next != null; } final Node
nextNode() { Node
[] t; Node
e = next; if (modCount != expectedModCount) throw new ConcurrentModificationException(); if (e == null) throw new NoSuchElementException(); if ((next = (current = e).next) == null && (t = table) != null) { do {} while (index < t.length && (next = t[index++]) == null); } return e; } public final void remove() { Node
p = current; if (p == null) throw new IllegalStateException(); if (modCount != expectedModCount) throw new ConcurrentModificationException(); current = null; K key = p.key; removeNode(hash(key), key, null, false, false); expectedModCount = modCount; }}

这个 EntryIterator 继承自 HashIterator 实现了 Iterator 接口,这里的 next() 方法直接调用的是HashIterator类的 nextNode() 方法,从这可以看出来这个next方法其实返回的就是 Node 节点的 next 字段。Node节点是这样的

static class Node
implements Map.Entry
{ final int hash; final K key; V value; Node
next; 。。。}

 

综上所述,用entrySet这种方式遍历一个map,其实就是获取到hashmap最底层的数组,从数组的第0个位置一直开始遍历,如果数组的位置是个链表,那么把链表也遍历一遍。回过头来看这个方法的名字 entrySet,hashmap的数组里面放的是Node,这个Node就是Map.Entry的实现类,entrySet 顾名思义就是所有 entry 的一个set集合。

 

 

 

转载于:https://my.oschina.net/u/232911/blog/2870182

你可能感兴趣的文章
linux上查看swf文件.靠谱
查看>>
sql server两种分页方法
查看>>
一本离线的百科全书,当然无法和一本在线的百科全书抗衡。所谓的常识,在你的思考中被重构,根源就在于在线的崛起。...
查看>>
Floyd算法
查看>>
CentOS 6.4下安装Oracle 11gR2
查看>>
linux建立用户 详细
查看>>
jquery获取radio的值
查看>>
创建索引
查看>>
jQuery基础-创建HTML
查看>>
spring boot 热部署
查看>>
NYOJ-214 单调递增子序列(二) AC 分类: NYOJ ...
查看>>
[HDU 4417]Super Mario
查看>>
clip-path的妙用
查看>>
在FMOD中使用customRollOff实现更自然的声音衰减
查看>>
java日常-map转成json
查看>>
动画view
查看>>
自己写个多任务多线程断点下载框架
查看>>
Css 按钮
查看>>
Silverlight显示WCF详细异常信息
查看>>
BZOJ5299:[CQOI2018]解锁屏幕(状压DP)
查看>>