0

String にはほとんど疑問がありません。

インターネット上のさまざまな記事からの理解に基づいてこれを書いているため、特定のステートメントが間違っている可能性がありますが、ご容赦ください.

  1. String str1 = new String ("newStr1");を実行する と、. これにより、2 つの文字列オブジェクトが作成されます。1 つは通常のヒープに、もう 1 つは文字列プールにあります。なぜ 2 つのオブジェクトとその使用法? プールに1つだけではないのはなぜですか?

  2. オブジェクトをString str2 = new String("newStr2").intern();として作成するとします。. これは、同様の (意味的に等しい) オブジェクトがプールにあるかどうかをチェックし、そのオブジェクトへの参照を提供します。ない場合は、ヒープではなくプールに作成しますか? もしそうなら、メモリを節約するためにほとんどの場合インターンを使用する必要がありますか? ただし、パフォーマンスに少し影響します。したがって、基本的にはString str2 = "newStr2"; です。(interning は文字列リテラルに対して暗黙的です)

  3. Java-6 の後、文字列プールは perm gen 領域からヒープ領域に移動しましたか? つまり、基本的にヒープとして 1 つの領域しか持たないのですか、それとも文字列プールはヒープ内の別のセクションとして存在するのでしょうか? 別のセクションでない場合でも、2 つのオブジェクトが作成されますか?

4

2 に答える 2

3

Java では、JVM がリテラル ("xyz")を識別した場合、すぐに文字列定数プールにオブジェクトを作成し、同時にnewを識別した場合は heap.now にオブジェクトを作成し、クエリに進みます。

1.文字列 str1 = 新しい文字列 ("newStr1") ; ここでJVMの場合、「newStr1」はリテラルであるため、リテラルに対応するルールに従い、文字列定数プールにオブジェクトを作成します。new String("newStr1")-- ここで new 演算子の場合、new 演算子に対応する規則に従うため、ヒープにもオブジェクトが作成されます。

2.intern() :ここで intern はプールにオブジェクトを作成しません.interno は、文字列オブジェクトをヒープではなく文字列プールを参照するように変更するためのものです。 string s1 = new String("newStr1") -- ここで s1 は、文字列定数プールではなくヒープ領域を指します。String s1 = new String("newStr1").intern()は、s1 が文字列定数プールを指すようにします。これは、 newStr1がヒープと文字列定数プールの両方で作成されるためです。intern()は文字列オブジェクトの作成を扱いません。

3.permgen :効果的なガベージ コレクション ヒープを作成するために、permgen も領域のようにさまざまな領域に分割されますが、それでもヒープ内のみです。 /blog/dev-platform/understanding-java-garbage-collection/ヒープ領域へのリンク。

于 2015-11-12T09:06:35.337 に答える