可能是重复问题:
什么使得在Java中一些字符串可以使用引用比较(==)?
我知道这个问题以前已经被问过, 但是尽管建议使用.equals()
代替==
比较运算符,我发现==
始终有效:
String s1 = "Hello";
String s2 = "Hello";
System.out.println(s1 == s2); // true
有人能给我一个==
运算符失效的例子吗?
可能是重复问题:
什么使得在Java中一些字符串可以使用引用比较(==)?
我知道这个问题以前已经被问过, 但是尽管建议使用.equals()
代替==
比较运算符,我发现==
始终有效:
String s1 = "Hello";
String s2 = "Hello";
System.out.println(s1 == s2); // true
有人能给我一个==
运算符失效的例子吗?
这是因为你很幸运。在Java中,==
操作符检查的是引用相等性:如果指针相同就返回 true。它不检查内容的相等性。编译时发现的相同字符串会被合并成一个单独的 String
实例,因此它适用于 String
字面量,但不适用于在运行时生成的字符串。
例如,"Foo" == "Foo"
可能有效,但 "Foo" == new String("Foo")
不行,因为 new String("Foo")
创建了一个新的 String
实例,并且打破了任何可能的指针相等性。
更重要的是,在实际程序中,你处理的大多数 Strings
是在运行时生成的。文本框中的用户输入是在运行时生成的。通过套接字接收的消息是在运行时生成的。从文件中读取的内容是在运行时生成的。因此,如果要检查内容的相等性,使用 equals
方法而不是 ==
操作符非常重要。
有没有人能给我一个“==”运算符失败的例子?
示例1:
String s1 = new String("Hello");
String s2 = new String("Hello");
System.out.println(s1 == s2); // false
示例 2:
Integer a=1000,b=1000;
System.out.println(a == b); // false
String.intern()
时进行内部化。(这是一种效率问题:内部化在许多方面都很昂贵。) - Stephen CString s1 = "Hello";
String s2 = "Hello";
==
将返回true,因为它们指向相同的内存地址。String s1 = new String("Hello");
String s2 = new String("Hello");
.equals()
时它们将是相等的,因为它们的值相同,但使用==
时它们将不相等,因为它们是堆内存空间中的不同对象。经验丰富的Java开发人员很少使用new String(String)
,但这个问题也会在其他情况下出现。例如:
String hello = "Hello"
String hell = hello.substring(0, 4);
System.err.println("Hell" == hell); // should print "false".
在实际应用中,大多数String实例都是通过从其他String中取子串或者通过字符数组构造而成的。很少有应用程序只使用作为字面量创建的String实例。