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

1

その理由は

mainDao.getData(MSISDN_partition_prefix, MSISDN_loading_prefix, endIndexPartition);

メソッドに対してローカルな新しいインスタンスを作成します。一方、その結果をメソッドに渡したマップに追加する場合は、問題ありません

参照データ型引数の受け渡しを参照してください

于 2013-11-06T21:18:25.067 に答える
0

Java では値渡しであるため、参照を再配置することはできません。したがって、参照も値渡しされます。したがって、memorySubscriberValuesinはローカル参照であり、によって返されるインスタンスloadCacheを指すように再割り当てするだけです。これは、新しいインスタンスを指す親メソッドの参照には影響しません。代わりにこれを行うようにコードを変更します。HashMapmainDao.getDatamemorySubscriberValuesHashMap

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);
}

このようにして、返された bymemorySubscriberValuesを指すように親関数に代入しています。MapmainDao.getData(...)

別の注意点として、具象型 (つまり、MapvsHashMapまたはListvs 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 に答える