Java 通过引用填充HashMap

Java 通过引用填充HashMap,java,hashmap,Java,Hashmap,我有一个HashMap,我把它传递给一个函数,通过如下引用填充它 HashMap<String, HashMap<String, String>> memorySubscriberValues = new HashMap<String, HashMap<String, String>>(); loadCache(memorySubscriberValues); memorySubscriberValues.size();// size re

我有一个HashMap,我把它传递给一个函数,通过如下引用填充它

HashMap<String, HashMap<String, String>> memorySubscriberValues = new HashMap<String, HashMap<String, String>>();
    loadCache(memorySubscriberValues);
memorySubscriberValues.size();// size remains zero
HashMap memorySubscriberValues=newhashmap();
loadCache(MemorySubscriberValue);
memorySubscriberValues.size();//规模仍然为零
在loadCache方法中,我填充了这个HashMap,我认为应该通过引用来填充它

   loadCache(HashMap<String, HashMap<String, String>> memorySubscriberValues) {
       memorySubscriberValues = mainDao.getData(MSISDN_partition_prefix, MSISDN_loading_prefix, endIndexPartition);
}
loadCache(HashMap MemorySubscriberValue){
memorySubscriberValues=mainDao.getData(MSISDN_分区_前缀、MSISDN_加载_前缀、endIndexPartition);
}

HashMap是在loadCache方法中填充的,但是回到调用方方法来检查它,我发现它的大小是0,如果您可以重新分配方法参数,那么您犯了一个典型的java错误,并且将该更改反映在调用方中

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

如果重新指定此参数,它将仅反映在此当前堆栈帧上。如果要更改参数,需要实际使用
memorySubscriberValues。将
放在方法内部。

假设可以重新分配方法参数,并将更改反映在调用方中,这是一个典型的java错误

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

如果重新指定此参数,它将仅反映在此当前堆栈帧上。如果要更改参数,则需要实际使用
memorySubscriberValues。将
放在方法内部。

Java不允许重新放置引用,因为它是按值传递的。所以引用也是按值传递的。因此,
loadCache
中的
memorySubscriberValues
是一个本地引用,您只需将其重新分配给指向
mainDao.getData
返回的
HashMap
实例。这不会影响父方法中指向新的
HashMap
实例的
memorySubscriberValues
的引用。我将修改您的代码以执行此操作:

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);
}
Map memorySubscriberValues=loadCache();
公共映射加载缓存(HashMap memorySubscriberValues){
返回mainDao.getData(MSISDN_分区_前缀、MSISDN_加载_前缀、endIndexPartition);
}
这样,您就可以在父函数中分配
memorysubscribervalue
,以指向
mainDao.getData(…)
返回的
Map


另一方面,最好按接口而不是具体类型键入集合(即,
Map
vs
HashMap
List
vs
ArrayList
)。通过这种方式,您可以很容易地在以后交换实现,并且您的设计不会与特定的实现紧密耦合。

Java不允许您重新放置引用,因为它是按值传递的。所以引用也是按值传递的。因此,
loadCache
中的
memorySubscriberValues
是一个本地引用,您只需将其重新分配给指向
mainDao.getData
返回的
HashMap
实例。这不会影响父方法中指向新的
HashMap
实例的
memorySubscriberValues
的引用。我将修改您的代码以执行此操作:

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);
}
Map memorySubscriberValues=loadCache();
公共映射加载缓存(HashMap memorySubscriberValues){
返回mainDao.getData(MSISDN_分区_前缀、MSISDN_加载_前缀、endIndexPartition);
}
这样,您就可以在父函数中分配
memorysubscribervalue
,以指向
mainDao.getData(…)
返回的
Map

另一方面,最好按接口而不是具体类型键入集合(即,
Map
vs
HashMap
List
vs
ArrayList
)。通过这种方式,您可以很容易地在以后交换实现,并且您的设计不会与特定的实现紧密耦合。

原因是

mainDao.getData(MSISDN_partition_prefix, MSISDN_loading_prefix, endIndexPartition);
创建方法本地的新实例。另一方面,如果将该结果添加到已传递给该方法的映射中,那么就可以了

参见

原因是

mainDao.getData(MSISDN_partition_prefix, MSISDN_loading_prefix, endIndexPartition);
创建方法本地的新实例。另一方面,如果将该结果添加到已传递给该方法的映射中,那么就可以了


请参见

您的方法没有填充作为参数传递的映射。它为传递的引用指定一个新映射。和引用是通过值传递的。因此原始HashMap保持不变

您只需从方法返回一个映射:

HashMap<String, HashMap<String, String>> memorySubscriberValues = loadCache();

...

HashMap<String, HashMap<String, String>> loadCache() {
    return mainDao.getData(MSISDN_partition_prefix, MSISDN_loading_prefix, endIndexPartition);
}
HashMap memorySubscriberValues=loadCache();
...
HashMap loadCache(){
返回mainDao.getData(MSISDN_分区_前缀、MSISDN_加载_前缀、endIndexPartition);
}

您的方法没有填充作为参数传递的映射。它为传递的引用指定一个新映射。和引用是通过值传递的。因此原始HashMap保持不变

您只需从方法返回一个映射:

HashMap<String, HashMap<String, String>> memorySubscriberValues = loadCache();

...

HashMap<String, HashMap<String, String>> loadCache() {
    return mainDao.getData(MSISDN_partition_prefix, MSISDN_loading_prefix, endIndexPartition);
}
HashMap memorySubscriberValues=loadCache();
...
HashMap loadCache(){
返回mainDao.getData(MSISDN_分区_前缀、MSISDN_加载_前缀、endIndexPartition);
}

当您将
memorySubscriberValues
传递到
loadCache
时,它会创建一个副本供其使用。试试这个:

HashMap<String, HashMap<String, String>> memorySubscriberValues = loadCache(memorySubscriberValues);
HashMap memorySubscriberValues=loadCache(memorySubscriberValues);

当您将
memorySubscriberValues
传递到
loadCache
时,它会创建一个副本供其使用。试试这个:

HashMap<String, HashMap<String, String>> memorySubscriberValues = loadCache(memorySubscriberValues);
HashMap memorySubscriberValues=loadCache(memorySubscriberValues);

您只需重新分配
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());
    }
}
void loadCache(HashMap memorySubscriberValues){
对于(Map.Entry i:mainDao.getData(MSISDN\u分区\u前缀)