在这种情况下,String对象如何是不可变的?

时间:2012-09-20 12:35:53

标签: java

我同意String对象是不可变的这一事实,意味着它们不能被修改。如下面的情况

String str = "Hi";
String str1 = str.concat("Nilesh");

如果length参数为0或者将创建一个新的String对象并返回其引用,则返回str对象。 如果我这样做

String str = "Hi";
str="Hello";

如何改变?不可变的地方在哪里?请举个例子。

7 个答案:

答案 0 :(得分:5)

什么是不可变的是String本身,而不是指向String的引用。在你的第二个代码中:

String str = "hi";
str = "hello";

涉及2个String对象:"hi""hello"

str是一个最初指向第一个引用然后指向赋值后第二个引用的引用。但是String对象"hi"没有在该代码中被修改。

答案 1 :(得分:3)

你在改变参考资料方面令人困惑。

此代码:

String str = "Hi"; // str now refers to the String "Hi"
str = "Hello";  // str now refers to the String "Hello"

只需更改String引用的str对象; str是一个变量,它包含对String对象的引用。没有任何事情可以改变"Hi""Hello"对象。


如果String是可变的,它将有一个像setValue(String s)这样的方法可以被调用来改变它的状态,所以你可以这样做:

String str = "Hi";
str.setValue("Hello"); // if String were mutable

答案 2 :(得分:1)

"Hello"String完全不同,因此您无法再引用"Hi"

  

不变性不是关于对象状态的参考。如果状态改变,则创建新对象。

http://docs.oracle.com/javase/tutorial/essential/concurrency/immutable.html

  

如果一个对象的状态在构造之后无法改变,则该对象被认为是不可变的。

答案 3 :(得分:1)

str变量。术语“变量”意味着可以为变量分配各种字符串,一次一个。每个字符串仍然是不可变的。

答案 4 :(得分:1)

如果其他人说"Hello"是另一个String。我认为在使用System.identityHashCode()时,您可以看到新的String最佳。试试吧:

String str = "Hi";
System.out.println("try 1: "+System.identityHashCode(str));
str="Hello";
System.out.println("try 2: "+System.identityHashCode(str));

System.identityHashCode通常会返回引用本身(但你不能依赖于这个事实)。

答案 5 :(得分:1)

String str = "Hi";

str="Hello";

String 是不可变的,因此我们无法修改String对象。

这里,将创建两个对象,我们可以通过哈希码验证。

String str ="嗨&#34 ;;

System.out.println(" Str(Hi)-hashcode:" + str.hashCode());

str="Hello";

System.out.println("Str(Hello)-hashcode: "+str.hashCode());

在两种情况下, HashCode 值都不同。

  

第一种情况 - > Str(Hi)-hashcode:2337

     

第二种情况 - > Str(Hello)-hashcode:69609650

答案 6 :(得分:0)

案例1:

String str = "Hi";
String str1 = str.concat("Nilesh");

创建了总共3个字符串对象

案例2:

String str = "Hi";
str="Hello";

在这种情况下,创建了2个字符串对象。 当执行第1行时,参考“Hi”。 当第2行被执行时,str引用“Hello”并隔离“Hi”。 str只是在line2之后引用“Hello”