Java:这个HashMap类方法的含义是什么?

时间:2016-06-15 16:23:11

标签: java dictionary

class MyObject {
    int field;
    public void setField(int arg1) { 
        this.field = arg1;
    }
} 

HashMap<String, MyObject> map;
... 
... // put some MyObjects in the map with strings as keys
...
for (MyObject object : map.values()) {
    object.setField(12345);
}

我在循环中对对象所做的更改是在地图中的相同对象上进行的吗?

指南说明了values()方法

  

返回此地图中包含的值的Collection视图。该集合由地图支持,因此对地图的更改将反映在集合中,反之亦然。

&#34;是否会改变地图&#34;意味着&#34;对映射对象的更改&#34;?那么这种setField方法可以改变地图中的对象吗?

4 个答案:

答案 0 :(得分:6)

  

&#34;是否会改变地图&#34;意味着&#34;对映射对象的更改&#34;?

这意味着对地图的更改(但请参阅下面的 1 )。该集合是地图中值的实时视图,因此当您向地图添加条目或从地图中删除条目时,集合会反映这些更改;这两者是相互关联的。 E.g:

Map<String, String> m = new HashMap<String, String>();
Collection<String> c = m.values();
m.put("hi, "there");
System.out.println(c.size()); // 1, not 0

Live Example

1 另外:无论您是通过集合还是地图获得对这些对象的引用,当然可以看到对作为地图中的值存储的对象状态的更改;他们引用到对象,而不是对象的副本

答案 1 :(得分:1)

方法HashMap.values() - 如javadoc中所述。

  

返回此地图中包含的值的Collection视图。该集合由地图支持,因此对地图的更改将反映在集合中,反之亦然。如果在对集合进行迭代时修改了映射(除了通过迭代器自己的remove操作),迭代的结果是未定义的。该集合支持元素删除,它通过Iterator.remove,Collection.remove,removeAll,retainAll和clear操作从地图中删除相应的映射。它不支持add或addAll操作。

这是说它返回数组中所有元素的集合(类似于List)。它还声明该集合由地图支持,因此如果您更改地图,集合也将更新,更改集合也将更改地图。请注意,无法从此集合中添加元素。

此示例显示了该方法的使用情况。

public static void main(String[] args) {
    Map<String, String> mapValues = new HashMap<>();
    mapValues.put("Hi", "Hello");
    mapValues.put("Bye", "Goodbye");
    System.out.println(mapValues.size());//prints 2
    Collection<String> values = mapValues.values();
    values.remove("Hello");
    System.out.println(mapValues.size());//prints 1
    System.out.println(values.size());//prints 1
    mapValues.put("Morning", "Good morning");
    System.out.println(mapValues.size());//prints 2
    System.out.println(values.size());//prints 2
}

答案 2 :(得分:0)

values方法返回一组对内存中对象的引用。由于您的对象是可变的,因此对它们所做的任何更改都将反映在地图中,因为地图引用了相同的内存。

答案 3 :(得分:-1)

包含以下内容的地图示例:

"key1" -> "value1"
"key2" -> "value2"

values()将返回以下集合:“value1”,“value2”

是的,如果您对地图中的对象使用变异方法,它将在您之前检索的values()集合中更改。 但最有趣的部分是从地图中添加/删除元素会导致值集合发生变化

示例:

Map<String, String> map = new HashMap<>();
Collection<String> vals = map.values();
System.out.println("Before: " + vals);
map.put("key1", "value1");
System.out.println("After: " + vals);

这将打印:

Before: []
After: [value1]