![](/img/trans.png)
[英]What is the time complexity of java.util.HashMap class' keySet() method?
[英]Java: what's the meaning of this method of class HashMap?
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视图。 该集合由地图支持,因此对地图的更改将反映在集合中,反之亦然。
“更改地图”是否意味着“对映射对象的更改”? 那么这样setField
方法可以改变地图中的对象吗?
“更改地图”是否意味着“对映射对象的更改”?
这意味着对地图的更改(但请参见下面的1 )。 该集合是地图中值的实时视图 ,因此当您向地图添加条目或从地图中删除条目时,集合会反映这些更改; 这两者是相互关联的。 例如:
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
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
}
values方法返回一组对内存中对象的引用。 由于您的对象是可变的,因此对它们所做的任何更改都将反映在地图中,因为地图具有对同一内存的引用。
包含以下内容的Map示例:
"key1" -> "value1"
"key2" -> "value2"
values()
将返回以下集合:“value1”,“value2”
是的,如果您在地图中的对象上使用变异方法,它将在您之前检索的values()
集合中更改。 但最有趣的是, 从map中添加/删除元素会导致值集合发生变化 。
例:
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]
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.