1

重複の可能性:
Java 文字列: “String s = new String(”silly”);”
Java での「new String(…)」という式の目的は何ですか?

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

1) String s ="hello" のようにリテラルを使用 (1 つのオブジェクトを作成)
2) String s = new String("hello") のように new を使用 (2 つのオブジェクトを作成)

なぜ2)アプローチに行く必要があるのだろうと思っていましたか?

4

5 に答える 5

12

new で文字列を作成すると、別の String リファレンスが取得されます。これにより、不気味な動作を回避できます。

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

true、false を出力します。これを使用する実際のソフトウェアが思い浮かびません。しかし、ある意味では、新しい参照を作成する方が「安全」なので、== に驚かされることはありません。

于 2012-04-12T19:05:57.857 に答える
4

それらの基本的な違いはメモリ割り当てです。

最初のオプション、すなわち

String s1 = "hello";

このs1を使用すると、文字列リテラルとして呼び出され、コンパイル時に s1 のメモリが割り当てられます。

しかし、2番目のケースでは

String s2 = new String("hello");

この場合、s2 はhelloを表す String のオブジェクトとして呼び出されます。

最初のケースを使用して 2 つの文字列リテラルを作成しようとすると、これら 2 つのリテラルによって参照されるメモリは 1 つだけです。つまり、文字列リテラルは文字列プールの概念で機能しています。同じ内容の 2 番目の文字列リテラルを作成すると、新しいスペースを割り当てる代わりに、コンパイラは同じ参照を返します。したがって、 ==演算子を使用してこれら 2 つのリテラルを比較するとtrueになります。

しかし、2 番目のケースでは、毎回 JVM がそれぞれに対して新しいオブジェクトを作成します。equals()メソッドを使用してコンテンツを比較する必要がありますが、 ==演算子を使用する必要はありません。

2番目のケースを使用して新しい文字列オブジェクトを作成したいが、新しいオブジェクトが必要ない場合は、intern()メソッドを使用して同じオブジェクトを取得できます。

String s = "hello";
String s1 = new String("hello").intern();
System.out.println(s == s1);

この場合、新しいオブジェクトを作成する代わりに、JVM は同じ参照sを返します。したがって、出力はtrueになります

于 2012-04-12T19:08:43.237 に答える
1

2 番目のアプローチは単なる可能性です。実際には使用されることはありません (ほとんどの開発者によって)。最初の方法は、後者の利便性が低下したバージョンであり、2 番目の方法を使用する理由はありません。

PS。2 番目は、リテラルへの別のリンクを作成するだけです。技術的には、同じ文字配列を再利用します。唯一の違いは、参照が異なることです (つまり、== は false になりますが、文字列比較に == を使用しないでください)。

于 2012-04-12T19:04:41.253 に答える
1

使用すべき唯一の精神的に健全な機会は、new String("foo")単体テストです。コードが==文字列比較ではなく、適切な.equals()方法を使用していることを確認できます。

于 2012-04-12T19:09:48.973 に答える
0

これは、コピーごとのコンストラクターとして理解できます。これらは C++ でよく使用されます。最終的な効果は、パラメーターとして渡されたオブジェクトの複製 (この場合は文字列) です。

于 2012-04-12T19:10:10.533 に答える