gpt4 book ai didi

java - JSP中HashMap中的重复键

转载 作者:行者123 更新时间:2023-12-02 01:36:16 26 4
gpt4 key购买 nike

我正在创建一个 JSP 购物篮,我有一个名为 Basket 的类,它有一个 HashMap,其中以 Product 对象作为键,以 Integer 为值,这将是产品的数量。但是,当我将产品添加到购物篮时,该产品的数量不会增加,而是会再次添加到 map 中。产品的哈希码发生了变化,但我添加的产品是同一个对象,它们没有改变。我想了解这里发生了什么。

篮子类添加方法:

   public void addItem(String pid) {
addItem(db.getProduct(pid));
}

public void addItem(Product p) {
if (p != null) {
Integer quantity = items.get(p);
if (quantity == null){
quantity = 1;
System.out.println("first time adding");
}
else quantity++;

items.put(p, quantity);
System.out.println("added product: " + p + " with quantity of " + quantity);
}
}

篮子.JSP:

<%@ page import="shop.Product" %>
<%@ page import="java.util.HashMap" %>
<%@ page import="java.util.Map" %>
<jsp:useBean id='basket'
scope='session'
class='shop.Basket'
/>
<%
String empty = request.getParameter("emptyBasket");
if (empty != null) {
basket.clearBasket();
System.out.println("basket cleared");
}
String item = request.getParameter("addItem");
basket.addItem(item);
%>
<html>
<body>
<% HashMap<Product, Integer> items = basket.getItems();

for (Map.Entry<Product, Integer> p : items.entrySet()) {
System.out.println(p.getKey().hashCode() + " " + p.getValue());
}
%>

在 viewProduct.JSP 中我有一个包含

的链接
href="basket.jsp?addItem=<%=product.PID%>

进入购物篮页面。

所以我的主要问题是为什么 map 添加相同的键?

最佳答案

您可能需要在 Product 类中实现 hashCode 方法。

默认情况下,hashCode 实现返回对象在内存中的位置。对象的 hashCode 方法的结果是 HashMap 用于识别对象的结果。

在这种情况下,每次使用 db.getProduct(pid) 从数据库检索 Product 时,其在内存中的位置可能不同。

因此,HashMap 用于查找 Product 是否存在的调用是不同的,因此该对象被再次添加到 HashMap .

为了避免这种情况,应在 Product 中实现 hashCodeequals 方法。在您的情况下,使用诸如 ProductID (pid) 之类的独特内容是有意义的:

// Assuming pid is public
public int hashCode() {
return this.pid;
}

public equals(Object object) {
return this.pid == ((Product)object).pid;
}

有关如何实现更强大的 hashCode 的更多信息,请参阅 https://stackoverflow.com/a/113600/9129020

关于java - JSP中HashMap中的重复键,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55213110/

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