Java基础:String c=“a“+new String(“b“);会产生多少个对象?

说在前头:本人为大二在读学生,书写文章的目的是为了对自己掌握的知识和技术进行一定的记录,同时乐于与大家一起分享,因本人资历尚浅,能力有限,文章难免存在一些错漏之处,还请阅读此文章的大牛们见谅与斧正。若在阅读时有任何的问题,也可通过评论提出,本人将根据自身能力对问题进行一定的解答。

前言

String c="a"+new String("b");这一条语句会产生多少个对象?对于基础较为薄弱的小伙伴来说,可能只回答到4个,但其实正确的答案是5个。下面我会对该语句进行详细的讲解,小伙伴们系好安全带,准备好,要发车咯。

1.理论讲解

java中对于字符串的拼接,会默认生成StringBuilder帮助我们完成拼接工作,因此,当我们执行String c = "a" + new String("b");时,大致分为以下步骤:

  1. 创建StringBuilder对象
  2. 创建常量”a“
  3. 创建String对象
  4. 创建常量”b“
  5. StringBuilder执行toString方法,创建String对象完成拼接

下面我们来详细探讨和验证答案的正确性

2.反编译字节码文件

首先我们需要创建一个java测试文件,运行问题中的代码(如下)

package com.bosen.www;

/**
 * <p>测试类</p>
 * @author Bosen 2021/5/19 15:22
 */
public class Test {
    public static void main(String[] args) {
        String c = "a" + new String("b");
    }
}

运行代码后,找到对应生成的字节码文件

图片

打开Test.class对应路径的命令行界面

图片

执行反编译命令 javap -v Test.class

图片

找到main方法如下

图片

将Test.class文件进行反编译后,我们可以看到jvm运行时执行的具体命令,首先创建了一个StringBuilder对象,然后将常数a压栈,创建一个String对象,再将常数b压栈,最后StringBuilder执行toString方法。这与我们在第一点(理论讲解)时描述的一致。但我们的答案明明是生成了5个对象,现在只产生了4个对象,那第5个对象又是在哪里创建的?其实他隐藏在StringBuilder对象的toString方法中,因此,我们需要通过查看StringBuilder的源码来一探究竟。

3.查看StringBuilder源码

如上所述,当我们的a,b常量压栈后,StringBuilder执行了toString()方法,根据StringBuidler对象在这段代码中扮演的角色,我们不难猜测,StringBuilder执行toString()方法的目的是为了进行拼接字符串的操作,具体是否与我们猜测的一致?我们查看StringBuiler即可验证。(在idea中快速按下shift键,输入StringBuilder即可进入StringBuilder的源码中,找到toString方法)

图片

StringBuilder的toString方法源码如下

图片

可以看到,StringBuilder的toString方法实例化了一个String对象来完成对于字符串拼接的工作,至此第五个对象产生。


总结

此篇文章中我们讲述了字符串拼接的原理,并且通过反编译字节码文件进行探讨和验证。希望您在此文章中有所收获。

👇扫描二维码关注

  • 3
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

云丶言

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值