Java面试题——String创建了几个对象



理论解释

java中对于字符串的拼接,存在常量和常量,常量和变量,变量和变量的三种情况的拼接,其次JVM的优化与否(针对常量和常量的拼接来说)也对创建的对象个数有关。


提示:以下是本篇文章正文内容,下面案例可供参考

一、常量和常量的拼接

在这里插入图片描述

String str1=“a”+"b"和String str2=new String(“a”+“b”)这入图片描述

因为这种情况是常量之间相加,经过编译器优化成了String str1 = “ab”,放在字符串常量池中,所以答案是创建了一个对象。如果不考虑优化的情况下,这一共是创建了3个对象的,因为一个双引号就是一个字面量(对象)。同时要考虑字符串常量池中是否存在a,b,ab。

在这里插入图片描述
在JVM优化情况下会产生1或2个对象,其中 new String() 必然在 堆中产生一个对象,“a” + “b” 在编译阶段由常量优化为 “ab”,若常量池存在则复用,若不存在则创建;在没有优化的情况下且常量池中并不存在a,b,ab,会产生4个对象,分别是常量池中的a,b,ab,new String(),在堆中分配内存,里面存着这字符串"ab"在字符串常量池中的地址,同时str2 存储在栈中,里面存储着指向堆中new String()的地址。

String str3="ab"和String str4 =new String(“ab”)

在这里插入图片描述
如果以 String str3=“ab"这种方式创建字符串,则产生零个或一个对象,即字符串常量池中的"ab”,栈中的str3中存储着直接指向字符串常量池中的"ab"的地址值。
以 String str4=new String(“ab”)方式来创建对象,则产生一个或两个对象,一个对象是:new关键字在堆空间创建的;另一个对象是:字符串常量池中的对象"ab"。 (如果前后文中还有代码,并且已经有 ab 常量在常量池存在时,ab 将不再创建,因为在常量池只能存在一份相同的对象)

二、常量和变量的拼接

在这里插入图片描述

String str5=“a”+new String(“b”)

在这里插入图片描述对象1: new StringBuilder()
对象2: 常量池中的"a"
对象3: new String(“b”)
对象4: 常量池中的"b"
对象5 :new String(“ab”)–StringBuilder执行toString方法,创建String对象完成拼接
注:StringBuilder 的 toString() 的调用,在字符串常量池中,没有生成"ab"。
如果前后文中还有代码,并且已经常量在常量池存在时,相同的常量 将不再创建,因为在常量池只能存在一份相同的对象。

结论是至多是5个对象。

String str6=new String(“a”) + new String(“b”)

在这里插入图片描述
对象1: new StringBuilder()
对象2: new String(“a”)
对象3: 常量池中的"a"
对象4: new String(“b”)
对象5: 常量池中的"b"
对象6 :new String(“ab”)

结论是至多是6个对象。

补充

在这里插入图片描述

在这里插入图片描述

难道不应该是两个吗?

在这里插入图片描述

这道题还未搞懂,直接拷贝的别的博主的,希望大佬们能解答!!!

  • 3
    点赞
  • 21
    收藏
    觉得还不错? 一键收藏
  • 4
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值