Java字符串对象和常量池的总结

Java字符串对象和常量池的总结

字符串对象

new

当执行String str1= new String("123");时,虚拟机会创建几个对象呢,答案是两个。
当一个字符串对象被new出来的时候,有两种情况:
当字符串常量池中已经有这个对象时,此时只会在堆里创建这一个对象;
当字符串常量池中没有这个对象时,那么虚拟机还会在字符串常量池中创建一个对象。

+

当采用了+号拼接两个字符串时,会新建几个对象呢?

  • 情况1:常量+常量,编译器会优化成一个常量,如果这个常量在字符串常量池已经存在了,那么就不会创建对象,而如果字符串常量池中没有这个对象,那么就会在常量池中创建一个对象。
  • 情况2:常量+变量||变量+变量,只要+号左右两边出现了变量,那么就会走StringBuilder拼接字符串,所以会新建一个Stringbuilder对象,并且调用StringBuilder的toString方法时,还会new一个String对象,所以这里会创建两个对象。(注意:StringBuilder的toString方法不会在字符串常量池生成对象,查看字节码指令发现并没有ldc这条指令)

常量池

在JDK7以前,字符串常量池在方法区的实现永久代里面的。
在JDK7以后,字符串常量池是在堆空间里面的。
为什么要放到堆里面?

  • 如果还在方法区中,那么字符串常量池只有在Full GC执行时才会被垃圾回收,而如果在堆里,垃圾回收的效率大大增强,可以及时回收内存。
  • 永久代默认情况下比较小,大量字符串容易导致OOM。

intern方法

当一个字符串对象执行了intern方法后
如果字符串常量池已经存在了该字符串,那么会返回常量池里对象的地址。
如果字符串常量池不存在该字符串

  • JDK7以前,会在字符串常量池中生成一个新的对象。
  • JDK7以后,会在字符串常量池中保存执行了intern方法对象的地址,即常量池里该字面量的地址和堆里对象的地址一样。

面试题

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值