[英]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.