关于 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
这也证明了开始的结论。
通过这两种方法也可以分析其他情况,因此我们在一些细节问题上不仅应该知道结论,更应该知道如何证明结论。