1. 引言

Java中的String类提供了equals()contentEquals()方法来进行字符串比较。然而,这两个方法的功能存在一些特定的区别。

在这个教程中,我们将通过实例来快速了解这两个方法之间的差异。

2. equals()方法

equals()方法是Java String类的一个public方法,它重写了Object类的原始equals()方法。这个方法的签名如下:

public boolean equals(Object anObject)

这个方法通过检查两个不同字符串中的字符来进行比较。但是,该方法不仅检查内容,还检查对象是否是String类型的实例。因此,只有当以下条件都满足时,该方法才会返回true

  • 对象不为null
  • String对象
  • 字符序列完全相同

3. contentEquals()方法

类似于equals()方法,contentEquals()方法也用于比较字符串的内容。不同的是,contentEquals()方法接受CharSequence接口的任何实现作为参数,而不仅仅是String。这意味着可以比较StringStringBufferStringBuilderCharBufferSegment等。

其签名如下:

public boolean contentEquals(StringBuffer sb)
public boolean contentEquals(CharSequence cs)

因此,contentEquals()方法只关注字符串的内容。如果参数是String对象,会调用equals()方法进行比较。如果提供的是通用字符序列,该方法将比较相应位置上的字符。

如果给定的字符序列与原始字符串匹配,该方法将返回true。与equals()方法不同,contentEquals()方法在接收到null参数时会抛出NullPointerException

4. 示例

让我们通过编写简单的测试用例来看这两种方法的实际操作。为了简化,我们使用单词"Baeldung"作为代码示例。

首先,我们比较两个完全相同的String对象,这时两种方法都会返回true

String actualString = "baeldung";
String identicalString = "baeldung";

assertTrue(actualString.equals(identicalString));
assertTrue(actualString.contentEquals(identicalString));

接下来,我们使用具有相同内容的不同CharSequence实现。对于第一个实现,我们将CharSequence实例化为String。在这种情况下,由于内容和类型相同,两种方法都应该返回true

CharSequence identicalStringInstance = "baeldung";

assertTrue(actualString.equals(identicalStringInstance));
assertTrue(actualString.contentEquals(identicalStringInstance));

对于下一个例子,我们将使用StringBuffer实现。由于contentEquals()方法只检查内容,它应该返回true。然而,equals()方法应该返回false

CharSequence identicalStringBufferInstance = new StringBuffer("baeldung");

assertFalse(actualString.equals(identicalStringBufferInstance));
assertTrue(actualString.contentEquals(identicalStringBufferInstance));

5. 总结

在这篇文章中,我们简要介绍了String类的两种方法。equals()方法仅比较String类型的实例,而contentEquals()方法可以比较CharSequence接口的任何实现。

总结来说,当我们只关心对象的内容时,应使用contentEquals()方法。而在某些情况下,检查对象的类型可能很重要,这时应使用equals()方法,它提供了更严格的检查条件。

如往常一样,代码片段可以在GitHub上找到。