This question's answers are a community effort。编辑现有答案以改善此职位。它目前不接受新的答案或互动。
到目前为止,我一直在程序中使用
但是,我遇到了一个错误,而是将其中一个更改为
您几乎总是想使用
从JLS 3.10.5. String Literals:
此外,字符串文字总是引用类
在JLS 3.10.5-1中也可以找到类似的示例。
其他要考虑的方法
String.equalsIgnoreCase()忽略大小写的值相等。
String.contentEquals()将
到目前为止,我一直在程序中使用
==
运算符比较所有字符串。但是,我遇到了一个错误,而是将其中一个更改为
.equals()
,并修复了该错误。==
不好吗?什么时候应该使用它,不应该使用它?有什么不同? 最佳答案
==
测试引用是否相等(它们是否是同一对象)。.equals()
测试值的相等性(在逻辑上是否相等)。
Objects.equals()在调用null
之前检查.equals()
,因此您不必(在JDK7上可用,在Guava中也可用)。
因此,如果要测试两个字符串是否具有相同的值,则可能要使用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 Literals:
此外,字符串文字总是引用类
String
的相同实例。这是因为使用方法String.intern
对字符串文字(或更一般而言,是常量表达式(§15.28)的值的字符串)进行“内联”,以便共享唯一的实例。在JLS 3.10.5-1中也可以找到类似的示例。
其他要考虑的方法
String.equalsIgnoreCase()忽略大小写的值相等。
String.contentEquals()将
String
的内容与任何CharSequence
的内容进行比较(从Java 1.5开始可用)。使您不必在进行相等比较之前将StringBuffer等转换为String,但是将null检查留给了您。