为什么我们将equals()
和equalsIgnoreCase()
作为两种不同的方法,当equals()
可能已经重载了一个特殊的ignoreCase
参数以提供equalsIgnoreCase()
功能时?
答案 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实现对不同文化等更灵活。事实上,我甚至不知道他们在这种忽略情况下使用了什么文化。我猜当前的文化。