5

Javaでは、明らかに、よりString s = "foo"も優先されString s = new String("foo")ます。

なんで?どちらの場合も、新しい文字列オブジェクトは作成されませんか?最初のケースでコンストラクターの呼び出しができないのはなぜですか?

4

4 に答える 4

9

なんで?

2番目のアプローチでは、2つの文字列オブジェクト(文字列リテラルによる元のオブジェクトと明示的なコピー)が生成されるためです。

于 2012-06-23T23:17:43.707 に答える
4

最初のケースは文字列リテラルであり、言語が文字列を作成するために提供する単純な省略形です。Stringクラスのコンストラクターは、明示的にではなく、引き続き呼び出されます。つまり、入力が少なくなり、コードが煩雑になりません。

2番目のケースは、リテラルによってすでに作成されているStringオブジェクトを取得し、それをコンストラクターに渡します。コンストラクターは、コンテンツをコピーして、新しい別個のStringオブジェクトを作成します。リテラルはインターンされているため、リテラルは引き続き存在します。

文字列コンストラクターを使用する意味はほとんどありません(非常に大きな文字列のサブ文字列を作成し、残りの文字列で使用されているメモリを解放したい場合のみです。サブ文字列はデフォルトで同じ基になるchar配列を使用するためです。元の文字列と同じように、オフセットと長さが異なります。

于 2012-06-23T23:24:05.890 に答える
1

私はそれが好ましいとは思わない。あなたが得る唯一の「利点」は、equalsメソッドではなく "=="演算子を誤って使用した場合、文字列の2つの異なるインスタンスがより速く失敗し、コードの修正を促すことだと思います。(==演算子は「成功」し、予期せず失敗する可能性があります)

もちろん、コードで何らかの理由で2つの異なるインスタンスを作成する必要がある場合を除きます。

于 2012-06-23T23:20:45.857 に答える
1

なんで?どちらの場合も、新しい文字列オブジェクトは作成されませんか?

いいえ、文字列リテラルである初期フォームは、1つのインスタンスのみが作成されるようにインターンされます。

String s = "foo";
String s2 = "foo";

s == s2 => true

于 2012-06-23T23:25:10.320 に答える