ジャワのシャローコピーとディープコピーは&&割り当ての文字列型をオブジェクト

Javaデータ型は、基本データ型と参照データの種類に分けられます。割り当て、送信パラメータ、またはメソッドの戻り値を実行するデータの種類、両方のために、値は、参照によって渡され、その差(アドレス)が送信されます。

浅いコピー(シャローコピー):

データ・タイプは、基本データ型のメンバー変数であるため①、浅いコピーが新しいコピーをオブジェクトの属性値、すなわち、値を直接転送します。二つの異なるデータは、これにオブジェクトのメンバ変数は、値を修正するため、オブジェクトの別のコピーが取得されたデータには影響を与えないであろう。

②データ・タイプは、インスタンス変数のメンバ変数のデータ・タイプの参照は、そのようなオブジェクトのクラスとしてメンバーの配列なので、浅いコピーを通過する参照、すなわち、唯一の基準値(メモリアドレス)メンバ変数であります新しいオブジェクトにコピーします。実際には二つのオブジェクトのメンバ変数は、同じインスタンスを指しているので。この場合、オブジェクトのメンバ変数の変更に別のオブジェクトのメンバ変数の値に影響を与えます。

注:定数値で同等の基本的なタイプの文字列データ型、つまり、参照データ型の新しいキーワードを介してオブジェクトを作成します

以下の条件の下では、オブジェクトの浅いコピーは、以下のとおりです。

(1)コピーコンストラクタ

(2)通常の書き換えクローン()メソッド(Cloneableインタフェースを実装する必要があり、クラスのクローンメソッドを使用し、それ以外の場合は、例外CloneNotSupportedExceptionがスローされます)

ディープコピー

まず、オブジェクトグラフの概念を導入しました。クラスオブジェクトを有する想像、そのメンバーは、決意するまで、別のオブジェクトを指す変数オブジェクト、別のオブジェクトを指す別のオブジェクト、インスタンスを持っています。これは、オブジェクトグラフを形成しています。

ディープコピーのためだけでなく、すべてのメンバ変数の値の基本データ・タイプにオブジェクトをコピーするだけでなく、すべてのメンバ変数の参照データ型のための記憶空間を適用すること、及びオブジェクトができるまでのコピーが各メンバ変数参照オブジェクトのデータ・タイプは、参照オブジェクトのすべて。つまり、オブジェクトグラフ全体のコピーを作成するには!

簡単に言えば、すべてのオブジェクトのオブジェクトグラフ参照されるデータ型のメンバ変数のディープコピーがメモリ空間に開放され、ちょうど配達アドレスを指すと浅いコピーを、新しいオブジェクトが参照データ型のメモリ空間を作成しません。

メモリを作成し、オブジェクトグラフ全体をコピーするので、費用遅く、大きな浅いコピー深いコピーと比較されます。

以下の例では、オブジェクトのディープコピー、次のとおりです。

(1)すべてのオブジェクトがオブジェクトでディープコピーを達成するために、図クローン()メソッドをオーバーライドする:図のオブジェクトのそれぞれの層の各オブジェクトは、Cloneableインタフェースを実装し、最上位クラスの最後の書き換えのクローンメソッドをオーバーライドすべてのcloneメソッドは、cloneメソッドは深いコピーで実現することができます呼び出します。簡単に言えば:各レイヤー内のすべてのオブジェクトは、浅いコピー=深いコピーです。

(2)ディープコピーオブジェクト直列化によって達成

 

Stringオブジェクトの新規建設と使用の違いによって割り当てられたJavaの文字列定数

文字列STR1 = "ABC"; 
文字列STR2 =新しい文字列( "ABC");

文字列STR1 =「ABC」は、または「ABC」の文字列は、Java文字列プールに存在しない場合、プールが文字列オブジェクト(「ABC」)を作成するために、Java文字列に作成されるオブジェクトを作成し作成してもしなくてもよいし、STR1これは関係なく、すべての後にこのように、将来的に作成した「ABC」の文字列オブジェクト、常に一つだけのメモリアドレスが割り当てられている、文字列のコピーである何の、メモリアドレスを指し、Javaは「文字列の居住者」と呼ばれますすべての文字列定数は自動的にコンパイル後に常駐しています。

文字列STR2 =新しい文字列(「ABC」)と、少なくとも1つのオブジェクト、おそらく2を作成します。新しいキーワードが使用されているので、確かにヒープにstr2の文字列オブジェクトを作成し、その値が「ABC」です。そして、この文字列を再度JavaのStringプールが存在しない場合は、JavaプールでStringオブジェクト「ABC」を作成

コードをコピー
文字列STR1 =新しい文字列( "ABC"); 
文字列STR2 =新しい文字列( "ABC"); 
System.out.println(STR1 == STR2)。//偽の

文字列STR3 = "ABC"; 
文字列STR4 = "ABC"; 
文字列STR5 = "AB" + "C"。
System.out.println(STR3 == STR4)。//真
のSystem.out.println(STR3 ==化5)。//真の


列A = "ABC"; 
列B = "AB"。
列C = B + "C"。
System.out.println(== c)は; //偽
コードをコピー

、Bコンパイル時に決定され、cは、コンパイル時に決定されるべきではなく、参照変数である:Cへの最終的な判断と等しいことに留意されたいです。Bランタイムおよび「C」ステッチはStringBuilderの(JDK1.5される前のStringBuffer)を介して達成され、ToString関数のStringBuilderの最後の呼び出しは、新しい文字列オブジェクトを返します

例用途:通常の推奨される使用、使用文字列=「ABCD」を作る;文字列の代わりに文字列=新しいString(「ABCD」)を作成するには、この方法では、このフォームでは、新しいコンストラクタの使用は文字を作成しますので、文字列オブジェクトは、新しいヒープ領域を開きます、二重引用符は、コンストラクタよりも効率が最適化された文字列のインターンの使用は、(文字列が存在する)です。

おすすめ

転載: www.cnblogs.com/nangonghui/p/11593569.html