String str=new String("JAVA");
System.out.println("value of str before "+str); //JAVA
String str2=null;
str=str2;
System.out.println("value of str"+str); //null
System.out.println("value of str2"+str2);//null
str="Prog";
System.out.println("value of str"+str); //prog
System.out.println("value of str2"+str2);//null
问题1如果字符串是不可变的,为什么str的值会改变?
Student stu= new Student(123);
System.out.println("value of stu before "+stu); //some address is printed
Student stu2=null;
stu=stu2;
System.out.println("value of stu"+stu); //null
System.out.println("value of stu2"+stu2);//null
Student stu3=new Student(456);
stu=stu3;
System.out.println("value of stu"+stu); //some new address
System.out.println("value of stu2"+stu2);//null
Ques 2.String和Object的行为方式相同。然后,为什么String是不可变的,而Object是可变的。区别在哪里
答案 0 :(得分:1)
当您创建像new Student(123)
或new String("JAVA")
这样的对象时,它会占用堆中的空间。 str
,str2
,stu
,stu2
是引用,它们可以包含相同类型对象的引用。
现在分配相同的内存还是不同的?
不同的是,String
和Student
不是同一个类,对象将在堆中占用不同的空间。
如果stu改变将stu2改变??
是的,只要他们都引用相同的对象。
为什么对象是可变的,字符串是不可变的?
您可以更好地完成此SO question - Immutable class?
答案 1 :(得分:0)
String
s不能改变,期间;这是该语言的核心特征。
但是,如果str
和str2
是可变的不同,那么str = str2
只会将str
设置为指向同一个对象str2
是的,因此对str2
的更改将改为str
。请注意,在您的特定情况下,str2
未初始化,因此您的代码将无法编译。
答案 2 :(得分:0)
Java不允许String
只是语言的一部分。您的代码str2
也永远不会被初始化。
答案 3 :(得分:0)
Mutable vs immutable - 字符串是不可变的,你不能在构造后改变它。至于为什么,不可变类有几个优点,如下所示:
Difference between Mutable objects and Immutable objects
java参考的大多数问题已在此帖子中恢复: Is Java "pass-by-reference" or "pass-by-value"?
答案 4 :(得分:-1)
两个字符串都使用相同的内存。但是,当您更改str时,str2不会更改,反之亦然。这是因为Java中的字符串存储在字符串池中。请考虑以下代码:
String str1 = "hello";
String str2 = "hello";
这两个字符串都指向字符串池中内存中的相同位置。当您“创建”一个字符串时,它会检查该字符串池中是否已存在该字符串,如果存在,则指向该字符串。这有很多含义。例如,考虑:
String str1 = "hello";
String str2 = "hello";
str2 = str2 + " world";
在这种情况下,“hello”将被添加到字符串池中,str1将指向它。 str2会检查“hello”是否存在,看到它确实存在,然后指向它。最后一行将在字符串池中创建一个完整的新字符串“hello world”,然后str2将指向它。