到目前为止,我一直==在我的程序中使用运算符来比较我的所有字符串。但是,我遇到了一个错误,将其中一个.equals()改为,它修复了这个错误。
==
.equals()
==坏吗?什么时候应该使用,什么时候不应该使用?有什么不同?
==测试引用相等性(它们是否是同一个对象)。
.equals()测试值相等(它们在逻辑上是否“相等”)。
Objects.equals()null在调用之前检查,.equals()因此您不必这样做(从 JDK7 开始可用,在Guava中也可用)。
null
因此,如果您想测试两个字符串是否具有相同的值,您可能需要使用Objects.equals().
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(). 在您 知道 自己正在处理实习字符串的 极少数 情况下,您 可以 使用. * __==
从JLS 3.10.5。 字符串文字 :
此外,字符串字面量始终指代 同 一个 class 实例String。这是因为字符串文字 - 或者更一般地说,作为常量表达式值的字符串 (搂15.28 ) - 是“内部的”,以便使用 方法共享唯一实例String.intern。
String
String.intern
类似的例子也可以在JLS 3.10.5-1中找到。
String.equalsIgnoreCase()忽略大小写的值相等。但是请注意,此方法在各种与语言环境相关的情况下可能会产生意外结果,
String.contentEquals()将 theString的内容与 any 的内容进行比较CharSequence(Java 1.5 起可用)。使您不必在进行相等比较之前将您的 StringBuffer 等转换为字符串,但将空值检查留给您。
CharSequence