String str1 = new String("abc");
String str2 = "abc";
System.out.println(Str1 == str2);
/** 输出结果 :
false
*/
- 关键在于
new
关键字, 它会先去常量池中检查是否存在"abc"
字符串常量, 没有的话, 会先在常量池中创建一个"abc"
字符串常量, 然后在堆中分配空间创建一个"abc"
的对象, 所以str1
指向了堆中的一片内存区域, 而str2
直接被赋值了一个字符串常量, 是存储在常量池中的 - 即最终的情况是, str1和str2这两个引用都存储在栈中, str1指向了堆中的
"abc"
对象, str2指向了常量池中的"abc"
字符串常量, 所以直接用==
比较引用是不相等的
String str1 = "abc";
String str2 = "abc";
System.out.println(str1 == str2);
/** 输出结果 :
true
*/
- 这种情况显然就是相等的, str1先在常量池中创建了字符串常量
"abc"
, str2发现常量池中已经存在"abc"
, 则直接指向了它, 即两个引用都指向了常量池中的字符串常量"abc"
String str1 = "abc";
String str2 = str1;
str1 = "def";
System.out.println(str1);
System.out.println(str2);
/** 输出结果 :
def
abc
*/
- 这里就是String是不变模式的体现, 对它的值的改变实际上是重新赋了一个新的对象或新的常量值, 原先的值并没有改变, 通俗的讲就是直接改变了它引用的地址