java - 包装对象和平等

标签 java

为什么如果我在两个包装对象上运行 .equals 方法,它将根据下面的 WrapperEqualsEquals 类返回 true 但是(我强调但是)为什么我们需要重写下面 Blob 类中的 equals 方法,使其返回 true。基本上,为什么包装器对象必须重写 .equals 方法?

    class WrapperEqualsEquals
    {
       public static void main(String []args)
       {
         Integer one=new Integer(1);
         Integer oneB=new Integer(1);

         System.out.println(one == oneB);
         System.out.println(one.equals(oneB));

       }    

}

    class OverrideEquals
    {
      public static void main (String [] args)
      {
        Blob a= new Blob(1,"a");
        Blob b= new Blob(1,"a");



        System.out.println(a==b);
        System.out.println(a.equals(b));

       }

}

    class Blob
    {
      int blobNumber;
      String blobText;

      Blob(int blobNumber,String blobText)
      {
       this.blobNumber=blobNumber;
       this.blobText=blobText;
      }

          //"overriding" the 'equals' method

          public boolean equals (Object o)
      {

            if (o instanceof Blob)
    {
        Blob o2=(Blob)o;
        return ((o2.blobNumber==this.blobNumber) &&(o2.blobText==this.blobText))?
                    true:false;
    }

            else
    {
        return false;
    }
}

}

最佳答案

默认情况下,仅当隐式参数和显式参数的哈希码相等时,Object#equals(Object) 才返回 true。因为您创建了两个单独的 Blob 对象,所以它们不会指向相同的引用(根据 hashCode()),因此使它们不相等,除非 .equals 方法被重写。但是,根据 Java 约定,只有当两个对象的哈希码相等时,.equals 才应返回 true,因此您可能还希望重写 hashCode。这也将保留内存使用。

关于java - 包装对象和平等,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10588588/

相关文章:

java - 如何在 JavaDoc 中显示示例代码,而无需手动复制/粘贴?

java - 为什么我的 Swing 窗口会在几秒钟后自行关闭?

java - 为什么属性更改监听器而不是可观察的

java - Dagger 2 的可交换模块

java - 我应该将序列化对象放在 Java 程序中的什么位置?

java - Mule ConsumerIterator 中缺少记录

java - 如何同步两个版本的 NetBeans?

java - 如何使数字结果不带小数

java - 在 Mysql 中分发 Java 应用程序

java - 未收到 PathChildrenCache 上的删除事件