我同意这样一个事实,即String对象是不可变的,意味着它们不能被修改。像在下面在这种情况下String对象是不可变的吗?
String str = "Hi";
String str1 = str.concat("Nilesh");
这里的情况下,如果长度参数是0或一个新的字符串对象将被创建,其将参考返回的STR对象将被返回。 如果我这样做
String str = "Hi";
str="Hello";
它是如何改变?不可变的照片来自哪里?请举例。
我同意这样一个事实,即String对象是不可变的,意味着它们不能被修改。像在下面在这种情况下String对象是不可变的吗?
String str = "Hi";
String str1 = str.concat("Nilesh");
这里的情况下,如果长度参数是0或一个新的字符串对象将被创建,其将参考返回的STR对象将被返回。 如果我这样做
String str = "Hi";
str="Hello";
它是如何改变?不可变的照片来自哪里?请举例。
什么是永恒不变的是字符串本身。 ,而不是指向String的引用。在你的第二个代码:
String str = "hi";
str = "hello";
有涉及2个String对象:"hi"
和"hello"
。
str
是一个引用,最初指向第一个然后指向第二个赋值。但该字符串对象"hi"
不会在该代码中被修改。
"Hello"
是String
完全不同的对象,所以你可以不再引用"Hi"
不变性是不是参考它是关于对象的状态。如果状态改变,新的对象被创建。
http://docs.oracle.com/javase/tutorial/essential/concurrency/immutable.html
的对象被认为是不可变,如果它被构造后其状态不能改变。
你正在改变引用的不变性。
此代码:
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:
共3String str = "Hi";
String str1 = str.concat("Nilesh");
字符串对象被创建
壳体2:
String str = "Hi";
str="Hello";
在创建对象这种情况下2字符串。当执行第1行时,str指向“Hi”。执行第2行时的 str引用“Hello”并隔离“Hi”。 str只是指行2后的“Hello”
如果其他人说"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
通常将返回引用本身(但你不能依靠这个事实)。
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
一个常见的误解是,'字符串str'装置' str'是一个String对象。相反,它意味着'str'是对'String'对象的**引用**。所以你可以在不改变引用的对象的情况下改变引用。 –