大家先来看看下面这段程序:

public class Test{
public static void main(String args[])
{
String str1 = "abc";
String str = "abc;
String str2 = new String("abc");

System.out.println(str1 == str2);
System.out.println(str1.equals(str2));
System.out.println(str == str1);
 }
}

这短代码的运行结果是:

第一句println输出的是false;而第二句则输出的是true;但第三局却是true;

在这里很多人会误认为第一句应该是true,但事实上却是false.因为第一句进行"=="比较的时候比较的是两个指向,而不是具体指向的内容。而第三句在进行“==”比较的时候同样比较的是指向,但是他们的指向是相同的。这种现象出现的原因和字符串在内存中实例化的时候有关。
具体情况如下图所示:

(二)java中String str1 = new String("abc")与String str1 = "abc"的区别_==

 

当执行第一句Str1 = "abc" 实例化出第一个指向;当进行第二句Str = "abc" 的时候出现第二个指向,因为堆内存中存在"abc",而且str也没有new一个新的对象,所以为了节省内存,str指向了str1所指向的对象;但是第三句的时候出现new语句,他实例化出了一块新的空间用来盛放"abc",自然str2的指向也也是指向这段新开辟的空间。