2016-04-20 15 views
4

ここに私のコードがあります。私は現在、文字列プールと ヒープストレージについてはかなり混乱しています。同じ参照の文字列連結?

public class String1 { 
    public static void main(String[] args) { 
     // TODO Auto-generated method stub 

     String str = "abcd"; 
     String str1 = "" ; 

     str1=str1+"abcd"; 

     if(str.equals(str1)) 
      System.out.println("True"); 
     else 
      System.out.println("False"); 

     if(str == str1) 
      System.out.println("True"); 
     else 
      System.out.println("False"); 
    } 
} 

今、私は文字列strを作成していますし、(私が間違って取得していますなら、私を修正してください!)文字列プールに格納されます。 concatの後にの文字列"abcd"が両方とも同じ値です。 だから、私はstrとstr1は文字列プールで同じ参照を持っていると思うので、文はtrueを印刷すべきですが、falseを印刷します。

なぜ、strとstr1が同じ参照を取得していないのですか?

+0

ここをご覧ください:http://stackoverflow.com/questions/513832/how-do-i-compare-strings-in-java and http://stackoverflow.com/questions/19965895/passing-value-of- a-string-in-a-method-in-java/19966154#19966154 – dimas

+0

混乱しています!どのようにこれは単純に重複した質問5 ** UPVOTE **を得た! – muzahidbechara

答えて

4

Javaは自動的にインターン文字列リテラル、新たに作成されていない文字列(手段は、文字列プールに入れます)。 https://stackoverflow.com/a/1855183/1611055も参照してください。

文字列は不変なので、+演算子は新しい文字列を作成する必要があります。既存の文字列には追加できません。内部的には、+オペレータはStringBuilderを使用して文字列を連結します。最終的な結果はStringBuilder.toString()によって検索され、本質的にはreturn new String(value, 0, count);となります。

この新しく作成されたStringは自動的にStringプールに入れられません。

したがって、同じ内容の文字列であっても、の参照はstrとは異なります。 strは文字列プール内の場所を指し、str1はヒープ上の場所を指します。

明示的にインターン新しく作成された文字列にstr1 = str1 + "abcd";

str1 = str1.intern(); 

を追加する場合は、2番目のif文はtrueを返します。

また、str1 = (str1 + "abcd").intern();も同じ効果があります。

+0

あなたは、インターンがStringオブジェクトをヒープからプールに転送するのは正しいです。しかし、私はまだstrとstr1が同じ参照を取得していない理由について私の質問に固執していますか? – Darshit

+1

@Darshit 'str'が参照するオブジェクトはプールに格納されるため、' str1'が参照するオブジェクトはヒープに格納されます。 –

+1

私はconcatメソッドの内部実装を見て、新しいStringインスタンスを返します。ありがとう!!! – Darshit

-2

文字列が文字列プールに追加されることは間違いありません。しかし、==は、両方のオブジェクトが同じ参照を指しているかどうか(文字列プール内の同じメモリ位置を簡単に指すようにするかどうか)をチェックします。 .equals()メソッドは、オブジェクトの両方の値が同じかどうかをチェックします。

+0

文字列は文字列プールに自動的に追加されません。文字列定数と文字列だけが明示的に 'intern()'になっています。 –

-1

値を比較する文字列の場合、文字列変数に存在する値を比較するときにequalsメソッドを使用する必要があります。

しかし、==を使用して文字列変数を比較すると、値ではなくStringオブジェクトのアドレスが比較されるため、同じ値を持っていてもfalseが返されます。