0

我有一个 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方法中填充的,但是回到caller方法查看,发现它的大小为0

4

6 回答 6

3

假设您可以重新分配方法参数,并让该更改反映在调用者中,那么您犯了一个典型的 java 错误。

   memorySubscriberValues = mainDao.getData(MSISDN_partition_prefix, MSISDN_loading_prefix, endIndexPartition);

如果你重新分配这个参数,它只会反映在这个当前的堆栈帧上。如果要更改参数,则需要memorySubscriberValues.put在方法内部实际使用。

于 2013-11-06T21:16:41.677 回答
1

原因是

mainDao.getData(MSISDN_partition_prefix, MSISDN_loading_prefix, endIndexPartition);

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

请参阅传递引用数据类型参数

于 2013-11-06T21:18:25.067 回答
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);
}
于 2013-11-06T21:19:10.767 回答
0

Java 不允许您重新设置引用,因为它是按值传递的。所以引用也是按值传递的。因此memorySubscriberValuesinloadCache是一个本地引用,您只需重新分配它以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(...).

另一方面,最好通过接口而不是具体类型(即MapvsHashMapListvs ArrayList)来键入您的集合。这样,您以后可以轻松地更换实现,并且您的设计不会与特定实现紧密耦合。

于 2013-11-06T21:17:42.830 回答
0

当你传递memorySubscriberValuesloadCache它时,它会创建一个它工作的副本。尝试这个:

HashMap<String, HashMap<String, String>> memorySubscriberValues = loadCache(memorySubscriberValues);
于 2013-11-06T21:20:34.180 回答
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,那么您对它所做的任何更改都将反映在它现在引用的任何映射中。

于 2013-11-06T21:21:08.830 回答