String s="hi";
String s1=new String("hi");
メモリの観点から、s と s1 はどこに保存されますか? ヒープメモリまたはスタックにあるかどうか。
s は「hi」を指し、s1 は hi が存在するメモリ位置を指しますか?
助けてください?
以下を検討してください
String s = "hi";
String s1 = new String("hi");
variableは、文字列定数プールからs
参照される文字列リテラルを参照し、 のような変数がさらにある場合、およびは同じオブジェクトを参照します。hi
s2 = "hi"
s
s2
String s1 = new String("hi");
これにより、実行時に新しい文字列が作成されます。
最初のケースでは、クラスが JVM にロードされるときにすべての strnig リテラルが作成されます。2 番目のケースでは、new String()
実行時に文字列オブジェクトが作成されます。次のリンクで、文字列定数プールに関する優れたチュートリアルを見つけることができます
http://www.thejavageek.com/2013/06/19/the-string-constant-pool/
クラスのロード時に、すべてのString
リテラルがプールに配置されます。new String("hi")
オブジェクトを使用すると、ヒープ上に作成されます。s
およびs1
は参照変数であり、メソッド呼び出しスタックに常駐する必要があります。String
文字列リテラル「hi」は、ヒープ上にオブジェクトを作成し、プールからそのオブジェクトへの参照を持つことによって、JVM によって処理されString
ます。演算子はnew
、参照がコンストラクターに渡された文字列オブジェクトを取得し、新しいオブジェクトを作成するだけです。コンストラクターに渡される文字列がリテラルであることはたまたまです。
私によると、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
上記の答えは正しいですが、 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) を使用しています。
s
とは文字列への単なる参照であるため、とs1
で参照される文字列インスタンスとは異なり、スタックに格納されます。この場合、s が参照する値は文字列プールに入れられますが、s が参照する値は入れられません。なんで?文字列のコンストラクターがその文字列を作成するために使用されているためです。リテラルのみがプールされ、それらのリテラルを他のリテラルの連結として選択した場合でも (たとえば、String を作成し、文字列プールに格納された文字列の同じインスタンスを指す場合)。s
s1
s1
s2 = "h" + "i"
s
s2
ただし、これはちょっとした罠につながります: プールされた文字列は同じオブジェクトを指すため、メソッド==
の代わりに演算子を使用equals
して文字列を比較したくなりますが、これは危険==
ですequals()
。メソッド==
とは異なる結果になりequals()
ます。
「こんにちは」は文字列リテラルです。これは、文字列定数プールで一度作成されます。Java 7 では、他のオブジェクトと一緒にヒープにありますが、それ以前は Perm-Gen で作成されていました
String s = "hi";
String s1 = new String("hi");
new String("hi")
既存のものとは別に、ヒープ上に新しい String オブジェクトを作成します。
s
とs1
は、2 つの別個のオブジェクトへの参照です。参照自体は、ヒープ内のオブジェクトを指していても、実際にはスタック上に存在します。