2016-10-22 14 views
0

文字列リテラルと文字列オブジェクトについてよく読んでいます。 StringリテラルはStringプールに格納され、Stringオブジェクトはヒープ内にオブジェクトを作成することを読んでいます。私は、 ""を使って初期化されたクラスのインスタンス変数にはかなり混乱しています。文字列リテラルと文字列オブジェクト

class A { 
    private String aStr = "ASTRING"; 
} 

aStr文字列プールに追加されるのでしょうか、ヒープ内のオブジェクトを作成するのでしょうか?

+0

これはプールに入り、 'string str = new String(" ASTRING ");'はプールに入れてヒープに行き、 'str.intern()'もプールに入ります。 aStr'の価値と**ヒント**あなたもこれをGoogleにすることができます。単純なgoogle reslutはこの結果(http://www.java67.com/2014/08/difference-between-string-literal-and-new-String-object-Java.html) – emotionlessbananas

+0

です。ガベージコレクション。 "ASTRING"はまだプールに残りますか? – Develofer

+1

@Develoferガベージコレクションはヒープに対してのみ発生します – Gaur93

答えて

2

newキーワードが使用されるたびに、オブジェクトがヒープで作成されます。 ここではnewキーワードが使用されていないため、stringオブジェクトに文字列オブジェクトが作成されます。例えば
:それは二重引用符で別の新しいキーワードが使用されるヒープに作成さs1であるので

String s1= new String("string object"); 

上記の例では、2つのオブジェクトが1つを作成されている文字列プール内string objectあります。

-1

Gaur93が真実だと言っていましたが、私はいくつかの点を追加したいと思います。

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

Stringオブジェクトは基本的に文字列リテラルのラッパーです: に例を取ることができます。ユニークな文字列オブジェクトは不要なオブジェクトの作成を防ぐためにプールされ、JVMは文字列リテラルを内部的にプールすることにします。

リテラルを使用する場合は、プール内の 文字列str = "hello" を オブジェクトが使用されていると言います。 を使用している場合文字列str = new String( "hello");では、新しいオブジェクトが作成されますが、既存の文字列リテラルはJVMレベルまたはバイトコードレベル(コンパイル時)で再利用できます。

これはjavaの.equals()メソッドを使用して確認できます。

+0

JVM *は内部で文字列リテラルをプールする必要があります。 [JLS#3.10.5](http://docs.oracle.com/javase/specs/jls/se8/html/jls-3.html#jls-3.10.5)。 – EJP

+0

同じ文字列が既に存在すると仮定した場合、プールされずに同じものが使用されるため、内部的にプールする可能性があります。 –

+0

プールの意味です。同じ文字列を使用してください。プールからのもの。プールしないで同じものを使うことは無意味です。実際にはすべてが無意味です。同じ文字列*が既に存在しています:コンパイラによってそこに置かれています。 – EJP

関連する問題