Java—更新HashMap值的最佳方法—按值传递/引用相关

Java—更新HashMap值的最佳方法—按值传递/引用相关,java,collections,hashmap,pass-by-reference,pass-by-value,Java,Collections,Hashmap,Pass By Reference,Pass By Value,我有一个包含一些数据的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); HashMap//已经填充了数据 Double[]

我有一个包含一些数据的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);
HashMap//已经填充了数据
Double[]results=map.get(key);
更新日期(结果)//此函数用于更改结果数组。
地图。放置(键、结果);
…我的问题是地图是否有必要

我仍然对Java的按值传递和按引用传递的本质有点困惑。很清楚,在第一行代码中,我们得到了双数组的引用,对吗?因此,第二行的函数应该正确地更新HashMap中的Double数组。。。这似乎会使第三行的map.put()变得多余

看看其他人的HashMap相关代码,他们似乎总是在使用put()方法。我只是想确保在没有put()方法的情况下这样做不会产生任何不可预见的后果

谢谢你的意见

如果要修改从
HashMap
检索到的引用值所引用的对象,那么在同一
HashMap
中替换其条目是没有意义的

如果要修改引用,则确实需要替换它。

map.put(key,results)
仅当
map.get(key)
返回null时才是必需的,因为在这种情况下,您应该创建一个新数组并将其放入映射中

如果
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);
HashMap//已经填充了数据
...
Double[]results=map.get(key);
如果(结果==null){
结果=新的双[某个长度];
地图。放置(键、结果);
}
更新日期(结果);

现在,如果映射的值是一个不可变的类,如String或Integer,则必须在映射中放置一个新实例以替换它,因为您无法更改现有值。

Map.get(Object)
只返回对所述数组的引用,而不会将数组的内容复制到新数组。因此,对
Map.get(Object)
返回的数组所做的任何更改都将反映在
Map
中存储的数组中,因为它们是相同的数组。因此,在这种情况下调用
Map.put(Object,Object)
是完全多余的。

在显示的代码中,这是完全不必要的。
map.get(key)
的返回值存储在变量
results
中,之后再也不会将
results
赋值。因此,传递到
map.put()
results
的值保证与从
map.get(key)
获得的值相同。无论类型如何,这都是正确的

在本例中,调用
map.put(key,results)
和不调用它略有不同——如果
results
(map.get(key)的结果)是
null
map.put(key,results)
将把一个以前不存在的
null
值放进去。(
HashMap
允许
null
值。)

这将更新results对象(它包含不可变对象的集合,不可变对象是String对象),这意味着当您更新(results/String)对象的值时,它将在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 map=newhashmap();
地图放置(“键”、“值”);
RestAssured.baseURI=BASE\u URL;
RequestSpecification request=restasured.given();
request.auth().preemptive().basic(“用户名”、“密码”).body(映射).put(“url”);
System.out.println(“更改后字段的值为:”+map.get(“key”));

混合使用集合和数组通常不是一个好主意。当您编写一个小测试程序来找出答案时发生了什么?至于您对按值传递与按引用传递(Java甚至不支持)的混淆,我强烈建议您阅读,然后。@BackSlash
Map
是一种集合,
HashMap
是它的一种实现。您观察到的使用“put”的示例可能存储了不可变的值。他们正在替换它们,而不是修改它们,这将需要再次调用“put”@Fitzy123。我的观点是解决您对其他人使用HashMap的观察。您声明“它们似乎总是使用put()方法。”这很可能是因为它们的HashMap中存储的值是不可变的,这意味着它们不能被更改。对象可以从它们派生出来,但内存中的实际对象不能更改。例如,如果我们想“修改”HashMap中存储的字符串,我们可以从中派生另一个字符串,但最终我们必须调用“put”来替换原始字符串。您好,除了发布一些源代码外,如果您能解释一下您的答案,说明这是一个如何/为什么是给定问题的理想解决方案,那就太好了。
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"));