この記事では、Javaの深い複製機能と使用について説明します。次のように、参照のために共有してください。
以前に書かれた:
深い複製とは何ですか? Javaでは、オブジェクトを作成するときに、通常、オブジェクトを指す基準があります。変数を参照してオブジェクトの値(プロパティ)を変更すると、参照は変更されておらず、メモリのメモリ、つまり指摘されたオブジェクトを変更します。一般的に、この参照を別の参照変数に割り当てるか、パラメーターとして渡すと、それを渡すだけです。つまり、参照を別の参照変数に「コピー」することを指し、参照変数も同じオブジェクトを指し、新しいオブジェクトはメモリに作成されません。場合によっては、オブジェクトを「本当にコピー」し、バックアップであろうと他の操作であろうと、参照を「コピー」するだけでなく、既知のオブジェクトのコピーを作成する必要があります。
それで、それを達成する方法は?
最初にアイデアについて話しましょう。最初にオブジェクトをストリームにシリアル化してから、それを脱皮化して、ストリームから読んでください。
次のコード:
パッケージcom.yo.java; Import java.io.io.bytearrayinputStream; Import java.io.io.bytearrayoutputStream; Import java.io.ioexception; Import java.io.objectinputStream; Import java.io.io.objectputStream; Import java.imaisable; import java.util.util.util.util.itil.implay.util.util.implay.implay.utilizable; java.util.list;/** * javaは深いコピー * @author yo * */public class deepcopyをserializable {int i; / ** * @param args * @throws ioexception * @throws classnotfoundexception */ public static void main(string [] args)throws classnotfoundexception、ioexception {demo1(); demo2(); }/** *ディープコピー、実際のパラメータークラスはシリアル化可能なインターフェイスを実装する必要があります * @param o * @return * @throws ioexception * @throws classnotfoundexception */public static object deepcopy(object o)throws ioexception、classnotfoundexception {// ObjectOutputStream OO = new objectOutputStream(bo); oo.writeObject(o); //その後、ストリームから脱気体化して読み取ります。つまり、bytearrayinputStream bi = new bytearrayinputStream(bo.tobytearray())をコピーします。 ObjectInputStream oi = new ObjectInputStream(bi); retur oi.readobject(); } / ** *参照パスとディープコピー * @Throws ClassNotFoundException * @Throws IOException * / public static void demo1()throws classNotFoundException、iOException { System.out.println( "================================================================================ ===================================================================================================================================== ===================================================================================================================================== ============================================================================================================================================== 1; System.out.println( "================================================================================= ============================================================================================================================================ ========================================================================================= ============================================================================================================================================ (DeepCopy)DeepCopy(DC3); // DC3システムの値を変更するpublic static void demo2()throws classnotfoundexception、ioexception {system.out.println( "================================================================== of System. System. Out of System. System. Out of System. System. Out of System. System. Out of System. System. Out of System. System. Out of System. System. System. Out of System. System. System. Out of System. System. System. Out of System. System. System. Out of System. System. System. Out of System. System. System. Out of System. System. System. Out of System. System. System. System. Out of System. System. System. System. Out of System. System. System. System. Out of System. System. System. System. Out of System. System. System. System. Out of System. System. System. System. System. Out of System. System. System. System. System. System. Out of System. System. System. System. System. System. Out of System. System. System. System. System. System. System. System. Out of System. System. System. System. System. System. System. System. System. System. System. System. System. System. System. System. System. System. System. System. System. System. System. System. System. System. System. System. System. System. System. System. System. System. System. System. System. System. System. System. System. System. System. System. System. System. System. System. System. System. System. System. System. System. System. System. System. System. System. System. System. System. System. System. System. System. System. System. System. System. System. System. System. System. System. System. System. System. System. System. System. System. System. System. System. System. System. System. System. System. System. System. System. System. System. System. System. System. System. System. System. System. System. System. System. System. System. System. System. System src) The result is the same //Change the value of the element in list1 for(DeepCopy d1 : list1) { //Change the value of i in dc1 d1.i = 2。 System.out.println( "================================================================================================================ ================================================================================== ================================================================================== ==================================================================================新しいdeepcopy(); // dc3 list3 = new arraylist <deepcopy>(dc3)の初期} for(deepcopy d3:list3){system.out.println( "list3:" + d3.i);上記の操作結果は次のとおりです(実際に測定):
============================================================================================== ============================================================================================== ============================================================================================== ==================================================================================================== :2List4(ディープコピー):1
パスを参照したり、オブジェクトの値に基づいて新しい値を作成したりするだけで、「浅いコピー」とのみと呼ばれることがわかります。元のオブジェクトのプロパティが変更されると、上記の方法に従って作成された新しいオブジェクトのプロパティもそれに応じて変更されます。また、ディープコピーが使用されている場合、新しいオブジェクトがコピーされていることは事実です。新しいオブジェクトは、元のオブジェクトと関係がありません。元のオブジェクトのプロパティの変更は、コピーの意味と同じように、新しいオブジェクトに影響しません。
前述のように、不適切さがある場合、あなたがそれを指摘できるなら、どうもありがとう
Java関連のコンテンツについては、このサイトに興味のある読者がトピックを見ることができます。「Javaデータ構造とアルゴリズムのチュートリアル」、「Java操作のヒントの要約」、「Javaファイルの要約およびディレクトリ操作のヒント」、「Java Cache操作のヒントの要約」
この記事がみんなのJavaプログラミングに役立つことを願っています。