Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/334.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:使用toString().equals()vs.equals()_Java_Equals_Tostring_Equality - Fatal编程技术网

Java:使用toString().equals()vs.equals()

Java:使用toString().equals()vs.equals(),java,equals,tostring,equality,Java,Equals,Tostring,Equality,这是一个理论问题。我有一个自己设计的对象,包含一系列变量、方法等。我重写了toString方法,主要用于日志记录,以返回变量的值。在我看来,比较这个对象实例的最简单、最直接的方法是比较从toString方法返回的内容。例如,equals方法可能看起来像 public boolean equals(MyObject instance) { return toString().equals(instance.toString()); } 有没有理由不这样做 避免这种模式的一个原因是速度:为了

这是一个理论问题。我有一个自己设计的对象,包含一系列变量、方法等。我重写了toString方法,主要用于日志记录,以返回变量的值。在我看来,比较这个对象实例的最简单、最直接的方法是比较从toString方法返回的内容。例如,equals方法可能看起来像

public boolean equals(MyObject instance)
{
   return toString().equals(instance.toString());
}

有没有理由不这样做

避免这种模式的一个原因是速度:为了使用
toString()
比较是否相等,您必须执行以下操作:

  • 为对象创建一个临时的
    字符串
    对象
  • 为对象实例创建一个临时的
    字符串
    对象
  • 将第一个
    字符串
    与第二个
    字符串
    逐个字符进行比较
  • 使临时字符串可用于垃圾检测

如果您直接进行比较,则可以跳过大部分内容。例如,直接比较
int
s需要比较4个字节,而比较它们的字符串表示最多需要比较9个字节。其他数据类型也会出现类似的情况。

有一些性能方面的原因不满足您的要求,dasblinkenlight对此进行了简要总结

避免这种模式的另一个重要原因与
toString()
方法的一般契约有关。类对象的所有可重写方法都有一个通用约定。由于这些方法由Java中定义的每个类继承,而且在许多自定义类中它们通常被重写,因此了解并遵守它们的一般约定非常重要

toString()
的一般约定是最简单的对象方法:

返回对象的字符串表示形式。总的来说 toString方法返回一个字符串,该字符串“以文本形式表示”此 对象结果应该是简洁但信息丰富的表示 这对一个人来说很容易阅读。建议所有 子类重写此方法

不要求toString()返回的字符串符合特定格式,也不要求您必须指定作为API一部分返回的字符串的格式

正因为如此,toString()返回的对象的字符串表示形式通常是一种实现细节,可以从类的一个版本自由更改到下一个版本。更改由
toString()
返回的字符串表示形式可能会导致程序失败,如果您将它们作为相等比较的基础

不将equals比较建立在
toString()
方法基础上的另一个原因是,这样做并不能为类提供所需的基础结构,以便它可以与Java集合框架一起使用。Java集合类中存储的对象需要格式良好的
equals()
hashCode()
方法才能正常工作:

  • 如果您正在编写的类有可能被用于任何Java集合框架类和/或被其他程序员使用,那么编写格式良好的
    equals()
    hashCode()
    方法是值得的

  • 由于任何格式合理的
    equals()
    方法的性能都将超过基于
    toString()
    的字符串比较的性能。。。而且由于许多类无论如何都应该有一个格式良好的equals()方法。。。您也可以继续使用自定义的
    equals()
    方法


您必须确保您的
toString()
方法是内射的。小心<代码>等于(MyObject)不会覆盖
等于(Object)
!实际上,字符串比较本身可能很快,特别是对于不匹配的对象,因为它在第一个不匹配的字符处停止,或者如果长度不匹配,甚至根本不看字符。然而,通常被低估的是
int
String
的转换有多昂贵。它使比较变得无关紧要,不管是4、9还是20字节…