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メソッドの解釈:
文字列オブジェクトの正規化された表示形式を返します.
クラス
Internメソッドが呼び出されると、プールにこの
これは、2つの任意の文字列
すべてのフォント値文字列と文字列付与定数式はinternメソッドを使用して操作されます.
戻り値:
この文字列と同じ内容の文字列ですが、一意の文字列を持つプールから必ず取得されます.
サンプルコード:
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メソッドを使用して操作されます.
戻り値:
この文字列と同じ内容の文字列ですが、一意の文字列を持つプールから必ず取得されます.