Java—更新HashMap值的最佳方法—按值传递/引用相关
我有一个包含一些数据的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<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甚至不支持)的混淆,我强烈建议您阅读,然后。@BackSlashMap
是一种集合,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"));