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

时间:2015-07-27 00:24:58

标签: java equals tostring equality

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

function initialize2() 
  {
  var myLatLng = new google.maps.LatLng($lat,$lon);
  var mapOptions = {
    zoom: 17,
    center: myLatLng,
    mapTypeId: google.maps.MapTypeId.SATELLITE 
  };

有没有理由不这样做?

2 个答案:

答案 0 :(得分:5)

避免这种模式的一个原因是速度:为了使用toString()来比较相等性,你必须这样做:

  • 为对象String
  • 创建临时this对象
  • 为对象String
  • 创建临时instance对象
  • 按字符
  • 比较第一个String到第二个String字符
  • 使临时字符串可用于垃圾检测

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

答案 1 :(得分:3)

由于性能原因没有按照dasblinkenlight简要概括的那样做你所要求的。

避免这种模式的另一个重要原因与toString()方法的一般合同有关。类Object的所有可重写方法都有一个常规契约。因为这些方法是由您在Java中定义的每个类继承的,并且因为它们在许多自定义类中经常被覆盖,所以了解并遵守它们的一般契约非常重要。

toString()的一般合约是最简单的Object方法:

  

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

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

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

不基于等同于toString()方法的比较的另一个原因是,这样做不会为您的类提供所需的基础结构,以便它可以与Java Collections Framework一起使用。 Java Collections类需要格式良好的equals()hashCode()方法来存储在其中的对象才能正常工作:

  • 如果你正在编写的类有可能在任何Java Collections Framework类中使用和/或它可能被另一个程序员使用,那么编写格式良好的代价是值得的。 equals()hashCode()方法。

  • 由于任何格式合理的equals()方法的性能都会超过基于toString()的字符串比较的性能......并且因为许多类应该具有格式良好的等号()方法无论如何......你也可以继续使用自定义equals()方法。