Java在比较两个相等字符串时返回false

Java在比较两个相等字符串时返回false,java,string,Java,String,当我执行: String a = "hello"; String b = "hello"; System.out.println(a==b); 我得到的输出为“true” 但当我跑步时: String a = new String("hello"); String b = "hello"; System.out.println(a==b); 我得到的输出为“false” 我知道在第一种情况下,Java使“b”指向“a”指向的同一个对象,但为什么在第二种情况下它不能这样做呢?Java中的字符串

当我执行:

String a = "hello";
String b = "hello";
System.out.println(a==b);
我得到的输出为“true”

但当我跑步时:

String a = new String("hello");
String b = "hello";
System.out.println(a==b);
我得到的输出为“false”


我知道在第一种情况下,Java使“b”指向“a”指向的同一个对象,但为什么在第二种情况下它不能这样做呢?

Java中的字符串是不可变的。意思是:

String a = "hello";
String b = "hello";
a和b通常指向内存中的同一个对象

这里显式创建一个新对象

String a = new String("hello");
String b = "hello";
因此,2不相等

=
比较内存地址。要检查Java中的一个对象是否等于另一个对象,应使用所有对象上的
equals
方法


如果重写
System.out.println(a==b)
系统输出println(a等于(b))这两种情况都是如此

Java中的字符串是不可变的。意思是:

String a = "hello";
String b = "hello";
a和b通常指向内存中的同一个对象

这里显式创建一个新对象

String a = new String("hello");
String b = "hello";
因此,2不相等

=
比较内存地址。要检查Java中的一个对象是否等于另一个对象,应使用所有对象上的
equals
方法


如果重写
System.out.println(a==b)
系统输出println(a等于(b))这两种情况都是正确的

请阅读下面关于stackoverflow的详细解释:

请阅读以下关于stackoverflow的解释性答案:

因为您显式地告诉它创建一个新对象。@racraman是的,但只针对“a”。在创建“b”时,Java应该搜索已经包含“hello”和“b”的对象,就像在第一种情况下一样。这绝对是一个重复的问题。。简而言之,
==
比较引用,
.equals()
比较字符串内容。
Java应该搜索。。。正如它在第一个案例中所做的那样不,不应该,因为这会对运行时速度产生(很大)影响。在第一种情况下,“搜索”不是在运行时进行的,而是在编译时针对编译时常量进行的,因此对运行时速度没有影响。因为您显式地告诉它创建一个新对象。@racraman是的,但只针对“a”。在创建“b”时,Java应该搜索已经包含“hello”和“b”的对象,就像在第一种情况下一样。这绝对是一个重复的问题。。简而言之,
==
比较引用,
.equals()
比较字符串内容。
Java应该搜索。。。正如它在第一个案例中所做的那样不,不应该,因为这会对运行时速度产生(很大)影响。在第一种情况下,“搜索”不是在运行时发生的,而是在编译时针对编译时常量进行的,因此对运行时速度没有影响。