2016-12-27 35 views
-1

我有下面的代码,我写了这些代码来检查字符串是不可变的。字符串在java中是不可变的

我的代码是:

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); 
    } 
} 

无在线6,当我使用concat,它只能打印 “JohnPlayer”, 而如果我串联A1和A2使用a1+a2,它打印合并的值“JohnPlayerAmerica”。在这种情况下,我怎么能说String是不可变的?

+0

使用'System.identityHashCode()'每个物体上看到的值。每个对象都是唯一的。 'concat'返回一个“新”字符串 – TheLostMind

+0

字符串_objects_是不可变的。字符串_references_不是。 –

回答

1

String是不可变的。

a1.concat("America"); 

返回您忽略的新的String实例。 a1未更改。

a1=a1+a2; 

创建一个新的String实例,并将其分配给a1变量。由a1引用的原始String未更改。

这类似于写作:

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

字符串不提供任何setter方法..每次只有一个新String创建 – Chinmay

+0

没有得到,这两行是a1 = a1 + a2;我知道它分配这些值,但它仍然concat和打印值像JohnPlayerAmerica,而在第一种情况下,它不是? – user7344668

+0

@ user7344668编写'a1.concat(“America”)''而不用返回的新字符串做任何事情''与编写'a1 + a2'类似的含义,而不用对返回的新字符串做任何事情。唯一的区别是后者不通过编译,因为连接运算符的结果必须以某种方式使用(分配给变量,返回到调用方法等),而方法调用的结果可以被忽略。 – Eran