簡體   English   中英

Java - 更新 HashMap 值的最佳方式 - 通過值/引用相關

[英]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)和不調用它略有不同——如果resultsmap.get(key) )為nullmap.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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM