[英]Java - Best way to update HashMap value - Pass by value/reference related
我有一個帶有一些數據的 HashMap。 看下面的代碼...
HashMap<String, Double[]> map; //Already populated with data
Double[] results = map.get(key);
updateArray(results); //This function makes changes to the results array.
map.put(key, results);
...我的問題是 map.put(key, results) 是否甚至是必要的?
我仍然對 Java 的值傳遞和引用傳遞性質有些困惑。 需要明確的是,在第一行代碼中,我們獲得了對 Double 數組的引用,對嗎? 因此,第二行的函數應該正確更新 HashMap 中的 Double 數組...這似乎會使第三行的 map.put() 變得多余。
看別人的HashMap相關代碼,好像都是用的put()方法。 我只是想確保在沒有 put() 方法的情況下不會有任何不可預見的后果。
感謝您提供任何意見!
Map.get(Object)
簡單地返回到所述陣列參考,並不數組的內容復制到一個新的數組。 因此,您對Map.get(Object)
返回的數組所做的任何更改都將反映在存儲在Map
中的更改中,因為它們是相同的數組。 因此,這使得在這種情況下調用Map.put(Object,Object)
完全多余。
如果您正在修改從HashMap
檢索到的引用值所引用的對象,則在同一個HashMap
替換其條目是沒有意義的。
如果要修改引用,則確實需要替換它。
僅當map.get(key)
返回 null 時才需要map.put(key, results)
,因為在這種情況下,您應該創建一個新數組並將其放入地圖中。
如果map.get(key)
返回一個非空數組, updateArray(results)
將更新該數組,並且無需再次將相同的數組放入Map
。
所以,總而言之,這段代碼涵蓋了所有情況:
HashMap<String, Double[]> map; //Already populated with data
...
Double[] results = map.get(key);
if (results == null) {
results = new Double[someLength];
map.put(key, results);
}
updateArray(results);
現在,如果您的 Map 的值是一個不可變的類,例如 String 或 Integer,則您必須在 Map 中放置一個新實例才能替換它,因為您將無法更改現有值。
在顯示的代碼中,完全沒有必要。 map.get(key)
的返回值存儲在變量results
,並且results
永遠不會分配給map.get(key)
。 因此,傳遞給map.put()
的results
值保證與從map.get(key)
獲得的值相同。 無論類型如何,都是如此。
在這種情況下調用map.put(key, results)
和不調用它略有不同——如果results
( map.get(key)
)為null
, map.put(key, results)
將放置一個以前不存在的null
值。 ( HashMap
允許null
值。)
updateArray(results);
這將更新結果對象(它包含不可變對象的集合,即字符串對象),這意味着當您更新(結果/字符串)對象的值時,它將在結果對象引用下創建另一個字符串。 因此,如果您想查看地圖下的更改,則必須再次將其放入地圖中。
my question is whether or not the map.put(key, results) is even necessary?
map.put(key,results); // will only reflect the changes in map
HashMap<String,String> map = new HashMap<>();
map.put("key", "value");
RestAssured.baseURI = BASE_URL;
RequestSpecification request = RestAssured.given();
request.auth().preemptive().basic("Username", "Password").body(map).put("url");
System.out.println("The value of the field after change is: " + map.get("key"));
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.