gpt4 book ai didi

java - 使用 hashmap 并获取新创建的对象时,Java 中的 hashCode 重写返回 null

转载 作者:行者123 更新时间:2023-11-29 06:26:15 25 4
gpt4 key购买 nike

我目前正在通过 MOOC 学习 Java 的哈希码,并遵循了他们的教程。但是,当 hashmap 中显然有一个值时,预期输出返回 null。我的覆盖代码如下:


public class Plate{
private final String regCode;
private final String country;

// Counstructors
...

// accessors... only showing name for less clutter
getCode()
getCountry()

@Override // toString
public String toString(){
return country + " " + regCode;
}

@Override // equals
public boolean equals(Object obj){
if(obj == null){
return false;
}

if(getClass() != obj.getClass()){
return false;
}

Plate cmp = (Plate) obj;

if(this.country.equals(cmp.getCountry())){
return false;
}

if(this.regCode == null || this.regCode.equals(cmp.getCode())){
return false;
}

return true;
}

///////////////////////////////////// Below code may be the problem ///////////////////////////////////
@Override // hashCode
public int hashCode(){
if(this.country == null || this.regCode == null){
return 7;
}

return this.country.hashCode() + this.regCode.hashCode();

}
}

我使用上面代码的主要功能是:

import java.util.ArrayList;
import java.util.HashMap;

public class Regi{
public static void main(String[] args){
Plate reg1 = new Plate("FI", "ABC-123");
Plate reg2 = new Plate("FI", "UXE-465");
Plate reg3 = new Plate("D", "B WQ-431");

ArrayList<Plate> finnish = new ArrayList<Plate>();
finnish.add(reg1);
finnish.add(reg2);

Plate newPlate = new Plate("FI", "ABC-123");
if(!finnish.contains(newPlate)){
finnish.add(newPlate);
}
System.out.println("Finnish " + finnish);


// where unexpected result occur
HashMap<Plate, String> owners = new HashMap<Plate, String>();
owners.put(reg1, "Arto");
owners.put(reg3, "Jurgen");

System.out.println("Owners:");
System.out.println(owners.get(reg1));
System.out.println(owners.get(new Plate("FI", "ABC-123")));
System.out.println(owners.get(new Plate("D", "B WQ-431")));

}
}

预期的输出是:

enter image description here

但是每当我运行 System.out.println(owners.get(new Plate("FI", "ABC-123") ));System.out.println(owners.get(new Plate("D", "B WQ-431"))));。我不确定我的自定义 hashCode 函数有什么问题,因为我能够打印出我的 countryregCode 的 hashCode 并且它们都给出了数值。我还引用了其他人关于使用素数的哈希码的帖子,但它仍然显示为空。我想知道是否有人可以指出有关 hashCode 的正确方向。

最佳答案

您的代码不起作用,因为您生成了 equals返回 false当两个对象具有相同country .或者相同 regCode :

if(this.country.equals(cmp.getCountry())){
return false;
}

if(this.regCode == null || this.regCode.equals(cmp.getCode())){
return false;
}

你错过了 ! (非)运算符:

if (! this.country.equals(cmp.getCountry())) {
return false;
}

if (this.regCode == null || ! this.regCode.equals(cmp.getCode())) {
return false;
}

此外,您的 hashCode()实现意味着 country可以是null ,所以你错过了空检查:

if (this.country == null || ! this.country.equals(cmp.getCountry())) {
return false;
}

关于java - 使用 hashmap 并获取新创建的对象时,Java 中的 hashCode 重写返回 null,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58517235/

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