HashMap 添加具有等于 true 和相同哈希码的对象

我正在尝试HashMap为hashcode和equals方法创建自定义对象并编写代码。在 中添加对象时HashMap,equalsmethod 为 true 并且hashcode为两个对象返回相同的值,但HashMap将两个对象添加为不同的对象。这怎么可能?下面是我的代码:


class B {

    String name;

    int id;


    public B(String name, int id)

    {

        this.name=name;

        this.id=id;

    }


    public boolean equals(B b){

        if(this==b)

            return true;

        if(b==null)

            return false;

        if(this.name.equals(b.name) && this.id==b.id)

            return true;

        else

            return false;

    }


    public int hashcode(){

        return this.id;

    }


    public String toString(){

        return "name: "+name+" id: "+id;

    }

}

为了测试上面的代码,我在主类中添加了以下内容:


HashMap<B,String> sample=new HashMap<>();

B b1 = new B("Volga",1);

B b2 = new B("Volga",1);

System.out.println(b1.equals(b2));

System.out.println(b1.hashcode()+"    "+b2.hashcode());

sample.put(b1, "wrog");

sample.put(b2,"wrog");

System.out.println(sample);

这将产生以下输出:


true

1    1

{name: Volga id: 1=wrog, name: Volga id: 1=wrog}

有人可以解释为什么会这样吗?


撒科打诨
浏览 142回答 3
3回答

慕妹3146593

您必须覆盖equals(Object)&hashCode()方法而不是equals(B b)& hashcode()。尝试实现具有以下签名的方法,它应该可以工作:@Overridepublic boolean equals(Object o){...}@Overridepublic int hashCode() {...}您还可以使用 IDE 的自动生成功能来生成这些方法。这样,就没有出错的机会。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Java