Java - 更新HashMap值的最佳方法 - 通过值/引用相关

时间:2014-08-20 15:01:10

标签: 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);

...我的问题是map.put(键,结果)是否有必要?

我仍然对Java的pass-by-value和pass-by-reference性质感到有些困惑。要清楚,在第一行代码中,我们得到了Double数组的引用,对吗?因此,第二行上的函数应该正确更新HashMap中的Double数组...这样就会使第三行上的map.put()变得多余。

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

感谢您的任何意见!

6 个答案:

答案 0 :(得分:3)

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

答案 1 :(得分:1)

如果您要修改从HashMap检索到的参考值所引用的对象,则无法在同一HashMap中替换其条目

如果您正在修改参考,那么您需要更换它。

答案 2 :(得分:0)

仅当map.put(key, results)返回null时才需要

map.get(key),因为在这种情况下,您应该创建一个新数组并将其放在地图中。

如果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中添加一个新实例才能替换它,因为你无法改变它现有价值。

答案 3 :(得分:0)

在显示的代码中,完全没有必要。 map.get(key)的返回值存储在变量results中,results 从未分配给。因此,传递给results的{​​{1}}的值保证与map.put()获得的值相同。无论何种类型,都是如此。

如果map.get(key)map.put(key, results)的结果)为resultsmap.get(key),则调用null而不是在此情况下调用它会略有不同将map.put(key, results)值放在之前不存在的值中。 (null允许HashMap值。)

答案 4 :(得分:0)

updateArray(results);

这将更新结果对象(包含不可变对象的集合,即String对象),这意味着当您更新(results / String)对象的值时,它将在结果对象引用下创建另一个String。因此,如果您想要再次查看地图下的更改,则必须将其放在地图中。

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

答案 5 :(得分:0)

Bitmap