私の連絡先情報
郵便メール:
2024-07-12
한어Русский языкEnglishFrançaisIndonesianSanskrit日本語DeutschPortuguêsΕλληνικάespañolItalianoSuomalainenLatina
Javaのディープコピーとシャローコピーの違いを教えてください。
Java では、ディープ コピーとシャロー コピーはオブジェクトをコピーする 2 つの方法であり、オブジェクトをコピーするときの動作は本質的に異なります。
浅いコピーとは、新しいオブジェクトを作成し、フィールドが値型の場合はそのフィールドを少しずつコピーすることを指します。参照はコピーされますが、コピーされません。 参照されたオブジェクトはコピーされません。したがって、元のオブジェクトとそのコピーは同じオブジェクトを参照します。
Java では、これは次のようにして実現できます。Cloneable
インターフェイスとリライトclone()
浅いコピーを実装する方法。Object
クラスでclone()
この方法では浅いコピーを実現できます。
class Original implements Cloneable { | |
private int[] nums; | |
public Original() { | |
nums = new int[5]; | |
} | |
public void setNums(int[] nums) { | |
this.nums = nums; | |
} | |
public Object clone() throws CloneNotSupportedException { | |
return super.clone(); | |
} | |
} |
この例では、nums
参照型です。もしOriginal
オブジェクトは浅くコピーされ、その後、nums
そして元のオブジェクトではnums
同じ配列オブジェクトを指します。
ディープ コピーは、オブジェクト自体をコピーするだけでなく、オブジェクトに含まれるすべての参照型のメンバー変数も再帰的にコピーします。つまり、コピーと元のオブジェクトは参照型のメンバー変数を共有しません。 1 つのオブジェクトのメンバー変数を変更しても、別のオブジェクトには影響しません。
Java では、ディープ コピーを実装するには、参照型のすべてのメンバー変数が適切にコピーされるようにコードを手動で記述する必要がよくあります。
class DeepCopied implements Cloneable { | |
private int[] nums; | |
public DeepCopied() { | |
nums = new int[5]; | |
} | |
public void setNums(int[] nums) { | |
this.nums = nums; | |
} | |
@Override | |
public Object clone() throws CloneNotSupportedException { | |
DeepCopied copied = (DeepCopied) super.clone(); | |
copied.nums = nums.clone(); // 对引用类型的成员变量也进行拷贝 | |
return copied; | |
} | |
} |
この例では、nums
配列もコピーされるため、元のオブジェクトとコピーは共有されませんnums
配列。
ディープ コピーとシャロー コピーのどちらを使用するかは、特定のアプリケーションのシナリオと要件によって異なります。
Java の匿名内部クラスとは何ですか?その応用シナリオは何ですか?