java中String对象和String变量

java中String对象和String变量

 (2011-12-27 20:40:27)java

转载spa

标签: 

it

       最近在论坛上看到关于String s = new String("XYZ") + new String("XYZ");到底建立几个对象的讨论,以为比较有意思,在此总结一下。 .net

         在JAVA中除了8种基本类型以外,其余的都是类对象及其引用。因此 "XYZ"在JAVA中是一个String对象,对于String类对象来讲它的对象值是不能修改的,也就是具备不变性。orm

 

可是在下面一段程序中:对象

 

view plainprint?blog

  1. public class TestString {  内存

  2.     public static void main(String args[]) {  ci

  3.         String s = "Hello";  字符串

  4.         s = "Java";  get

  5.         String s1 = "Java";  

  6.         String s2 = new String("Java");  

  7.         System.out.println(s);  

  8.         System.out.println(s == s1);  

  9.         System.out.println(s == s2);  

  10.     }  

  11. }  

  12.   

打印出s的结果是"Java",看起来s所引用的String变量好像是被修改了,可是若是你了解JVM(Java虚拟机)处理String变量时的机制,你就会知道事实并不是如此。

 

在JVM的工做过程当中,会建立一片的内存空间专门存入String对象,咱们把这片内存空间叫作String池。 

对于语句String s= "Hello";,当JVM看到"Hello"时,会在String池建立String对象存储它,并将它的引用返回给String变量s。

语句s = "Java";,当JVM看到"Java"时,会在String池建立新的String对象存储它,再把新建的String对象的引用返回给String变量s。而原先的String对象"Hello"仍然在String池内,并无消失,它是不能被修改的。

因此咱们仅仅是改变了变量s的引用,而没有改变它所引用的对象,由于String对象的值是不能被修改的。

 

String s1 = "Java";,JVM首先在String池里面看可否找到字符串"Java",若是找到则返回它的引用给s1,不然建立新的String对象,放到String池里。这里因为有s = "Java",因此对象已经被引用,因此依据规则s和s1都是引用同一个对象。因此s==s1返回true。(注: 比较运算符==,对于非基本类型,是比较两引用是否引用内存中的同一个对象)。 

String s2 = new String( "Java");,JVM首先仍是在String池里面看可否找到字符串 "Java",若是找到,不作任何事情;不然建立新的String对象,放到String池里面。因为遇到了new关键字,还会在内存上(不是String池里面)建立String对象存储 "Java",并将内存上的(不是String池里面的)String对象返回给s2。因此s==s2将返回false,由于它们引用的不是同一个对象。

 

因此对于语句String s = new String("XYZ") + new String("XYZ");

JVM先在String池中建立一个String对象存储"XYZ",而后因为遇到new关键字,再在内存上建立一个String对象存储"XYZ";

接着因为String池中已经有了"XYZ"的对象,因此第二个new语句不会在String池中建立对象,而只会在内存上建立一个String对象;

最后两个字符串相加会在String池中建立一个String对象"XYZXYZ",并将其引用传给s。

因此总共会建立4个String对象。



注意:“最后两个字符串相加会在String池中建立一个String对象"XYZXYZ",并将其引用传给s。”最后这句话可能有问题!

public static void main(String[] args) {
String xyzxyzOne = "xyzxyz";
String xyzOne = new String("xyz");
String xyzTwo = new String("xyz");
String xyzxyzTwo = xyzOne + xyzTwo;
System.out.println("(xyzxyzOne == xyzxyzTwo):"
+ (xyzxyzOne == xyzxyzTwo));
}
输出为:(xyzxyzOne == xyzxyzTwo):false
因此应该是在内存中建立的String对象。

相关文章
相关标签/搜索