Javaでは、明らかに、よりString s = "foo"
も優先されString s = new String("foo")
ます。
なんで?どちらの場合も、新しい文字列オブジェクトは作成されませんか?最初のケースでコンストラクターの呼び出しができないのはなぜですか?
Javaでは、明らかに、よりString s = "foo"
も優先されString s = new String("foo")
ます。
なんで?どちらの場合も、新しい文字列オブジェクトは作成されませんか?最初のケースでコンストラクターの呼び出しができないのはなぜですか?
なんで?
2番目のアプローチでは、2つの文字列オブジェクト(文字列リテラルによる元のオブジェクトと明示的なコピー)が生成されるためです。
最初のケースは文字列リテラルであり、言語が文字列を作成するために提供する単純な省略形です。Stringクラスのコンストラクターは、明示的にではなく、引き続き呼び出されます。つまり、入力が少なくなり、コードが煩雑になりません。
2番目のケースは、リテラルによってすでに作成されているStringオブジェクトを取得し、それをコンストラクターに渡します。コンストラクターは、コンテンツをコピーして、新しい別個のStringオブジェクトを作成します。リテラルはインターンされているため、リテラルは引き続き存在します。
文字列コンストラクターを使用する意味はほとんどありません(非常に大きな文字列のサブ文字列を作成し、残りの文字列で使用されているメモリを解放したい場合のみです。サブ文字列はデフォルトで同じ基になるchar配列を使用するためです。元の文字列と同じように、オフセットと長さが異なります。
私はそれが好ましいとは思わない。あなたが得る唯一の「利点」は、equalsメソッドではなく "=="演算子を誤って使用した場合、文字列の2つの異なるインスタンスがより速く失敗し、コードの修正を促すことだと思います。(==演算子は「成功」し、予期せず失敗する可能性があります)
もちろん、コードで何らかの理由で2つの異なるインスタンスを作成する必要がある場合を除きます。
なんで?どちらの場合も、新しい文字列オブジェクトは作成されませんか?
いいえ、文字列リテラルである初期フォームは、1つのインスタンスのみが作成されるようにインターンされます。
String s = "foo";
String s2 = "foo";
s == s2 => true