2
String s="hi";
String s1=new String("hi");

メモリの観点から、s と s1 はどこに保存されますか? ヒープメモリまたはスタックにあるかどうか。

s は「hi」を指し、s1 は hi が存在するメモリ位置を指しますか?

助けてください?

4

7 に答える 7

4

以下を検討してください

 String s = "hi";
 String s1 = new String("hi");

variableは、文字列定数プールからs参照される文字列リテラルを参照し、 のような変数がさらにある場合、およびは同じオブジェクトを参照します。his2 = "hi"ss2

String s1 = new String("hi"); 

これにより、実行時に新しい文字列が作成されます。

最初のケースでは、クラスが JVM にロードされるときにすべての strnig リテラルが作成されます。2 番目のケースでは、new String()実行時に文字列オブジェクトが作成されます。次のリンクで、文字列定数プールに関する優れたチュートリアルを見つけることができます

http://www.thejavageek.com/2013/06/19/the-string-constant-pool/

于 2013-07-01T08:25:23.927 に答える
1

クラスのロード時に、すべてのStringリテラルがプールに配置されます。new String("hi")オブジェクトを使用すると、ヒープ上に作成されます。sおよびs1は参照変数であり、メソッド呼び出しスタックに常駐する必要があります。String文字列リテラル「hi」は、ヒープ上にオブジェクトを作成し、プールからそのオブジェクトへの参照を持つことによって、JVM によって処理されStringます。演算子はnew、参照がコンストラクターに渡された文字列オブジェクトを取得し、新しいオブジェクトを作成するだけです。コンストラクターに渡される文字列がリテラルであることはたまたまです。

于 2013-07-01T08:24:56.057 に答える
0

私によると、String s="hello" s オブジェクトのようなリテラルを使用して String を作成すると、String 定数プールに格納されている String "hello" が参照されます。

String s = new String("hello") のような New キーワードを使用して新しい String を作成する場合、この場合は 2 つのオブジェクトが作成されます。object は通常のヒープ領域に格納されている別のオブジェクトを参照し、このオブジェクトは String 定数プールに格納されている String Hello を参照します。

詳細については、次のリンクを参照してください:- http://www.javatpoint.com/java-string

于 2015-08-31T05:47:06.320 に答える
0

上記の答えは正しいですが、 new を呼び出すと文字列オブジェクトへのポインターが返されるためString *s1 = new String("hi")、代わりに使用しないでください。String s1 = new String("hi")私はC ++にかなり慣れていません。すみません、間違っていたらすみません。

PS: gcc バージョン 4.4.7 20120313 (Red Hat 4.4.7-4) (GCC) を使用しています。

于 2014-11-20T08:02:35.197 に答える
0

sとは文字列への単なる参照であるため、とs1で参照される文字列インスタンスとは異なり、スタックに格納されます。この場合、s が参照する値は文字列プールに入れられますが、s が参照する値は入れられません。なんで?文字列のコンストラクターがその文字列を作成するために使用されているためです。リテラルのみがプールされ、それらのリテラルを他のリテラルの連結として選択した場合でも (たとえば、String を作成し、文字列プールに格納された文字列の同じインスタンスを指す場合)。ss1s1s2 = "h" + "i"ss2

ただし、これはちょっとした罠につながります: プールされた文字列は同じオブジェクトを指すため、メソッド==の代わりに演算子を使用equalsして文字列を比較したくなりますが、これは危険==ですequals()。メソッド==とは異なる結果になりequals()ます。

于 2013-07-01T11:00:30.437 に答える
0

「こんにちは」は文字列リテラルです。これは、文字列定数プールで一度作成されます。Java 7 では、他のオブジェクトと一緒にヒープにありますが、それ以前は Perm-Gen で作成されていました

 String s = "hi";

 String s1 = new String("hi");

new String("hi")既存のものとは別に、ヒープ上に新しい String オブジェクトを作成します。

ss1は、2 つの別個のオブジェクトへの参照です。参照自体は、ヒープ内のオブジェクトを指していても、実際にはスタック上に存在します。

于 2013-07-01T08:43:56.800 に答える