通过引用填充HashMap

时间:2013-11-06 21:13:36

标签: java hashmap

我有一个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

6 个答案:

答案 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);

创建一个方法本地的 新实例 。另一方面,如果您将该结果添加到已传递给方法的地图中 - 那么您就可以了

请参阅Passing Reference Data Type Arguments

答案 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 HashMapList 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,那么您对其所做的任何更改都将反映在它现在引用的任何地图中。