JavaにおけるStringの直接割当とnewの使用の違い

2543 ワード

String str1 = "ABC";
String str2 = new String("ABC");
String str 1=「ABC」オブジェクトを作成するか、作成しないかもしれませんが、「ABC」という文字列はjava Stringプールには存在しません。java StringプールにStringオブジェクト(「ABC」)を作成して、このメモリアドレスを指します。今後このような方法でいくつかの値が「ABC」という文字列オブジェクトを作成しても、メモリアドレスだけが割り当てられます。その後はStringのコピーで、Javaでは「文字列常駐」と呼ばれ、すべての文字列定数はコンパイル後に自動的に常駐します。
String str 2=new String(「ABC」);少なくとも一つのオブジェクトを作成しても、二つの可能性があります。newキーワードを使うと、必ずheapでstr 2のStringオブジェクトを作成します。そのvalueは「ABC」です。また、この文字列がjava String池に存在しない場合、javaプールにこのStringオブジェクト「ABC」を作成します。
JVMでは、ゴミ回収の便利さを考慮して、heapを三つの部分に分けます。young generation(新生代)、teurd generation(旧生代)、permant generation(永生代)。
文字列は文字列の繰り返し問題を解決するために、ライフサイクルが長く、pergmenに保存されます。
JVMでは、該当するクラスがロードされて運転された後、定数池はJVM運転時の定数プールに対応してマッピングされます。
次の問題を考える:
String str1 = new String("ABC");
String str2 = new String("ABC");
str 1==str 2の値はtrueですか?それともfalseですか?false
String str3 = "ABC";
String str4 = "ABC";
String str5 =  "AB" + "C";
str3 == str4   //true
str3 == str5  // true
String a  = "ABC";
String b = "AB";
String c = b + "C";
System.out.println( a == c );//false
a、bはコンパイル時にすでに確定されていますが、cは参照変数であり、コンパイル時には確定されません。
应用の場合:普段の使用では、できるだけString="abcd"を使うことをお勧めします。このようにして、String=new String(「abcd」)ではなく文字列を作成する。このような形式は、newコンストラクタを使って文字列オブジェクトを作成すると必ず新しいheap空間が開けられます。二重引用符はString interningを採用して最適化され、効率はコンストラクタより高いです。