Java高级之HashMap中的values()方法

values()方法的作用是得到HashMap中的value的集合。

values()方法的源码:

    /**
     * 获取HashMap中value的集合
     *
     * @return 返回value集合
     */
    public Collection<V> values() {
        /*
            1.与keySet()方法一样,最重要的还是new Values(),实例化Values对象
         */
        Collection<V> vs = values;
        if (vs == null) {
            // 实例化Values类对象
            vs = new Values();
            values = vs;
        }
        // 返回该对象
        return vs;
    }

在该方法中可以看到没有将HashMap中所有的value值放到一个集合中返回,这是怎么回事呢?而只是返回了一个vs对象,该对象确实是实例化的Values类。

写一个Demo来使用values()方法:

public class Demo {
    public static void main(String[] args) {
        Map<String,String> map=new HashMap<>();
        map.put("abc","123");
        map.put("efg","456");
        // 使用增强型for遍历循环Map集合
        Collection<String> values = map.values();
        for (String value : values) {
            System.out.println(value);
        }
    }
}

那么是如何得到这些值并输出的呢?

需要查看编译的字节码文件Demo.class

public class Demo {
    public Demo() {
    }

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

        while(var3.hasNext()) {
            String value = (String)var3.next();
            System.out.println(value);
        }

    }
}

我们使用的是增强型的for循环来遍历集合中的元素,但看编译后的字节码文件,可以看到底层是使用的是迭代器。

那么来看看源码中实例化的Values类,查看里面的iterator()方法,该方法就是调用的迭代器方法,返回值是一个value值迭代器。

可以看到实例化了ValueIterator类,继续查看ValueIterator类的代码:

在该类中只有一个next()方法,返回的是下一个结点的键值。

在返回语句中调用了nextNode()方法,该方法是得到下一个结点Node。

所以使用增强型for循环遍历Collections集合,实质上是利用迭代器Iterator遍历元素。

而Values类有一个迭代器方法iterator(),能够迭代元素,这就是能够values()方法能够得到HashMap集合中键值的原因。

参考链接:

评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值