关于java字符串 “ab” + “cd“ 创建了几个对象

关于 String s = “ab” + “cd” 创建了几个字符串对象,首先前提是在程序其他地方没有涉及"ab"、“cd”和“abcd”的字面量以及拼接操作。如果关注过此类问题应该会知道这句代码只会产生一个"abcd"对象,不会产生“ab”、“cd”字符串对象,那么怎么证明呢。

第一种方式可以通过javap工具产生类的字节码来查看,首先先上出测试代码

import java.util.Scanner;

public class StrTest1 {
	public static void main(String[] args) {
		String s = "ab" + "cd";

		Scanner scanner = new Scanner(System.in);
		scanner.nextInt();
	}
}

然后执行命令

javap -verbose StrTest1.class

拿到字节码信息,其中常量池中的字符串常量只有abcd, 不存在ab和cd
在这里插入图片描述
在方法中也只有abcd的ldc操作
在这里插入图片描述
因此字节码文件中只存在abcd字串,不存在ab和cd字符串,这其实是编译器做了优化,多个字符串字面量拼接只会保留最终的字符串。

第二种方式我们可以在运行起来的程序中查找相关的字符串进行验证,这里使用java自带的VisualVM工具
首先启动测试程序,在VisualVM中找到该进程,并导出堆快照
在这里插入图片描述
选中java.lang.String
在这里插入图片描述

通过OQL语句查询相关字符串,可以查到abcd
在这里插入图片描述
但是无法查出ab和cd
在这里插入图片描述
这也证明了开始的结论。
通过这两种方法也可以分析其他情况,因此我们在一些细节问题上不仅应该知道结论,更应该知道如何证明结论。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值