gpt4 book ai didi

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

转载 作者:搜寻专家 更新时间:2023-11-01 01:24:41 25 4
gpt4 key购买 nike

我正在尝试为 HashMap 创建自定义对象,并为 hashcodeequals 方法编写了代码。在 HashMap 中添加对象时,equals 方法为真且 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}

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

最佳答案

这里有两个问题:

  1. 你应该实现 equals(Object) ( Javadoc )
  2. 而不是实现 equals(B)
  3. 它需要是 hashCode() 而不是 hashcode() ( Javadoc )

一个可行的实现可能如下所示:

class B {
String name;
int id;

public B(String name, int id) {
this.name = name;
this.id = id;
}

@Override
public int hashCode() {
return this.id;
}

@Override
public boolean equals(Object obj) {
if (this == obj) {
return true;
}
if (obj == null) {
return false;
}
if (getClass() != obj.getClass()) {
return false;
}
B other = (B) obj;
if (id != other.id) {
return false;
}
if (name == null) {
if (other.name != null) {
return false;
}
} else if (!name.equals(other.name)) {
return false;
}
return true;
}

@Override
public String toString() {
return "name: " + name + " id: " + id;
}
}

作为一般建议,请确保指定 @Override 注释。然后,您的 IDE 和 Java 编译器 (javac) 可以帮助您发现这类问题。

关于java - HashMap 添加具有等于 true 和相同哈希码的对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51890030/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com