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
。这意味着可以比较String
、StringBuffer
、StringBuilder
、CharBuffer
或Segment
等。
其签名如下:
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上找到。