我同意String对象是不可变的这一事实,意味着它们不能被修改。如下面的情况
String str = "Hi";
String str1 = str.concat("Nilesh");
如果length参数为0或者将创建一个新的String对象并返回其引用,则返回str对象。 如果我这样做
String str = "Hi";
str="Hello";
如何改变?不可变的地方在哪里?请举个例子。
答案 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”