关于String的面试题

1.如下代码分别建立了几个对象

String str1 = “123”;String str2 = new String(“123”):;
咱们先来看下面这张图
在这里插入图片描述
咱们先说常量池,常量池分为
1;编译常量池:当字节码加载进jvm的时候,存储字节码相关的信息
2;运行常量池:存储常量数据
String str1 = "123"再来看这一道题
因此咱们知道,“123”这个常量是存储在方法区的常量池中的,当咱们栈中的str1想用"123"这个常量的时候,会想去方法区中的常量池找,看有没有"123"这个常量,若是有那就直接饮用这个常量的内存地址,而后传递这个值让str1去用,可是若是常量池中没有"123"这个常量,那么就会新建立一个常量"123"并赋给str1
因此String str1 = “123”,最少建立0个对象,最多建立1个对象web

再来看这道题
;String str2 = new String(“123”):
咱们知道,new出来的对象时在堆空间中开辟的,因此能new 的时候,必定会在堆空间中建立一个对象,当这个对象建立好了后,他就会去常量池中寻找是否有"123"这个常量,若是有,就会直接引用这个内存地址传递值,若是没有就会从新建立“123”常量jvm

因此String str2 = new String(“123”):至少会建立一个对象,最多建立两个对象
在这里插入图片描述svg

2.判断下面对象之间是否相等

String str1 = “123”;
String str2 = new String(“123”):
String str3= “1” +“2”+“3”;
String s = “12”;
String str4 = s+“3” ;
String str5 = getNum()+“3” ;
public static String getNum(){
return “12”;
}
咱们先来测试一下
在这里插入图片描述
str1str2
这道题与第一道题类似,str1引用的是常量池的内存地址,str2引用的是堆空间的内存地址,天然不相等
str1
str3
这道题为何是正确的呢,这是因为编译器优化,当咱们查看编译后的字节码文件反编译后的原文件时,会发现,编译器在编译的时候"1" + “2” + “3"优化成了"123”,因此str3引用的也是常量池中"123"的内存地址,故相等
在这里插入图片描述
str1str4
str1
str5
这两道题都是同样的,咱们知道变量和方法只有在运行时期才会肯定他们的值,在编译时期只会检查语法是否正确,故这两个题的答案都为false
在这里插入图片描述测试