首先看一段这样的代码
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放在第一行会在常量池和堆中分别创建一个对象,


![缓存[-128-127]数字](https://www.7z7z7z.cn/wp-content/themes/begin/prune.php?src=https://www.7z7z7z.cn/wp-content/uploads/2020/06/image.png&w=280&h=210&a=&zc=1)





