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应该搜索。。。正如它在第一个案例中所做的那样代码>不,不应该,因为这会对运行时速度产生(很大)影响。在第一种情况下,“搜索”不是在运行时发生的,而是在编译时针对编译时常量进行的,因此对运行时速度没有影响。