我有一些包含一些数据的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()方法的情况下没有任何不可预见的后果。
感谢您的任何意见!
答案 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)
的结果)为results
,map.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