真的创建了两个String对象?

一直对String strVar=new String("content");会产生两个对象似懂非懂,所以今天找了资料并测试了一下,下面是代码自己的理解和总结,希望能给和我有一样困惑的朋友带来帮助。

Code:
  1. public class StringObject {   
  2.   
  3.     public static void main(String[] args) {   
  4.            
  5.         /*  
  6.          * String a=new String("abc");一共创建了几个对象?我们都知道答案是2个。  
  7.          * 对String 类来说,他有一种特殊的构造对象的方法,String obj="content";  
  8.          * 在JVM中存在一个字符串池,保存String对象,这些对象可以被共享,因为String是final类的,因此一经创建,不可改变。  
  9.          * 这里我们可以大致的了解到为什么String会特别占资源了,因为每一个String对会生成一个新的对象(在JVM字符串池中的除外)  
  10.          * 在使用String obj="content"来创建String对象的时候,JVM首先会检查字符串池中是否存在这个对象(用equals(Object obj)),  
  11.          *      如果存在,将该对象的引用返回,否则创建并返回引用。  
  12.          * 常量的值在编译的时候就已经确定了,所以String c="ab"+"cd";在编译的时候就被确定了。只有在编译前能确定值的字符串才会被  
  13.          * 放进字符串池,所以字符串值也被称为静态字符串池  
  14.          * 所以String strA="abc"; String strB="ab"+"cd";会被放进字符串池中  
  15.          * 但是如String strC=strA; String strD="ab"+strA;都被会内放进字符串池,因为虽然strA已经赋值,但是它是一个变量  
  16.          * 特殊的 final String A="a"; final String B="b"; String strE="ab"; String strF=A+B;可测试知道strE==strF为true。  
  17.          * 注意,用final定义的常量只有声明并且直接赋值才适用。  
  18.          * JVM中的栈和堆  
  19.          * 栈一般用来存储基本数据类型(boolean、byte、char、short、int、long、float、double)  
  20.          * 堆用来存储对象  
  21.          * 从源文件String类的构造方法可以看到它的值存储在栈中的char型数组中的。  
  22.          * String str="abc";对象的创建过程:首先JVM检查栈中是否存在 {'a','b','c'}  
  23.          * 如果没有,就创建三个char类型的值'a','b','c',组成一个数组{'a','b','c'}  
  24.          * 然后在堆中创建一个String对象,它的值(value)是刚才在栈中创建的三个char型值组成的数组{'a','b','c'}  
  25.          * 最后这个新创建的String对象会被添加到字符串池中。  
  26.          * 如果我们接着执行 String b=new String("abc");代码,  
  27.          * 由于"abc"已经被创建并保存于字符串池中,因此JAVA虚拟机只  
  28.          * 会在堆中新创建一个String对象,但是它的值(value)是共享前一行代码执行时在栈中创建  
  29.          * 的三个char型值值'a'、'b'和'c'。  
  30.          * 到这里就能明白了String a=new String("abc") 首先有一个对象String str="abc";然后是一个new出来的对象  
  31.          */  
  32.         final String strA="ab";   
  33.         final String strB="cd";   
  34.         String strC=strA+strB;   
  35.         String strD_1=strA+strB;   
  36.         String strD_2="ab"+"cd";   
  37.         String strE=strC+strD_1;   
  38.         String strF=strC+strD_1;   
  39.   
  40.         System.out.println("strA=/"ab/"  strB=/"cd/"");   
  41.         System.out.println("strC=strA+strB");   
  42.         System.out.println("strD_1=strA+strB");   
  43.         System.out.println("strD_2=/"ab/"+/"cd/"");   
  44.         System.out.println("strC和strD_1是否为同一个对象:"+(strC==strD_1));   
  45.         System.out.println("strE和strF是否为同一个对象:"+(strE==strF));   
  46.         System.out.println("strD_1和strD_2是否为同一个对象:"+(strD_1==strD_2));   
  47.     }   
  48. }  

 

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值