gpt4 book ai didi

java - 无法从 Hashmap 获取对象的值,即使它返回相同的哈希码

转载 作者:塔克拉玛干 更新时间:2023-11-01 22:06:39 24 4
gpt4 key购买 nike

enter image description here//覆盖hashcode后无法获取hashmap中对象的值//这是我根据项目名称生成hascode的项目类

 public class Item {
private String name;
private Long id;
private double price;
//Constructor
public Item(String name, Long id, double price) {
this.name = name;
this.id = id;
this.price = price;
}

public String getName() {
return name;
}

public void setName(String name) {
this.name = name;
}

public Long getId() {
return id;
}

public void setId(Long id) {
this.id = id;
}

public double getPrice() {
return price;
}

public void setPrice(double price) {
this.price = price;
}
//Generating hashcode based on name comparing if item id are //same
@Override
public int hashCode() {
return name.hashCode();
}
@Override
public boolean equals(Object obj) {
return ((Item) obj).id ==(id);
}

@Override
public String toString() {
return "Item {" +
" name='" + name + '\'' +
", id=" + id +
", price=" + price +
'}';
}
//Here there are items but when i pass the exact same item with exact //credentials i get null while checking how many items are there using Hashmap.
public class Warehouse {
Map<Item, Integer> itemList = new HashMap<>();
List<Drone> drones = new ArrayList<>();
private Drone drone;
private String sourceAddress;
private Address address;

public Warehouse(Address address) {
this.address = address;
Item item = new Item("PlayStation 4 pro", (long) 100, 42000);
Item item1 = new Item("X box one S", (long) 200, 40000);
Item item2 = new Item("Apple Macbook Pro", (long) 500, 82000);
Item item3 = new Item("Dell Xps Laptop", (long) 1000, 92000);
Item item4 = new Item("iPhone 7 plus", (long) 2000, 72000);

itemList.put(item, 10);
itemList.put(item1, 20);
itemList.put(item2, 40);
itemList.put(item3, 50);
itemList.put(item4, 20);

}

public Drone getDrone() {
return new Drone();
}

public void setDrone(Drone drone) {
this.drone = drone;
System.out.println("Drone # " + drone.getDroneID() + " has arrived at the warehouse " + address);
}

public Address getAddress() {
return address;
}


public ArrayList<Item> getItemList() {
return (ArrayList<Item>) itemList;
}
//Setting the item
public void setItem(Item item) {
Integer num = itemList.get(item);
if (num == null) {
num = 0;
}
this.itemList.put(item, ++num);

}

//这就是我面临的问题,如果我查询 hashmap 以获取相同的项目,它会返回 null,Item 甚至会返回相同的哈希码

                    public Item removeItem(Item item) {
Integer num = itemList.get(item);
//## Issue is i get null in num
if(null!= num||num!=0 ){
itemList.put(item,num-1);
}
System.out.println(item);
return item;
}

}

最佳答案

您的对象的 hashCode 使用了 name 属性,但是您的 equals 使用了 id 属性。这违反了契约(Contract)。 equals 返回 true 的对象必须具有相同的 hashCode

HashMap 同时使用 hashCodeequals 来定位键。首先,它根据 hashCodeHashMap 中定位一个 bin。然后它使用 equals 遍历 bin 中的所有条目以找到您要查找的 key 。当 hashCode 不匹配 equals 时,您认为相等的两个对象可能会映射到不同的容器,因此使用 map.contains(key) 查找存储在 Map 中的 key 将失败。

我认为使用 id 作为平等的标准会更有意义,所以我会写:

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

@Override
public boolean equals(Object obj) {
if (this == obj)
return true;
if (!(obj instanceof Item))
return false;
return ((Item) obj).id.equals(id);
}

请注意,我使用 equals 来比较 id。将对象与 == 进行比较(在您的情况下为 Long)通常是错误的。

此外,您可能希望通过在将 obj 转换为 Item 之前检查其类型并返回如果类型不匹配则返回 false。

附言根据您的新代码,您还有另一个问题:

这个条件:

if(null!= num||num!=0  )

将为真(如果 num != null)或抛出一个 NullPointerException(如果 numnull >).

因此它只会将 item 放入 Map 中,前提是它已经在 Map 中。不清楚所需的逻辑是什么,但看起来不对。

关于java - 无法从 Hashmap 获取对象的值,即使它返回相同的哈希码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44195381/

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