1

String オブジェクトを作成するには 2 つの方法があります。

String str = new String("Java");
String str2 = "Java";

最初のケースでは、コンストラクターが確実に呼び出されることを知っています。しかし、2番目のものについては知りません。コンストラクターは呼び出されますか?

String substr = new String(str.substring(2,str.length));  // str is new object
String substr2 = new String(str2.substring(2,str2.length)); //str2 is not with new keyword

ヒープメモリ内で同じ種類の操作と同じ動作であることを確認substrしたい。substr2

String.substring()新しいオブジェクトをまったく作成せず、以前の char[] オブジェクトを異なるオフセットで使用することを 1 つ知っています。

とはどうsubstrなりsubstr2ますか?オフセットはコンストラクター内で生成されるため、これらをコンストラクターに関連付けることはできますか。

4

3 に答える 3

3

JLS §3.10.5 から。文字列リテラル:

文字列リテラルは、クラスのインスタンスへの参照ですString(§4.3.1、§4.3.3)。

さらに、文字列リテラルは常に class の同じインスタンスを参照しますString。これは、文字列リテラル (より一般的には、定数式の値である文字列 (§15.28)) が、メソッドを使用して一意のインスタンスを共有するために「インターン」されているためString.internです。

したがって、オブジェクト"Java"を指しStringます。さらに、同じ文字で構成される文字列リテラルは、同じStringオブジェクトを参照します。ただし、このオブジェクトがいつどのように構築されるかは指定されていません。

ヒープメモリ内で同じ種類の操作と同じ動作であることを確認substrしたい。substr2

はい、まったく同じ種類の操作です。

String.substring()新しいオブジェクトをまったく作成せず、以前の char[] オブジェクトを異なるオフセットで使用することを 1 つ知っています。

これは未指定です。あなたが説明しているのは、OracleのJDKの古いバージョンがどのように機能したかです。現在のバージョンではそれができなくなりました:substring()文字をコピーするようになりました。この変更は Java 7u6 で行われました。

于 2013-04-13T09:55:28.197 に答える
2

コンストラクターは、オブジェクトが作成されるときに呼び出されます。

の場合String str2 = "World";、jvm は最初に"world"文字列プールで文字列を検索します。コンストラクターは、このリテラルがプールに存在しない場合にのみ呼び出されます。それ以外の場合は、既存のオブジェクトを返します。

于 2013-04-13T09:54:01.623 に答える
0

コンストラクターは常に呼び出す必要があります。自分で調べるには、このアプリケーションをデバッグします。

public static void main(String[] args) {
  String str = new String("Java"); // <-- breakpoint here
  String str2 = "World";
  String str3 = "Java"; // (1)
  String str4 = new String("Java"); // (2)

  System.out.println(str + " " + str2 + " " + str3 + " " + str4);
}

最初の行 ( ) にブレークポイントを設定し、String str = new...「ステップ イン」してString()コンストラクターに入ります。次に、コンストラクターから「ステップ アウト」し、次の行に「ステップ オーバー」して、再び「ステップ イン」します。String()コンストラクターに戻る必要があります。

1: それstr3はプールから来るはずif (str3 == str)ですtrue

2: しかしstr4、新しいインスタンスになります。つまり、if (str4 == str || str4 == str3)になりますfalse文字列 APIを参照してください。

見つけたものをお知らせください:-)

于 2013-04-13T09:58:20.807 に答える