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集合中键值的原因。
参考链接:
- Java高级之HashMap中的keySet()方法