-5
  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

问题 2.String 和 Object 的行为方式相同。那么为什么 String 是不可变的,而 Object 是可变的。区别在哪里

4

5 回答 5

1

当您创建类似对象new Student(123)new String("JAVA")它占用堆空间时。str, str2, stu,stu2是引用,它们可以持有同类型对象的引用。

现在分配相同的内存还是不同的内存?

不同的类String和不同的Student类,对象将在堆中占用不同的空间。

如果 stu 改变 stu2 会改变吗?

是的,只要它们都引用同一个对象。

为什么对象是可变的而字符串是不可变的?

你可以更好地解决这个问题 - 不可变类?

于 2013-09-07T19:22:17.607 回答
0

Java 不允许Strings 只是语言的一部分。同样在您的代码str2中永远不会初始化。

于 2013-09-07T19:27:34.243 回答
0

可变 vs 不可变 - 字符串是不可变的,构造后无法更改。至于为什么,不可变类有几个优点,正如您在此处所遵循的那样:

可变对象和不可变对象之间的区别

Java 引用的大多数问题都在这篇文章中得到解决: Java 是“按引用传递”还是“按值传递”?

于 2013-09-07T19:37:32.560 回答
0

Strings永远不会改变,时期;这是语言的核心特征。

但是,如果strstr2是可变的不同对象,str = str2则将设置str为指向同一个对象str2str2因此更改 to 将更改为str. 请注意,在您的特定情况下,str2未初始化,因此您的代码将无法编译。

于 2013-09-07T19:25:08.087 回答
-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 将指向它。

于 2013-09-07T19:30:00.143 回答