2012-09-20 90 views
1

我同意这样一个事实,即String对象是不可变的,意味着它们不能被修改。像在下面在这种情况下String对象是不可变的吗?

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

这里的情况下,如果长度参数是0或一个新的字符串对象将被创建,其将参考返回的STR对象将被返回。 如果我这样做

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

它是如何改变?不可变的照片来自哪里?请举例。

+1

一个常见的误解是,'字符串str'装置' str'是一个String对象。相反,它意味着'str'是对'String'对象的**引用**。所以你可以在不改变引用的对象的情况下改变引用。 –

回答

5

什么是永恒不变的是字符串本身。 ,而不是指向String的引用。在你的第二个代码:

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

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

str是一个引用,最初指向第一个然后指向第二个赋值。但该字符串对象"hi"不会在该代码中被修改。

+0

那么StringBuffer如何进入图片? – Nilesh

+0

@BundleContext ..你是什么意思? StringBuffer(除了非常具体的用例外,它是过时的)是一个完全不同的类。 – assylias

+0

我在完整的参考读“的StringBuffer是对等类的字符串,它提供许多strings.As的你知道的功能,串表示固定长度的,不可变的字符序列。与此相反,StringBuffer的可增长表示且可写的字符序列。”由于String.concat()创建一个新的String对象。在stringbuffer.append()中会发生什么 – Nilesh

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"对象。


如果字符串是可变的,它会像setValue(String s)的方法可以被称为改变其状态,所以你也许可以做到这一点:

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

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

+0

谢谢@Jirka Hanika – Nilesh

0

壳体1:

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

字符串对象被创建

壳体2:

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

在创建对象这种情况下2字符串。当执行第1行时,str指向“Hi”。执行第2行时的 str引用“Hello”并隔离“Hi”。 str只是指行2后的“Hello”

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通常将返回引用本身(但你不能依靠这个事实)。

1
String str = "Hi"; 

str="Hello"; 

字符串是不可改变的,所以我们不能修改String对象。

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

String str =“Hi”;

的System.out.println( “STR(您好)-hashcode:” + str.hashCode());

str="Hello"; 

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

在两种情况下的HashCode值将是不同的。

第一病例> STR(您好)-hashcode:2337

第二病例 - > STR(你好)-hashcode:69609650