jvm 关于字符串拼接的面试题
String a = new String("1") + new String("2");
a.intern();
String b = "12";
sout(a == b);
//在jdk6中为false 在jdk7/8中为true
首先只看第一行代码
这还代码为创建6个对象 分别是
1 拼接字符串两边有变量时会使用StringBuilder -> StringBuilder
2 第一个new 关键字new出来的对象
3 向常量池中添加的对象"1"
4 第二个new关键字new出来的对象
5 向常量池中添加的对象"2"
6 拼接字符串最后会调用toString tostring方法会new String();
首先在第一次使用对a进行赋值操作时 字符串常量池中是没有字符串"12"的
但在调用intern方法时 字符串常量池会多一个字符串"12"
但是在jdk6中 jvm是在常量池中创建一个全新的对象"12"
而在jdk7/8中 jvm是直接使用调用调用intern方法的对象的引用(String对象具有不可变性 所以无需考虑安全问题)

根据这些特性 也可以写出一个判断常量池是否含有该字符串的方法


浙公网安备 33010602011771号