使用’==’代替.equals for Java strings

可能重复:
是什么让参考比较(==)适用于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 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实例。)