Java 通过引用填充HashMap
我有一个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<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
vsHashMap
或List
vsArrayList
)。通过这种方式,您可以很容易地在以后交换实现,并且您的设计不会与特定的实现紧密耦合。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
vsHashMap
或List
vsArrayList
)。通过这种方式,您可以很容易地在以后交换实现,并且您的设计不会与特定的实现紧密耦合。原因是
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前缀)