Java高级之HashMap中的entrySet()方法使用

基本使用

entrySet()方法得到HashMap中各个键值对映射关系的集合。

然后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());
        }
    }
}
/**
 * 打印结果:
 * abc->123
 * efg->456
 */

原理剖析

HashMap的entrySet()方法返回Set>,那么为什么entrySet()方法可以得到键值对映射集合呢?

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

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

entrySet()方法的源码注释如下:

    /**
     * 该方法返回值就是这个map中各个键值对映射关系的集合
     * 1.Map中采用Entry内部类来表示一个映射项,映射项包含Key和Value
     * 2.Map.Entry里面包含getKey()和getValue()方法
     *
     * @return 返回map中各个键值对映射关系的集合
     */
    public Set> entrySet() {
        Set> es;
        return (es = entrySet) == null ? (entrySet = new EntrySet()) : es;
        /*
            等价于(代码复杂化)
            Set> es = entrySet;
            if (es == null) {
                entrySet = new EntrySet();
                return entrySet;
            } else {
                return 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();
            System.out.println((String)entry.getKey() + "->" + (String)entry.getValue());
        }
 
    }
}

能够获取到元素是通过迭代器Iterator遍历得来的,所以entrySet()方法能有键值对的映射集合,是因为iterator()方法。

那么iterator()方法是哪里的呢?

在entrySet()方法中使用new实例化了一个EntrySet类

查看EntrySet类源码,里面有个iterator()方法,字节码文件中调用的就是该iterator()方法

Java高级之HashMap中的entrySet()方法使用_第1张图片

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

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

Java高级之HashMap中的entrySet()方法使用_第2张图片

nextNode()方法的作用就是返回下一个结点。

而Entry是Map的内部接口,该Entry接口有几个方法可以设置或得到键值。

Java高级之HashMap中的entrySet()方法使用_第3张图片

所以能够通过entry.getKey()和entry.getValue()方法获取到键和值。

并且Node是Map.Entry的实现类。

Java高级之HashMap中的entrySet()方法使用_第4张图片

总结

以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。

你可能感兴趣的:(Java高级之HashMap中的entrySet()方法使用)