可能重复:
What makes reference comparison (==) work for some strings in Java?
我知道这已经asked before了,但是尽管建议使用.equals()
而不是==
比较运算符,但我发现==
始终有效:
String s1 = "Hello";
String s2 = "Hello";
System.out.println(s1 == s2); // true
有人能举例说明==
运算符失败吗?
答案 0 :(得分:40)
这是因为你很幸运。 Java中的==
运算符检查引用相等性:如果指针相同,则返回true。它不检查内容是否相等。在编译时找到的相同字符串将折叠为单个String
实例,因此它适用于String
文字,但不适用于在运行时生成的字符串。
例如,"Foo" == "Foo"
可能有效,但"Foo" == new String("Foo")
不会,因为new String("Foo")
会创建一个新的String
实例,并且会破坏任何可能的指针相等。
更重要的是,您在实际程序中处理的大多数 Strings
都是运行时生成的。文本框中的用户输入是运行时生成的。通过套接字接收的消息是运行时生成的。从文件读取的东西是运行时生成的。因此,如果要检查内容是否相等,则使用equals
方法而不是==
运算符非常重要。
答案 1 :(得分:9)
有人能举例说明==运算符失败吗?
示例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
答案 2 :(得分:5)
执行此操作时,实际上是在创建字符串文字:
String s1 = "Hello";
String s2 = "Hello";
编译器找到相同的字符串文字,然后通过在堆中保留一个实例并使堆栈中的所有变量指向它来进行优化。因此,执行==
将返回true,因为它们指向相同的内存地址。
执行此操作时,您正在创建字符串对象:
String s1 = new String("Hello");
String s2 = new String("Hello");
实例化将为堆中的每一个创建唯一的空间,堆栈变量将指向那些单独的位置。因此,使用.equals()
它们将是相同的,因为它们的值相同,但使用==
它们将不相等,因为它们是堆内存空间中的不同对象。
答案 3 :(得分:4)
经验丰富的Java开发人员很少使用new String(String)
,但问题也出现在其他情况下。例如:
String hello = "Hello"
String hell = hello.substring(0, 4);
System.err.println("Hell" == hell); // should print "false".
(实际应用程序中的大多数String实例是通过获取其他String的子字符串,或者通过从字符数组构造它来形成的。很少有应用程序只使用作为文字创建的String实例。)