10

プログラム内の次のステートメントでは、ヒープ メモリと文字列定数プールにいくつのオブジェクトが作成されますか?

オブジェクトの作成を明確にする必要があります。私が読んだ多くの情報源は詳しく説明していません。オブジェクトが破壊されると混乱します。

String a="MAM"+"BCD"+"EFG"+"GFE";

いくつのオブジェクトが作成されますか?

オブジェクト、メソッド、およびクラスのライフサイクルと、それらが動的に変更および変更されたときに JVM がそれらをどのように処理するかについての優れた資料を探しています。

4

6 に答える 6

20

"MAM"+"BCD"+"EFG"+"GFE"はコンパイル時の定数式であり、"MAMBCDEFGGFE"文字列リテラルにコンパイルされます。StringJVM は、上記のコードを含むクラスをロードするときに、このリテラルからのインスタンスを作成し、これStringを文字列プールに入れます。したがってString a = "MAM"+"BCD"+"EFG"+"GFE";、オブジェクトは作成されません。JLS を参照してください。15.18.1. String Concatenation Operator +

式がコンパイル時の定数式 (§15.28) でない限り、String オブジェクトは新しく作成されます (§12.5)。

Stringプール内のオブジェクトへの参照をローカル var に割り当てるだけaです。

于 2013-08-07T07:16:27.200 に答える
6

オブジェクトは 1 つだけ作成されます。

string s1 = "java";
string s2 = "ja" + "va";
s.o.p(s1==s2);

ステートメントは true になります。

String s1="java";
string s2 = "ja";
String s3 = s2 +"va";
s.o.p(s1==s3);

このステートメントは false になります。

そのため、少なくとも 1 つの見かけは永続的である必要があり、「+」演算子は新しい文字列オブジェクトを生成します (new() を使用した非定数プール内)。したがって、あなたが尋ねた質問には、永続的なものもありません。これは、オブジェクトを 1 つだけ作成することを意味します。

于 2013-08-07T07:15:25.797 に答える
3

ちょうど 1 つのオブジェクトが作成され、定数プールに配置されます。ただし、まだ存在しない場合は、既存のオブジェクトが使用されます。コンパイラは、JLS 3.10.5 および 15.28 で指定されているように、文字列定数を連結します。

長い文字列リテラルは常に短い断片に分割し、文字列連結演算子 +

http://docs.oracle.com/javase/specs/jls/se7/html/jls-3.html#jls-3.10.5

于 2013-08-07T07:15:59.573 に答える
3

ほとんどの回答は、a) 完全な式は1 つのコンパイル時定数であり、b) 行自体は新しいオブジェクトを構築せず、 1 つのオブジェクトへの参照のみであることに焦点を当てているようです。

ただし、これまで誰も言及していませんが、Stringそれ自体には内部への参照が含まれていますchar[](これは定数プールにもあります)。

概要: コンスタント プール (Stringおよびchar[]) には 2 つのオブジェクトがあります。この行は、オブジェクトを作成したり破棄したりしません。

そしてに関して:

オブジェクトが破壊されると混乱します。

定数プール内のものは、クラス自体がアンロードされる場合にのみ破棄されるため、オブジェクトは破棄されません。aせいぜい、参照は最終的に範囲外になると言えます。

于 2013-08-07T09:31:27.773 に答える
2

String aにコンパイルされるため、オブジェクトは 1 つだけ作成され"MAMBCDEFGGFE"ます。

于 2013-08-07T07:16:32.547 に答える
0

あなたの例で単一のヒープオブジェクトを述べている答えは正しいです。ただし、次のコードを検討してください。

public class Tester
{
   public String a="MAM";
   public String b ="BCD";
   public String c = "EFG";
   public String d ="GFE";

   public Tester()
   {
      String abcd = a + b + c + d;
   }
}

この例では、7 つの文字列が作成されています。a、b、c、および d は単一の定数にコンパイルされません。これらはメンバーです。次に、演算子ごとに1つの文字列が作成されます+-意味的に言えば、+連結ですが、論理的にはメモリ内に新しい文字列を作成しています。最初の 2 つの演算子文字列はすぐに破棄され、ガベージ コレクションの対象になりますが、メモリ チャーンは引き続き発生します。

技術的には 8 番目のオブジェクトにあります。テスターのインスタンス。

編集:これはコメントでナンセンスであることが証明されています

于 2013-08-07T08:38:18.687 に答える