Java new String(“abc“) 到底是创建了几个字符串对象?字符串常量池中的到底是哪一个?

问题:new String("abc") 到底是创建了几个字符串对象?

不考虑字符串常量池中已有的字符串“abc”的情况,答案是会创建两个字符串对象

new和双引号""是两种创建字符串的方式

1、双引号方式创建字符串

双引号创建时,先去字符串常量池找,如果有,直接返回其引用,如果没有,则在字符串常量池中创建新的字符串对象引用,并返回该引用。这个字符串对象本身是在堆内存中分配的。(这块注意,很多人经常说字符串对象是在字符串常量池中的,常量池中的只是引用,对象本身是在堆中的)

2、使用new关键字创建字符串

使用new方式创建的字符串对象和正常创建对象的流程是一样的,直接在堆中分配内存,创建一个新的对象,不会去常量池中找。

3、总结

所以说new String("abc"),不考虑字符串常量池中已有abc的情况下,会创建两个字符串对象

第一次是双引号"abc"方式,字符串常量池中创建引用指向堆中新创建的字符串对象。

第二次是new方式在堆中创建的另一个字符串对象

那字符串常量池中的到底是哪一个?

那字符串常量池中存放的就是双引号方式创建的那个对象的引用,并不是对象本身

补充:字符串常量池 是 JVM 为了提升性能和减少内存消耗针对字符串(String 类)专门开辟的一块区域,主要目的是为了避免字符串的重复创建。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值