繁体   English   中英

等于方法覆盖问题

[英]equals method override issue

我是Java的新手。 我为Animal类重写了equalshashcode 我希望使用HashSet<Animal>如下所示,仅将一个Animal插入HashSet 但是,尽管具有相同的属性,第二个Animal对象却被添加到集合中。 有人可以调查吗?

import java.util.*;

class SetTest
{    
    public static void main(String [] args)
    {
      Set<Animal>s=new HashSet<Animal>();
      Animal a=new Animal(2);
      boolean b1=s.add(a);
      System.out.println("hi "+b1);

      Animal b=new Animal(2);
      boolean b2=s.add(b);
      System.out.println("hi "+b2);    
    }
}


class Animal
{
    int t;
    Animal(int a)
    {
        t=a;       
    }

    public boolean equals(Object O)
    {
        if(O instanceof Animal && ((Animal)O).t==t)
            return true;

        return false;
    }

    public int hashcode()
    {   
        return t; 
    }
}

输出:hi true hi true

非常感谢。

您没有覆盖hashCode() 您介绍了另一个称为hashcode()方法。 案件很重要。

当您打算重写方法时,请始终使用@Override批注:

@Override
public int hashcode()

如果您这样做了,编译器会注意到错字,并拒绝编译该类。

您的代码的哈希码类型错误:写hashCode而不是hashcode。

import java.util.*;
class SetTest { 
  public static void main(String [] args) { 
    Set<Animal>s=new HashSet<Animal>();
   Animal a=new Animal(2);
    boolean b1=s.add(a);
    System.out.println("hi "+b1);
     Animal b=new Animal(2);
    boolean b2=s.add(b);
     System.out.println("hi "+b2); 
  } 
}

class Animal { 
  int t;

  public Animal(int a) {
      t=a;
  }

  @Override
  public boolean equals(Object O) {
    return O instanceof Animal 
            && ((Animal)O).t==t;
  }

   @Override
   public int hashCode() { 
     return t;
  }
}

如果您使用的是eclipse,则可以使用源代码生成器,并在其中避免常见的人为错误(就像您在此处所做的那样。在类->源->生成哈希码和equals方法上单击鼠标右键。弹出窗口,您可以在其中选择相等(对象相等)和哈希码生成时需要考虑的字段。

Java使用hashCode和equals方法检查两个对象是否相等。 HashSet在内部使用HashMap。 您可以参考HashMap.put(K key,V value)方法以获取更多详细信息。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM