-1

この中に「Node」というオブジェクトのリストがあるとしましょう-> Iterable allNodes。

allNodes のすべてのノードを繰り返し処理し、次のように独自のリストに追加したとします。

Iterable<Node> allNodes = dataManager.getAllNodes();
List<Node> copyOfAllNodes;
for(Node node : allNodes) {
    copyOfAllNodes.add(node);
}

コピーは参照になりますか、それとも元のリストに影響を与えないコピーですか?

4

1 に答える 1

3

あくまでも参考になります。実行する場合:

copyAllNodes.add(node)

nodeオブジェクトである を に挿入しますcopyAllNodes

オブジェクトのコピーが必要な場合は、他のアプローチがあります。アプローチの 1 つは、close基本的にCloneableインターフェイスを実装し、オブジェクトをコピーするためにメソッドを公開cloneすることです。したがって、次のようなことができます。

copyAllNodes.add(node.clone)

これは、コピーされたオブジェクトに影響を与えることなく変更できるコピーになります。デフォルトの clone メソッドは、オブジェクトの浅いコピーを行うだけであることを覚えておくとよいでしょう

ドキュメントから:

クラス Object のメソッド clone は、特定の複製操作を実行します。まず、このオブジェクトのクラスがインターフェース Cloneable を実装していない場合、CloneNotSupportedException がスローされます。すべての配列は、インターフェイス Cloneable を実装すると見なされることに注意してください。それ以外の場合、このメソッドはこのオブジェクトのクラスの新しいインスタンスを作成し、割り当てによるかのように、このオブジェクトの対応するフィールドの内容を正確に使用してすべてのフィールドを初期化します。フィールドの内容自体は複製されません。したがって、このメソッドは、「ディープ コピー」操作ではなく、このオブジェクトの「浅いコピー」を実行します。

于 2012-07-02T21:02:32.187 に答える