-2
String s ="hello";
String s= new String ("hello");
String s1= new String("hello");

上記のケースで内部的に作成された文字列オブジェクトはどのようになっていますか。

String s = null;
String s = new String (null);  // I get a compilation error at this line

上記の場合、オブジェクトのインスタンス化を取得できません。Java docは、新しいobjを作成する/元のパラメーターを文字列として新しいobjを作成すると述べています。

しかし、私はまだ明確ではありません

4

6 に答える 6

3

Java は Flyweight デザイン パターンを使用して、JVM で String インスタンスを管理します。つまり、このパターンは、格納するインスタンスが多すぎる可能性があるオブジェクトを共有することになります。

String s ="hello";

ここで、「hello」がすでに存在する場合、JVM は最初に String プールをチェックインしました。もしそうなら、sそれを直接指し始めます。それ以外の場合は、最初に「hello」がプールに追加され、次にそれをs指します。

String s= new String ("hello");

ここでは、リテラル文字列 "hello" が String プールに既に存在していましたが、引き続き new を使用して、ヒープ上に同じ値 "hello" を持つ新しい String オブジェクトを作成します。

String s1= new String("hello");

同上。これで、3 つの String オブジェクトができました。

String s = null;

ここでは、変数を単純に に初期化しましたnull。ここでは特別なことは何も起こっていません。

String s = new String (null);

String コンストラクターがオーバーロードされているため、これは機能しません。かかる場合がありStringます。かかる場合もありchar[]ます。しかし、それを渡すとnull、一致するデータ型がないため、コンパイラは呼び出すコンストラクタを認識できず、あいまいなエラーが発生します。

于 2013-05-24T20:19:38.893 に答える
2

文字列オブジェクトは文字列プールで作成されます。文字列プールは、文字列オブジェクトを内部で作成して格納するために jvm に実装されています。文字列を作成する最良の方法はString s ="hello";

String s= new String ("hello");

必要のない 2 つの String オブジェクトを作成します。

于 2013-05-24T20:09:01.353 に答える
1

「hello」のような文字列リテラルは、Java ではまれなシンタックス シュガーです。コンストラクターの呼び出しと同じではありませんが、PermGen の文字列プールから等しい String オブジェクトへの参照が提供されます。コンパイラ エラーは、String クラスにオーバーロードされたコンストラクターがあり、null を渡すときに呼び出しているコンストラクターをコンパイラーが認識できないことが原因です。

于 2013-05-24T20:09:54.557 に答える
1

Java コンパイラは、複数の String オブジェクトが同じ値を持つのを防ぐために、文字列に対していくつかの最適化を行います。それを「ストリングインターニング」といいます。そのため、Java の String は可変ではありません。最初のケースでは、実際に行っていることは、既存の String オブジェクトの参照を新しい変数に割り当てることです。インスタンス化された他のクラスがあり、それを別の変数に割り当てているかのように考えることができます。

WhateverClass object1 = new WhateverClass();
WhateverClass object2 = object1; // No new instance created, just assigning a reference
boolean areEquals = object1 == object2; // This is true, same reference
String string1 = "foo";
String string2 = "foo";
String string3 = new String("foo");
areEquals = string1 == string2; // true, same reference
areEquals = string1 == string3; // false, different objects

ただし、「new」を使用すると、新しいインスタンスを強制的に作成することになります (より多くのメモリが消費され、遅くなります...)。そのため、できるだけ避ける必要があります。String コンストラクターの null パラメーターによるコンパイル エラーは、まったく別の話です。

于 2013-05-24T20:19:44.090 に答える
-1

Java では、オブジェクトは参照によってインスタンス化されます。文字列「Hello」を作成すると、スタックに文字列への参照(ポインタ)が作成されます。したがって、次のように記述した場合: String s = null 参照はインスタンス化されますが、String へのポインタはありません。new String(null) を書き込むと、null メモリ領域へのポインターを作成する必要があります。コンパイル エラーが発生する理由は次のとおりです。お役に立てれば幸いです、シモ

于 2013-05-24T20:13:14.347 に答える