2

このコードを書くと:

String s = new String("TestString");

s が動的に作成された文字列を参照する方法を理解しています。s はそれ自体はオブジェクトではありませんが、オブジェクトを参照します。

しかし、私はこれが何を意味するのか理解できません:

String s = "TestString";

Q1. それがプリミティブなデータ型であれば理解できますが、これはクラス型にとって何を意味するのでしょうか?

Q2. この種の初期化は、ユーザーが作成したクラスにも許可されていますか?


Java レベル : 初級

4

4 に答える 4

4

Q1. それがプリミティブなデータ型であれば理解できますが、これはクラス型にとって何を意味するのでしょうか?

この場合、"TestString"は文字列リテラルです。文字列リテラルは、 のインスタンスへの参照としてString機能します。これは、言語仕様§3.10.5 によるものです。したがって、特定のケース"TestString"では、のインスタンスへの参照でありString、同じ参照を変数に割り当てていますs

Stringここで、リテラルによって参照される sについて、かなり特別なことがいくつかあります。同じ値 (論理的には文字列として) を持つ 2 つの文字列リテラルは、常に の同じインスタンスを参照しますString。これは、文字列リテラルの「インターン」によるものです。

しかし、あなたが言うとき

String s = new String("TestString");

"TestString"のインスタンスString、実際には文字列インターン プール内のインスタンスを参照する場合でも、同じ文字列を参照する場合ではありません。s代わりに、sその値が と等しくなるように初期化されます"TestString"が、実際には新しい参照です。あれは:

String s = new String("TestString");
String t = "TestString";
System.out.println(s == t);

これは印刷されますfalse

Q2. この種の初期化は、ユーザーが作成したクラスにも許可されていますか?

いいえ。

于 2013-07-16T13:32:24.923 に答える
0
String s = "TestString";

String を作成する通常の方法です。実際、あなたがするとき:

String s = new String("TestString");

あなたがやっていることは、最初に文字列を作成し、それを引数として new String(); に渡すことです。したがって、問題は、最初のものが存在する理由ではなく、2 番目のものが存在する理由です。答えは非常に微妙で、おそらく気にすることはないでしょう。最初の方法は、ガベージ コレクションを取得せず、すべての VM で共有される文字列リテラルを作成します。代わりに、2番目のものはそうです。これは、パフォーマンス上の理由から、非常に大きな文字列を操作する場合など、2 番目の形式を使用したい場合があることを意味します。

詳細については、こちらをご覧ください。

http://kjetilod.blogspot.com.es/2008/09/string-constructor-considered-useless.html

于 2013-07-16T13:33:29.647 に答える
0

Oracle ドキュメントから:

文字列を作成する最も直接的な方法は、次のように書くことです。

String greeting = "Hello world!";

この場合は、「Hello world!」です。文字列リテラル (二重引用符で囲まれたコード内の一連の文字) です。コード内で文字列リテラルが検出されるたびに、コンパイラはその値 (この場合は Hello world!) を使用して String オブジェクトを作成します。

他のオブジェクトと同様に、 new キーワードとコンストラクターを使用して String オブジェクトを作成できます。

于 2013-07-16T13:33:46.017 に答える
0

Q1. それがプリミティブなデータ型であれば理解できますが、これはクラス型にとって何を意味するのでしょうか?

いいえ、これは特殊なケースです。文字列リテラルの場合、String s = "someString"ステートメントはsomeString、文字列定数プールに格納されているものを参照していることを意味します。someStringクラスのインスタンスになりますがString、文字列リテラル プールに格納されます。

String リテラル プールの特別な点は次のとおりです。

文字列 s = "someString"; 文字列 s1 = "someString";

ここではs == s1' will return、文字列リテラル プール内の同じオブジェクトを参照するので true です。

String s2 = new String("someString"); String s3 = new String("someString");

ここでは、両方の文字列が非定数プール メモリに作成されるため、s2 == s3返されます。false

ここで文字列に関する優れたチュートリアルを見つけることができます

http://www.thejavageek.com/2013/06/19/the-string-constant-pool/ http://www.thejavageek.com/2013/06/17/string-immutability-in-java/

Q2. この種の初期化は、ユーザーが作成したクラスにも許可されていますか?

いいえ、できません。

于 2013-07-16T13:34:00.670 に答える