jdk1.6和1.7 String常量池

在jdk1.6中,该方法把字符串的值复制到常量区,然后返回常量区里这个字符串的值;
在jdk1.7~里,该方法在常量区记录该字符串首次出现的实例引用,然后返回该地址,常量区可以保存字面量也可以保存字符串对象在堆中的引用。

/**
* 这里都是基于1.7~ 想了解intern()就需要了解 栈 堆 运行时常量池。了解一个字符串对象到底是怎样存储的!才能灵活运用
* intern()作用分析
* 判断这个常量是否存在于常量池。
* 1.存在:判断存在内容是引用还是常量。如果是引用,返回引用地址指向堆空间对象。如果是常量则直接返回常量池常量
* 2.不存在:将当前对象引用复制到常量池。并且返回的是当前对象的引用
*
* 直接使用双引号常量分析
* 判断这个常量是否存在于常量池
* 1.存在:判断这个常量是存在的引用还是常量。如果是引用,返回这个引用指向堆空间的对象。如果是常量则直接返回常量池常量
* 2.不存在:直接将此常量添加到常量池。并且返回此常量
*
* new String对象分析
* new一个String对象做了两个操作
* 1.保存对象到堆空间。
* 2.将这个对象的内容作为常量保存到常量池
* 这里只接受new 对象里面的内容到常量池。不包括append 和连接对象
*
* 直接使用双引号常量和new String对象的区别
* 直接双:
* 加号连接会直接组合成一个常量保存的常量池
* 声明两个引用使用双。在将引用加号连接会保存一个或者两个常量到常量池(两个是因为两个的内容不一致)。和一个组合对象到堆空间
* new String:
* 加号连接会添加两个对象到堆和一个或者两个常量到常量池(两个是因为加号前后的内容不一致)
* 直双加newSting:
* 加号连接会保存2个对象到堆(一个是new的一个是new+直双后的)。保存一个或者两个常量到常量池(内容不一致两个)
*
* 直接使用双引号常量分析能证明局部常量会受到执行顺序影响
* 执行过intern()对象并且保存了引用到常量池后。。gc是没法回收这个对象的。因为它引用一直在
*/
String aa = “AA”;//设置常量AA到常量池
String bb = “BB”;//设置常量BB到常量池
String ccdd = “CC”+“DD”;//设置常量CCDD到常量池
String neeff = new String(“EE”)+new String(“FF”);//设置EE和FF到常量池。并且添加EE、FF和EEFF对象到堆
String aabb = aa+bb;//添加AABB对象到堆
String gghh = “GG”+new String(“HH”);//设置GG和HH常量到常量池,设置HH和GGHH对象到堆
// aa.intern();//啥事都不做,返回AA常量
// ccdd.intern();//啥事都不做,返回CCDD常量
// neeff.intern();//添加EEFF对象的引用到常量池,并返回EEFF对象
// aabb.intern();//添加AABB对象的引用到常量池,并返回AABB对象
// gghh.intern();//添加GGHH对象的引用到常量池,并返回GGHH对象
System.out.println(aa.intern()aa);
System.out.println(neeff.intern()
“EEFF”);
System.out.println("EEFF"neeff);
String nccdd = new String(“CCDD”);
System.out.println(ccdd
nccdd);
System.out.println(ccdd==nccdd.intern());
System.out.println(aabb.intern()aabb);
System.out.println(gghh
gghh.intern());

转自:https://blog.csdn.net/shanksqian/article/details/78330294
https://www.cnblogs.com/darknessplus/p/10432064.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值