我有一个HashMap,我将它传递给一个函数,通过像这样的引用填充它,
HashMap<String, HashMap<String, String>> memorySubscriberValues = new HashMap<String, HashMap<String, String>>();
loadCache(memorySubscriberValues);
memorySubscriberValues.size();// size remains zero
并在loadCache方法中填写此HashMap,因为我认为它应该通过引用填充
loadCache(HashMap<String, HashMap<String, String>> memorySubscriberValues) {
memorySubscriberValues = mainDao.getData(MSISDN_partition_prefix, MSISDN_loading_prefix, endIndexPartition);
}
HashMap填充了loadCache方法,但是回到调用方法检查它,我发现它的大小是0
答案 0 :(得分:3)
假设您可以重新分配方法参数,并且将更改反映在调用方中,那么您将犯一个经典的Java错误。
memorySubscriberValues = mainDao.getData(MSISDN_partition_prefix, MSISDN_loading_prefix, endIndexPartition);
如果重新分配此参数,仅将反映在当前堆栈帧上。如果要更改参数,则需要在方法中实际使用memorySubscriberValues.put
。
答案 1 :(得分:1)
原因是
mainDao.getData(MSISDN_partition_prefix, MSISDN_loading_prefix, endIndexPartition);
创建一个方法本地的 新实例 。另一方面,如果您将该结果添加到已传递给方法的地图中 - 那么您就可以了
答案 2 :(得分:0)
Java不允许您重新引用引用,因为它是按值传递的。所以引用也按值传递。因此,memorySubscriberValues
中的loadCache
是本地参考,您只是将其重新指定为指向HashMap
返回的mainDao.getData
实例。这不会影响父方法中memorySubscriberValues
的引用,该方法指向新的HashMap
实例。我会修改你的代码来代替:
Map<String, Map<String, String>> memorySubscriberValues = loadCache();
public Map<String, Map<String, String>> loadCache(HashMap<String, HashMap<String, String>> memorySubscriberValues) {
return mainDao.getData(MSISDN_partition_prefix, MSISDN_loading_prefix, endIndexPartition);
}
这样您就可以在父函数中指定memorySubscriberValues
以指向Map
返回的mainDao.getData(...)
。
另一方面,最好按界面而不是具体类型键入集合(即Map
vs HashMap
或List
vs ArrayList
)。通过这种方式,您可以轻松地在以后交换实现,并且您的设计不会与特定实现紧密耦合。
答案 3 :(得分:0)
您的方法未填充作为参数传递的地图。它为传递的引用分配新映射。引用按值传递。因此原始的HashMap保持不变。
您只需从方法中返回一张地图:
HashMap<String, HashMap<String, String>> memorySubscriberValues = loadCache();
...
HashMap<String, HashMap<String, String>> loadCache() {
return mainDao.getData(MSISDN_partition_prefix, MSISDN_loading_prefix, endIndexPartition);
}
答案 4 :(得分:0)
当您将memorySubscriberValues
传递给loadCache
时,它会创建一个适用于它的副本。试试这个:
HashMap<String, HashMap<String, String>> memorySubscriberValues = loadCache(memorySubscriberValues);
答案 5 :(得分:0)
您只是重新分配memorySubscriberValues
变量以引用不同的 HashMap。你想要做的是将mainDao
中的所有条目添加到作为参数传入的HashMap中:
void loadCache(HashMap<String, HashMap<String, String>> memorySubscriberValues) {
for (Map.Entry<String,String> i : mainDao.getData(MSISDN_partition_prefix, MSISDN_loading_prefix, endIndexPartition).entrySet()) {
memorySubscriberValues.put(i.getKey(), i.getValue());
}
}
通过在传递给方法的同一引用上调用put
,所有更改都将反映在原始HashMap中。如果您重新分配变量memorySubscriberValues
,那么您对其所做的任何更改都将反映在它现在引用的任何地图中。