包装器对象和平等

时间:2012-05-14 17:58:39

标签: 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;
    }
}

}

1 个答案:

答案 0 :(得分:0)

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