如何在Java中比较字符串?

2022-08-31 04:07:04

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

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


答案 1

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

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

Objects.equals() 在调用之前检查,因此您不必这样做(从 JDK7 开始可用,在 Guava 中也可用)。null.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 开始。字符串文本

此外,字符串文本始终引用类 的同一实例。这是因为字符串文本 (或者更一般地说,作为常量表达式的值的字符串 (§15.28) ) 被“暂存”,以便使用该方法共享唯一实例。StringString.intern

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

其他需要考虑的方法

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

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


答案 2

==测试对象引用,测试字符串值。.equals()

有时它看起来好像在比较值,因为Java做了一些幕后的事情来确保相同的内联字符串实际上是相同的对象。==

例如:

String fooString1 = new String("foo");
String fooString2 = new String("foo");

// Evaluates to false
fooString1 == fooString2;

// Evaluates to true
fooString1.equals(fooString2);

// Evaluates to true, because Java uses the same object
"bar" == "bar";

但要小心空值!

==可以很好地处理字符串,但从空字符串调用将导致异常:null.equals()

String nullString1 = null;
String nullString2 = null;

// Evaluates to true
System.out.print(nullString1 == nullString2);

// Throws a NullPointerException
System.out.print(nullString1.equals(nullString2));

因此,如果您知道这可能是空的,请通过编写来告诉读者fooString1

System.out.print(fooString1 != null && fooString1.equals("bar"));

以下内容较短,但不太明显的是它检查 null:

System.out.print("bar".equals(fooString1));  // "bar" is never null
System.out.print(Objects.equals(fooString1, "bar"));  // Java 7 required