2017-08-23 4 views
0

私は地図を値として、地図を値として(javaで)設定しています。それぞれをコピーし、エイリアシングを回避しようとする方法を書いたが、私のプログラムが動作するように、私は彼らの動作を確認していない。私はコピー方法を実行した後もエイリアシングがありますか?

private Map<String, Set<String>> deepCopySet(Map<String, Set<String>> ruledOutCount) { 
    Map<String,Set<String>> copy = new HashMap<String,Set<String>>(); 
    for(Map.Entry<String, Set<String>> entry : ruledOutCount.entrySet()) 
    { 
     copy.put(entry.getKey(), new HashSet<String>(entry.getValue())); 
    } 
    return copy; 
} 

private Map<SG, Map<classObj, Integer>> deepCopyMap(Map<SG, Map<classObj, Integer>> classCountPerSG) 
{ 
    Map<SG,Map<classObj,Integer>> copy = new HashMap<SG,Map<classObj,Integer>>(); 
    for(Map.Entry<SG, Map<classObj,Integer>> entry : classCountPerSG.entrySet()) 
    { 
     copy.put(entry.getKey(), new HashMap<classObj,Integer>(entry.getValue())); 
    } 
    return copy; 
} 

classObjとSGは自分自身のオブジェクトです。 これらのコピー方法を実行すると、エイリアシングが発生する可能性はありますか?おかげさまで

+1

"私のプログラムが動作しているように、私は彼らが動作するかどうかはわかりません。"あなたはそれが何をすると思いますか、代わりに何をしますか? –

答えて

0

deepCopySetメソッドは正常です。

deepCopyMap方法も結構ですが、それはSGclassObjの種類によって異なります。それは、彼らはまた、マップ(またはその他の複雑なオブジェクト)されている可能性がある場合は、浅いコピーを取得する可能性があります。

Javaはコンパイル時にのみタイプチェックを行います。したがって、次のコード

StringBuilder willNotBeCopied = new StringBuilder(); 
Map evil = new HashMap(); 
evil.put("a", new HashSet(Arrays.asList(willNotBeCopied))); 
Map shallowCopy = deepCopySet(evil); 
willNotBeCopied.append("some text"); 

shallowCopyマップは同じ StringBuilderのインスタンス(浅いコピー)を含んでいるでしょう。

+0

ありがとう!これらのオブジェクトはどちらも文字列と整数だけを格納するので、うまくいくはずです –

関連する問題