HashMap.values()的源代码如下所示:
public Collection<V> values() {
Collection<V> vs = values;
return (vs != null ? vs : (values = new Values()));
}
如您所见,当 values()首先调用的方法,它只返回一个 Values目的。 Values对象是 AbstractCollection 的子类没有构造函数,当然也不包含任何元素。但是当我调用该方法时,它迅速返回了一个集合
Collection<String> values = map.values();
System.out.println(values);
那太奇怪了。不仅values() ,还有keySet()和 entrySet()方法返回这样的空对象。所以,这是我的问题,这些方法何时以及如何返回包含我们需要的元素的对象?
最佳答案
Values 是一种误解类(class)“当然是空的”。仅仅因为没有调用它的方法并且它的构造函数没有任何参数并不意味着集合是空的。
Values class 是 HashMap 的“内部类”(非静态 nested class ) ,这意味着它隐式引用了 HashMap创建它的对象。因此,它可以访问 HashMap 的所有元素。 , 要么明确使用 HashMap.this引用或直接访问成员。由于是内部类,甚至允许访问HashMap的私有(private)成员。
例如,您可以在 Values 中看到这一点。 size 的类的实现方法:
public int size() {
return size;
}
Values类(class)没有 size成员(member),以便 size指的是HashMap的
大小。它相当于:
public int size() {
return HashMap.this.size;
}
编辑:请注意,这也意味着您收到的 Collection 不是副本,但仍指原始HashMap内容,因此在您更新 HashMap 时会发生变化:
// Getting the entry set (not a copy!)
Set<Entry<String, String>> entries = map.entrySet();
// Add elements to the map afterwards
map.put("abc", "def");
// Check out the entries in the collection
// (magically containing the elements added after getting the collection)
System.out.println(entries); // "[abc=def]"