2017-01-29 7 views
-1

シナリオ1文字列インターン方法ロジック

public static void main(String[] args) throws Exception { 
     String s1 = "Testing"; 
     String s2 = new String("Testing"); 
     s2.intern(); 
     if(s1==s2){ 
      System.out.println("s1 equals to s2"); 
     }else{ 
      System.out.println("s1 is not equal to s2"); 
     } 

    } 

OUTPUT:s1 is not equal to s2

シナリオ2

public static void main(String[] args) throws Exception {  
     String s1 = "Testing"; 
     String s2 = new String("Testing").intern(); 
     if(s1==s2){ 
      System.out.println("s1 equals to s2"); 
     }else{ 
      System.out.println("s1 is not equal to s2"); 
     } 
    } 

OUTPUT:s1 equals to s2

私の質問はnew String("Testing")new String("Testing").intern()の違いは何ですか?

+2

ない重複@TimBiegeleisen。これは、文字列の比較とは関係なく、変数に値を代入することと関連しています。 –

+0

@DavidWallace申し訳ありませんが、すぐに閉じました:-) –

+0

より良い発見:-) –

答えて

2

のJava Stringは不変であるので、あなたはs2参照を更新する必要があります。

s2 = s2.intern(); 

変更s2.intern();そしてそれは同じように動作します。

+1

実際、@CKing、答えの鍵となるポイントは参照を更新することです。 'String'の不変性は完全な赤いニシンです。もし' String'が変更可能であっても、OPは同じ問題を抱えています。OPが内部参照を 's2'に戻さなかったので、最初のスニペットは失敗します。私はElliottがあなたよりもはっきりとその特定の点を作ったと感じます。しかし、真実を伝えるために、私はこの回答をアップvした時点で、あなたのものはまだ私の画面に表示されていませんでした。 –

+0

@DavidWallace私は自分の答えで言いましたが、あなたは何らかの変更を再割り当てする必要があります。私はそれを得る、この答えはより良い私はそれを否定しない。しかし、私の答えが0にとどまるほうがずっと良いですか?私は一般的にこれがここでたくさん起こるのを見ます。私の受け入れられた答えのほとんどは同じquesitonで受け入れられなかった答えよりも少ない票しか持っていません:)。より高い担当者はここでより多くの票を要求する。それは私の認識です。私は誰もが同意するとは思わない。とにかくこれは* meta *に適したトピックであり、既にそこで議論されているので、私は午前中です。良い一日を過ごしてください。 – CKing

1

intern()のJavadocを読むインターンメソッドが呼び出されると等しい(オブジェクト)メソッドからその文字列によって決定されるようなプールは既にこの文字列オブジェクトと同じ文字列が含まれている場合、

をプールが返されます。それ以外の場合は、このStringオブジェクトがプールに追加され、このStringオブジェクトへの参照が返されます。 String s1 = "Testing";ので

s1によって参照される同じStringインスタンスnew String("Testing")によって作成された文字列に等しい文字列プールからインスタンスを返しnew String("Testing").intern()Stringプールにs1によって参照Stringを加算します。

一方、最初のスニペットでは、s2.intern()は効果がありません。 "Testing"に等しいStringはすでにStringプールに入っているため、s2で参照されるStringはプールに追加されません。そして、あなたはs1が参照する文字列であることを方法、の戻り値を無視しています。従ってs1s2は異なるオブジェクトを参照します。

3

String.intern()のドキュメントを読む:

文字列オブジェクトの正準表現を返します

コードでは戻り値が破棄されるため、効果が期待できません。

+0

文字列で 'intern()'を呼び出すと、このインスタンスの副作用が標準インスタンスになる可能性があるため、補遺として、 'intern()'の結果を割り当てないコードが動作するように見えることがあります。 'String s1 =" Testing ";'つまり、 '' Testing ''という文字列の標準インスタンスがすでに存在し、' s1'によって参照されています。 's2'で参照されているインスタンスとはまったく異なっています。したがって、後者のインスタンスは標準インスタンスになることはできず、 'intern()'は別の参照、つまり 's1'に保持されているものと同じものを返さなければなりません。 – Holger

+0

もちろん、 'new String( "Testing")でも、正規インスタンスと新しく構築されたインスタンスが区別できるようにするには十分です。理論的には、 'intern()'コールの前に標準インスタンスを収集するランタイムが存在する可能性があります。他の参照は存在しませんが、実際のJVMは実際にはそれを行いません... – Holger

関連する問題