java - HashMap.values() 和 HashMap.keySet() 如何返回值和键?

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]"
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值