java - 如何在 Java 中比较字符串?

标签 java string equality

我一直在使用 ==我的程序中的运算符来比较到目前为止我的所有字符串。 然而,我遇到了一个错误,将其中一个更改为 .equals()相反,它修复了错误。

==坏的?什么时候应该使用它,什么时候不应该使用它?有什么区别?

最佳答案

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

.equals() 测试值是否相等(它们是否包含相同的数据)。

Objects.equals()在调用 .equals() 之前检查 null,这样您就不必这样做(从 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 :

Moreover, a string literal always refers to the same instance of class String. This is because string literals - or, more generally, strings that are the values of constant expressions (§15.28) - are "interned" so as to share unique instances, using the method String.intern.

类似的例子也可以在JLS 3.10.5-1中找到。 .

其他要考虑的方法

String.equalsIgnoreCase()忽略大小写的值相等。但请注意,此方法在各种与区域设置相关的情况下可能会产生意外结果,请参阅 this question .

String.contentEquals()String 的内容与任何 CharSequence 的内容进行比较(自 Java 1.5 起可用)。使您不必在进行相等比较之前将 StringBuffer 等转换为 String,但将 null 检查留给您。

关于java - 如何在 Java 中比较字符串?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57313791/

相关文章:

c++ - 如何在 C++ 中使用 Curl 获取 HTTP 响应字符串

arrays - 比较两个对象数组时出现难以理解的 Swift 编译器错误

java - Java hashCode() 方法是对象相等性的可靠度量吗?

java - 这个程序从哪里获取它的数字,为什么这是由于增加 1 数组大小引起的? ( java )

c++ - 将字符串的子字符串设置为 vector 的 char 元素时的 EXC_BAD_ACCESS (C++)

Java - 静态初始值设定项与静态变量的默认值

c - 为什么puts()最后会打印一个额外的字符?

c++ - C++20概念中 "equal"的概念

java - 如何将 "All Items"字段添加到 jcombobox

java - 当有颜色时 XSSFColor.getRgb() 返回 null