equals(...)和equalsIgnoreCase(...)

时间:2010-03-20 12:46:07

标签: java

为什么我们将equals()equalsIgnoreCase()作为两种不同的方法,当equals()可能已经重载了一个特殊的ignoreCase参数以提供equalsIgnoreCase()功能时?

6 个答案:

答案 0 :(得分:17)

方法equals()继承自Object,因此不应更改其签名。 equals()通常可以在不实际知道对象的具体类的情况下使用,例如迭代对象集合时(特别是在Java 5泛型之前)。那么,如果不首先将对象向下转换为equals(),您甚至不会看到其他String

这是来自Java创建者的设计选择,使得使用equals()的习惯用法对所有对象使用完全相同的方式。

此外,IMO

if (string1.equalsIgnoreCase(string2)) ...

更具可读性,因此比

更不容易出错
if (string1.equals(string2, true)) ...

当然,在您自己的课程中,您可以自由添加具有不同签名的equals()(在标准equals()之上)。

答案 1 :(得分:5)

equalIgnoreCase()用于忽略String的区分大小写。但equals()仅返回true,而string

的情况相同

前,

String value="java";
if(value.equals("JAva")
{
    System.out.println("Return True");
}
else
{
    System.out.println("Return False");
}

Ans:返回False

但另一个是,

if(value.equalIgnoreCase("JAva")
{
    System.out.println("Return True");
}
else
{
    System.out.println("Return False");
}

Ans:返回True

答案 2 :(得分:2)

完全可以按照你的建议行事,但语言设计师选择采用其他方式,因此我们equalsIgnoreCase(otherString)而不是说equals(otherString, StringConstants.IGNORE_CASE)equals(otherString, true)

答案 3 :(得分:1)

因为equals()方法是从Object继承的。

如果他们按照你的建议做了,那么我们会有这样的事情:

public final class String {

    public boolean equals () { ... }

    public boolean equals (boolean ignoreCase) { ... }

} 

如果没有阅读文档,就无法理解equals()(没有参数)的方法。

答案 4 :(得分:1)

使用其他参数覆盖方法时的主要测试是,我希望任何方法覆盖与覆盖它的方法完全相同。从Object派生的Equals()有一个必须遵循的契约。两个相等的对象()应该具有相同的哈希码。我不认为两个不区分大小写的对象应该具有相同的哈希码,所以我认为在这里覆盖相等是错误的。

答案 5 :(得分:0)

我认为他们只选择了其中一种替代品。 .NET选择了另一个。 StringComparison.InvariantCultureIgnoreCase等。

你的建议绝对是什么,[甚至更好的] .NET实现对不同文化等更灵活。事实上,我甚至不知道他们在这种忽略情况下使用了什么文化。我猜当前的文化。