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

来源:互联网 发布:第三方微信软件 编辑:程序博客网 时间:2024/06/06 14:25

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

//return a set view of the mappings contained in this mappublic 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[]中来。

原创粉丝点击