如何比较Java中的字符串?

时间 2009-02-05
阅读 3435955
点赞 727
收藏 918
连接

我一直在使用==程序中的运算符,用于比较迄今为止所有字符串。 但是,我遇到一个错误,把其中一个改成.equals()相反,它修复了错误。

==不好?什么时候应该使用,不应该使用?有什么区别?

✅ 被采纳的答案

==引用相等性测试(它们是否为同一对象)。

.equals()测试值是否相等(逻辑上是否“相等”)。

Objects.equals()检查null打电话之前.equals()所以您不必(从JDK7开始提供,也可以在Guava

String.contentEquals()比较String与任何CharSequence(自Java 1.5可用)。

因此,如果要测试两个字符串是否具有相同的值,则可能需要使用Objects.equals().

// These two have the same value
new String("test").equals("test") // --> true 

// ... but they are not the same object
new String("test") == "test" // --> false 

// ... neither are these
new String("test") == new String("test") // --> false 

// ... but these are because literals are interned by 
// the compiler and thus refer to the same object
"test" == "test" // --> true 

// ... string literals are concatenated by the compiler
// and the results are interned.
"test" == "te" + "st" // --> true

// ... but you should really just call Objects.equals()
Objects.equals("test", new String("test")) // --> true
Objects.equals(null, "test") // --> false
Objects.equals(null, null) // --> true

你几乎总是想用Objects.equals(). 在稀有的你的处境知道你在处理interned弦乐,你可以使用==.

JLS 3.10.5. 字符串常量

此外,字符串文本总是引用相同的类的实例String. 这是因为字符串文本——或者更一般地说,字符串是常量表达式(§15.28)-被“隔离”以便使用该方法共享唯一的实例String.intern.

类似的例子也可以在JLS 3.10.5-1.

👍 5156