Java 等于(…)和等于信号情况(…)
为什么我们有Java 等于(…)和等于信号情况(…),java,Java,为什么我们有equals()和equalsIgnoreCase()作为两种不同的方法,而equals()可以用一个特殊的ignoreCase参数重载,以提供equalsIgnoreCase()功能?,因为equals()方法是从对象继承的 如果他们按照你的建议去做,我们会有这样的结果: public final class String { public boolean equals () { ... } public boolean equals (boolean igno
equals()
和equalsIgnoreCase()
作为两种不同的方法,而equals()
可以用一个特殊的ignoreCase
参数重载,以提供equalsIgnoreCase()
功能?,因为equals()
方法是从对象继承的
如果他们按照你的建议去做,我们会有这样的结果:
public final class String {
public boolean equals () { ... }
public boolean equals (boolean ignoreCase) { ... }
}
如果不阅读文档,就不可能理解方法equals()
(没有参数的方法)的作用。方法equals()
是从对象继承的,因此不应更改其签名equals()
通常可以在不知道对象的具体类的情况下使用,例如在迭代对象集合时(尤其是在Java 5泛型之前)。因此,如果不先将对象向下转换为String
,您甚至不会看到另一个equals()
这是Java创建者的一个设计选择,目的是使使用equals()
的习惯用法对所有对象的使用方式完全相同
此外,海事组织
if (string1.equalsIgnoreCase(string2)) ...
更具可读性,因此比
if (string1.equals(string2, true)) ...
当然,在您自己的类中,您可以自由添加带有不同签名的equals()
(即在标准的equals()
之上)。完全可以按照您的建议执行,但语言设计者选择了另一种方式,因此我们有equalsIgnoreCase(其他字符串)
而不是说equals(otherString,StringConstants.IGNORE_CASE)
或equals(otherString,true)
equalIgnoreCase()
用于忽略我们的字符串的大小写敏感。但是equals()
只返回true
,而字符串的情况相同
前,
Ans:返回False
但另一个是,
if(value.equalIgnoreCase("JAva")
{
System.out.println("Return True");
}
else
{
System.out.println("Return False");
}
回答:返回True
我想他们只是选择了其中一个选项。NET选择了另一个。
StringComparison.InvariantCultureInogoreCase等
肯定是你的建议,而且[更好的是].NET实现对于不同的文化更灵活,等等。事实上,我甚至不知道他们在这种情况下使用什么文化。我猜是当前的文化。当使用附加参数重写方法时,主要的测试是,我希望任何方法重写都能做与其重写的方法完全相同的事情。从对象派生的Equals()具有它必须遵循的约定。两个相等()的对象应具有相同的哈希代码。我不认为两个不区分大小写的equal对象应该有相同的hashcode,所以我认为在这里重写equal是错误的
// Demonstrate equals() and equalsIgnoreCase().
class equalsDemo {
public static void main(String args[]) {
String s1 = "Hello";
String s2 = "Hello";
String s3 = "Good-bye";
String s4 = "HELLO";
System.out.println(s1 + " equals " + s2 + " -> " +
s1.equals(s2));
System.out.println(s1 + " equals " + s3 + " -> " +
s1.equals(s3));
System.out.println(s1 + " equals " + s4 + " -> " +
s1.equals(s4));
System.out.println(s1 + " equalsIgnoreCase " + s4 + " -> " +
s1.equalsIgnoreCase(s4));
}
}
程序的输出如下所示:
Hello equals Hello -> true
Hello equals Good-bye -> false
Hello equals HELLO -> false
Hello equalsIgnoreCase HELLO -> true
这是一种非常常见的API模式。第一种形式为参数使用默认值。如果不阅读文档就无法判断默认值是什么,那么您可以阅读文档。好的,java.lang.String
有几个构造函数,其中许多是其他构造函数的更简单版本,并且在调用它们时提供默认值。如果不查看javadoc,行为就不明显。@skaffman:例如,您知道,布尔值不是整数,因此只有两个值:true
或false
。如果我们有默认值false
,那么使用另一种方法的唯一原因是将true
作为参数传递。如果它总是正确的,那么从API设计的角度来看,最好使用有意义的名称(即equalsIgnoreCase)创建单独的方法。是的,这种方法给了我们较少的灵活性,但当我们需要从外部获取ignoreCase
的值时,这种情况很少见。通常它是由一些业务逻辑规则预定义的。在发布答案之前,请阅读并理解该问题。但我也看到了其他实现,如compareTo()
和compareTignoreCase()
,它们本身与对象
类没有联系。@Vaibhav一个好的API设计与命名(以及其他)是一致的。如果执行类似操作的方法是根据类似的模式命名的,那么API更易于学习和使用,这也减少了出错的机会。此外,我上面的可读性参数适用于compareTignoreCase()
以及equalsIgnoreCase()
。
Hello equals Hello -> true
Hello equals Good-bye -> false
Hello equals HELLO -> false
Hello equalsIgnoreCase HELLO -> true