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个对象
再来看这道题
;String str2 = new String(“123”):
我们知道,new出来的对象时在堆空间中开辟的,所以能new 的时候,一定会在堆空间中创建一个对象,当这个对象创建好了后,他就会去常量池中寻找是否有"123"这个常量,如果有,就会直接引用这个内存地址传递值,如果没有就会重新创建“123”常量
所以String str2 = new String(“123”):至少会创建一个对象,最多创建两个对象
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引用的是堆空间的内存地址,自然不相等
str1str3
这道题为什么是正确的呢,这是由于编译器优化,当我们查看编译后的字节码文件反编译后的原文件时,会发现,编译器在编译的时候"1" + “2” + “3"优化成了"123”,所以str3引用的也是常量池中"123"的内存地址,故相等
str1str4
str1str5
这两道题都是一样的,我们知道变量和方法只有在运行时期才会确定他们的值,在编译时期只会检查语法是否正确,故这两个题的答案都为false