您的位置:首页 > 其它

HashMap之entrySet( )底层实现原理分析

2017-08-17 23:22 507 查看
entrySet( )说明

在针对hashmap做遍历的时候我们常常会调用map对象.entrySet()方法来实现对Map.Entry接口对象实例的遍历,Map.Entry是Map接口里面的一个内部接口,该接口声明为范型。当我们获得了接口对象后遍可以调用接口方法getKey(), getValue()

entrySet( )底层源码分析

当我们追踪HashMap类中entrySet()方法时候可以发现

//return a set view of the mappings contained in this map
public Set<Map.Entry<K,V>> entrySet() {
Set<Map.Entry<K,V>> es;
return (es = entrySet) == null ? (entrySet = new EntrySet()) : es;
}


注释中说明了返回map包含的映射集合视图,进一步分析发现entrySet为类的属性,并未见在put()操作中为其赋值?实际上再发现有entrySet = new EntrySet()这一操作,EntrySet是HashMap中的内部类,发现其实现的一关键点细节

final class EntrySet extends AbstractSet<Map.Entry<K,V>> {
public final void forEach(Consumer<? super Map.Entry<K,V>> action) {
Node<K,V>[] tab;
if (action == null)
throw new NullPointerException();
if (size > 0 && (tab = table) != null) {
int mc = modCount;
for (int i = 0; i < tab.length; ++i) {
for (Node<K,V> e = tab[i]; e != null; e = e.next)
action.accept(e);
}
if (modCount != mc)
throw new ConcurrentModificationException();
}
}
}


在进行foreach遍历EntrySet的时候时间上是会遍历table[],hashmap中实际具体数据都是存储在这个数组中,包括entry。这也进一步验证了那句话entrySet()该方法返回的是map包含的映射集合视图,视图的概念相当于数据库中视图及提供一个窗口,没有具体到相关数据,而真正获取数据还是从table[]中来。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  hashmap 遍历 源码