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对象具有不可变性 所以无需考虑安全问题) 

 

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

 

posted @ 2022-08-11 23:19  dronff  阅读(37)  评论(0)    收藏  举报