2016-12-27 11 views
-1

私は文字列がどのように不変であるかチェックするために書いた次のコードを持っています。どのように文字列がJavaで不変であるか

私のコードは次のとおりラインNo 6において

class Check 
{ 
    public static void main(String k[]) 
    { 
     String a1="JohnPlayer"; 
     a1.concat("America");//line no 6 
     String a2="America";//line no 7 
     a1=a1+a2;//line no 8 
     System.out.println("Value of a1="+a1); 
    } 
} 

、Iはconcatを使用する場合、私はA1連結及びa2 a1+a2を使用する場合、それが連結された値を出力しながら、それだけ "JohnPlayer"、 を印刷します"JohnPlayerAmerica"この場合、どうすればStringと言うことができますか?

+0

使用 'System.identityHashCode()'と値を参照してください。

これは、書き込みに似ています。各オブジェクトはユニークです。 'concat'は" new "Stringを返す – TheLostMind

+0

String _objects_は不変です。ストリング_references_はそうではありません。 –

答えて

1

Stringは不変です。

a1.concat("America"); 

あなたが無視する新しいStringインスタンスを返します。 a1は変更されていません。

a1=a1+a2; 

新しいStringインスタンスを作成し、a1変数に代入します。 a1によって参照される元のStringは変更されていません。各オブジェクトの

a1 = a1.concat("America"); 
+0

文字列はセッターメソッドを提供しません。新しい文字列が作成されるたびに – Chinmay

+0

が取得されません。これらの2行はa1 = a1 + a2です。私はそれがこれらの値を割り当てていることを知っていますが、それでも連結し、JohnPlayerAmericaのような値を印刷しますが、最初のケースではそうではありませんか? – user7344668

+0

@ user7344668 'a1.concat(" America ")'と返された新しいStringを何もしないで書くことは、返された新しいStringと何もせずに 'a1 + a2'を書くことと同じ意味を持ちます。唯一の違いは、後者はコンパイルをパスしないということです。連結演算子の結果は、何らかの形で使用されなければならない(変数への代入、呼び出しメソッドへの返り値など...)。無視される。 – Eran

関連する問題