Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/317.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 等于(…)和等于信号情况(…)_Java - Fatal编程技术网

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