Java字符串引用和对象

时间:2013-09-07 19:19:19

标签: java string

  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是可变的。区别在哪里

5 个答案:

答案 0 :(得分:1)

当您创建像new Student(123)new String("JAVA")这样的对象时,它会占用堆中的空间。 strstr2stustu2是引用,它们可以包含相同类型对象的引用。

  

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

不同的是,StringStudent不是同一个类,对象将在堆中占用不同的空间。

  

如果stu改变将stu2改变??

是的,只要他们都引用相同的对象。

  

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

您可以更好地完成此SO question - Immutable class?

答案 1 :(得分:0)

String s不能改变,期间;这是该语言的核心特征。

但是,如果strstr2是可变的不同,那么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将指向它。