首先看一段这样的代码
String str1 = "abc";
String str2 = "abc";
String str3 = new String("abc");
System.out.println(str1 == str2);
System.out.println(str2 == str3);
返回的结果为 true和false,和想象中的或许有些不一样是吧。
首先,str1在方法区中的常量池中没有找到字符串abc,所以在常量池中创建一个字符串常量,str2在常量池中找到字符串常量,返回一个引用,所以输出的为true,str3在常量池中找到abc,返回一个引用实例,并在堆中创建一个对象,所以str3创建了一个新的对象,如果把str3放在第一行会在常量池和堆中分别创建一个对象,