JavaにおけるStringとnew Stringの違い、比較

2088 ワード

Java実行環境にはStringクラスによって維持される文字列プールがあります.文String str=「abc」を実行する場合は、まず文字列プールに文字列「abc」が存在するかどうかを確認し、存在する場合はstrに直接「abc」を割り当て、存在しない場合は文字列プールに新しい文字列「abc」を新規作成してからstrに割り当てます.文String str=new String(「abc」)を実行する場合、文字列プールに文字列「abc」が存在するかどうかにかかわらず、文字列「abc」を直接新規作成し(新規文字列「abc」は文字列プールではないことに注意)、strに付与します.前の文の効率が高く、後の文の効率が低いのは、新規文字列がメモリ領域を占有するためです.String str=new String()は、String str=new String(")と同じ空の文字列を作成します.
サンプルコード:
public class Demo {
public static void main(String[] args) {
String a = new String();//スタックにオブジェクトsを生成し、文字列プールに空の文字列を作成します.
String aa = "";//文字列プールには空の文字がすでに存在し、作成する必要はありません.
String aaa = new String("");//スタックにオブジェクトaaaを生成し、文字列プールに空の文字列を作成します.
String b = new String("cisco");//スタック内の生辰オブジェクトb、文字列プールに文字列を作成する
cisco”
String c = new String("cisco");//スタックにオブジェクトcが作成され、文字列プールに文字列が作成されます.
cisco”
String d = "cisco";//文字列プールに「
cisco文字列は作成されません
//コメントによると、次の結果は簡単に得られるはずです
System.out.println(a == aa);
System.out.println(a == aaa);
System.out.println(a.intern() == aa.intern());
System.out.println(a.intern() == aaa.intern());
System.out.println(d == "cisco");
System.out.println(b == c);
System.out.println(b == d);
System.out.println(b.equals(c));
System.out.println(b.equals(d));
b = b.intern();
System.out.println(b == c);
System.out.println(b == d);
c = c.intern();
System.out.println(b == c);
}
}
Stringクラスにおけるinternメソッドの解釈:
文字列オブジェクトの正規化された表示形式を返します.
クラスStringによってプライベートで維持される、最初は空の文字列プール.
Internメソッドが呼び出されると、プールにこのStringオブジェクトに等しい文字列が含まれている場合(equals(Object)メソッドで決定)、プール内の文字列が返されます.そうでない場合、Stringオブジェクトがプールに追加され、Stringオブジェクトの参照が返されます.
これは、2つの任意の文字列sおよびtについて、s.equals(t)trueである場合にのみ、s.intern() == t.intern()trueであるという規則に従う.
すべてのフォント値文字列と文字列付与定数式はinternメソッドを使用して操作されます.
戻り値:
この文字列と同じ内容の文字列ですが、一意の文字列を持つプールから必ず取得されます.