题目一:代码运行的结果是什么? False
//代码运行的结果是什么?
public class Question1 {
public static void main(String[] args) {
String s2 = new String("abc");
String s1 = "abc";
System.out.println(s1 == s2);
}
}
结果是:False
看看内存图,当程序执行后,先在方法区加载main()方法,执行第一条语句时,通过new出来的对象存储在堆内存中,而第二条语句中的s1存储在堆内存中的字符串常量池中。执行第三条语句时:虽然s1和s2都是abc,但是s1和s2的地址不一同,所以结果为False.
题目二: 代码运行后的结果是什么? False
public class Question2 {
public static void main(String[] args) {
String s1 = "abc";
String s2 = "ab";
String s3 = s2 + "c";
System.out.println(s1 == s3);
}
}
结果为false。虽s1和s3都是abc,但是两者的地址值不一样,前者存放在堆内存中字符串常量池中,而后者则是存储在堆内存中。所以二者并不相等。
题目三:代码运行后的结果是什么? True
public class Question3 {
public static void main(String[] args) {
String s1 = "abc";
String s2 = "a"+"b"+"c";
System.out.println(s1 == s2);
}
}
结果为真(True).因为二者在堆内存的地址值是相同的。在Java中存在编译优化机制,当程序执行时,会把"a"+"b"+"c"直接转化为abc.