栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

2021-10-21

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

2021-10-21

java高级HashMap中的entrySet()方法的理解

基础使用:
HashMap集合中的entrySet()方法可以得到各个键值对映射关系的集合。
然后在Map.Entry中包含了getKey()和getValue()方法获取键和值。

示例:

public class Demo {
    public static void main(String[] args) {
        Map map = new HashMap<>();
        map.put("abc","123");
        map.put("efg", "456");
        //使用增强for遍历循环Map集合
        Set> entrySet = map.entrySet();
        for(Map.Entry entry : entrySet){
            System.out.println(entry.getKey()+"->"+entry.getValue());
        }
    }
}

代码执行原理分析:
HashMap中的entrySet()方法返回Set>,那么为什么entrySet()方法可以得到键值对的映射集合呢?

 public Set> entrySet() {
        Set> es;
        return (es = entrySet) == null ? (entrySet = new EntrySet()) : es;
    }

entrySet方法的方法的原理其实和keySet()方法、values()方法的原理是一样的。

分析entrySet()方法 源码:

public Set> entrySet() {
        Set> es;
        return (es = entrySet) == null ? (entrySet = new EntrySet()) : es;
          
    }

我们现在看看编译后的字节码文件Demo.class文件:

public class Demo {
    public Demo() {
    }

    public static void main(String[] args) {
        Map map = new HashMap();
        map.put("abc", "123");
        map.put("efg", "456");
        Set> entrySet = map.entrySet();
        Iterator var3 = entrySet.iterator();

        while(var3.hasNext()) {
            Entry entry = (Entry)var3.next();
            PrintStream var1 = System.out;
            String var1 = (String)entry.getKey();
            var1.println(var1 + "->" + (String)entry.getValue());
        }

    }
}

能够获取元素是通过迭代器的遍历得来的,所以entrySet()方法能有键值对的映射集合,是因为有iterator方法。那么我们想一下这个iterator方法是怎么来的呢?是因为entrySet()方法中使用new实例化了一个EntrySet类

我们再查看EntrySet类的源码,里面有个iterator()方法字节码调用的就是这个iterator()方法

在方法的return语句中又实例化了EntryIterator类作为返回值,是一个迭代器,我们现查看EntryIterator类的源码,它只有一个next方法:

final class EntryIterator extends HashIterator
        implements Iterator> {
        public final Map.Entry next() { return nextNode(); }
    }

next()方法被调用返回的类型是Map.Entry,而得到的结果是nextNode()方法的返回值。

 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;
        }

nextNode()方法作用就是返回下一个节点。
Node类是HashMap的静态内部类:

Entry是Map的内部接口,该Entry接口有几个方法:

 interface Entry {
       
       K getKey();
       
       V getValue();
       
       V setValue(V value);
       
       boolean equals(Object o);
       
       int hashCode();

所以我们可以通过entry.getKey() 和 entry.getValue()方法获取到键和值。
注意:Node是Map的实现类

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/340973.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号