一直对String strVar=new String("content");会产生两个对象似懂非懂,所以今天找了资料并测试了一下,下面是代码自己的理解和总结,希望能给和我有一样困惑的朋友带来帮助。
- public class StringObject {
- public static void main(String[] args) {
- /*
- * String a=new String("abc");一共创建了几个对象?我们都知道答案是2个。
- * 对String 类来说,他有一种特殊的构造对象的方法,String obj="content";
- * 在JVM中存在一个字符串池,保存String对象,这些对象可以被共享,因为String是final类的,因此一经创建,不可改变。
- * 这里我们可以大致的了解到为什么String会特别占资源了,因为每一个String对会生成一个新的对象(在JVM字符串池中的除外)
- * 在使用String obj="content"来创建String对象的时候,JVM首先会检查字符串池中是否存在这个对象(用equals(Object obj)),
- * 如果存在,将该对象的引用返回,否则创建并返回引用。
- * 常量的值在编译的时候就已经确定了,所以String c="ab"+"cd";在编译的时候就被确定了。只有在编译前能确定值的字符串才会被
- * 放进字符串池,所以字符串值也被称为静态字符串池
- * 所以String strA="abc"; String strB="ab"+"cd";会被放进字符串池中
- * 但是如String strC=strA; String strD="ab"+strA;都被会内放进字符串池,因为虽然strA已经赋值,但是它是一个变量
- * 特殊的 final String A="a"; final String B="b"; String strE="ab"; String strF=A+B;可测试知道strE==strF为true。
- * 注意,用final定义的常量只有声明并且直接赋值才适用。
- * JVM中的栈和堆
- * 栈一般用来存储基本数据类型(boolean、byte、char、short、int、long、float、double)
- * 堆用来存储对象
- * 从源文件String类的构造方法可以看到它的值存储在栈中的char型数组中的。
- * String str="abc";对象的创建过程:首先JVM检查栈中是否存在 {'a','b','c'}
- * 如果没有,就创建三个char类型的值'a','b','c',组成一个数组{'a','b','c'}
- * 然后在堆中创建一个String对象,它的值(value)是刚才在栈中创建的三个char型值组成的数组{'a','b','c'}
- * 最后这个新创建的String对象会被添加到字符串池中。
- * 如果我们接着执行 String b=new String("abc");代码,
- * 由于"abc"已经被创建并保存于字符串池中,因此JAVA虚拟机只
- * 会在堆中新创建一个String对象,但是它的值(value)是共享前一行代码执行时在栈中创建
- * 的三个char型值值'a'、'b'和'c'。
- * 到这里就能明白了String a=new String("abc") 首先有一个对象String str="abc";然后是一个new出来的对象
- */
- final String strA="ab";
- final String strB="cd";
- String strC=strA+strB;
- String strD_1=strA+strB;
- String strD_2="ab"+"cd";
- String strE=strC+strD_1;
- String strF=strC+strD_1;
- System.out.println("strA=/"ab/" strB=/"cd/"");
- System.out.println("strC=strA+strB");
- System.out.println("strD_1=strA+strB");
- System.out.println("strD_2=/"ab/"+/"cd/"");
- System.out.println("strC和strD_1是否为同一个对象:"+(strC==strD_1));
- System.out.println("strE和strF是否为同一个对象:"+(strE==strF));
- System.out.println("strD_1和strD_2是否为同一个对象:"+(strD_1==strD_2));
- }
- }