说在前头:本人为大二在读学生,书写文章的目的是为了对自己掌握的知识和技术进行一定的记录,同时乐于与大家一起分享,因本人资历尚浅,能力有限,文章难免存在一些错漏之处,还请阅读此文章的大牛们见谅与斧正。若在阅读时有任何的问题,也可通过评论提出,本人将根据自身能力对问题进行一定的解答。
前言
String c="a"+new String("b");这一条语句会产生多少个对象?对于基础较为薄弱的小伙伴来说,可能只回答到4个,但其实正确的答案是5个。下面我会对该语句进行详细的讲解,小伙伴们系好安全带,准备好,要发车咯。
1.理论讲解
java中对于字符串的拼接,会默认生成StringBuilder帮助我们完成拼接工作,因此,当我们执行String c = "a" + new String("b");时,大致分为以下步骤:
- 创建StringBuilder对象
- 创建常量”a“
- 创建String对象
- 创建常量”b“
- 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对象来完成对于字符串拼接的工作,至此第五个对象产生。
总结
此篇文章中我们讲述了字符串拼接的原理,并且通过反编译字节码文件进行探讨和验证。希望您在此文章中有所收获。
👇扫描二维码关注