Session 从会话请求后更改了Hashmap值

Session 从会话请求后更改了Hashmap值,session,jakarta-ee,hashmap,Session,Jakarta Ee,Hashmap,我从事Java/HTML项目。我已经将hashmap设置为会话属性。我从会话请求hashmap,并将key/value放入其中 map.put(“一些字符串”,“1”) . 当第二次执行此操作时,我打印hashmap内容,唯一的值,即hashmap上最后一次操作后的“1”变为“-1” 在我看来,Hashmap是这个项目最好的数据结构。有人能帮忙吗 public class Cart { private HashMap<String, asd> list; publi

我从事Java/HTML项目。我已经将hashmap设置为会话属性。我从会话请求hashmap,并将key/value放入其中
map.put(“一些字符串”,“1”)
. 当第二次执行此操作时,我打印hashmap内容,唯一的值,即hashmap上最后一次操作后的“1”变为“-1”

在我看来,Hashmap是这个项目最好的数据结构。有人能帮忙吗

public class Cart {
    private HashMap<String, asd> list;

    public Cart(){
        list = new HashMap<String, asd>();
    }

    public HashMap<String, asd> getMap(){
        return list;
    }

    /*
     * Parameter: code
     *      -1: increase quantity by 1
     *      0: delete product from the product list
     *      else: set the product quantity to the passed value
     */
    public void alterProduct(int code, String product){
        if(list.containsKey(product)) {
            if(code == -1) plusOne(product);
            if(code == 0) remove(product);
            else setValue(product, code);
        }else {
            asd asd = new asd();
            asd.a = 1;
            list.put(product, asd);
        }
    }

    private void plusOne(String product){
        asd asd = list.get(product);
        asd.a = asd.a + 1;
        list.put(product, asd);
    }

    private void remove(String product){
        list.remove(product);
    }

    private void setValue(String product, int code){
        asd asd = new asd();
        asd.a = code;
        list.put(product, asd);
    }
}

class asd{
    int a;

    public String toString(){
        return ""+a;
    }
}
Servlet代码:

protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        // TODO Auto-generated method stub
        Cart cart = (Cart) request.getSession().getAttribute("cart");
        cart.alterProduct(-1, (String) request.getSession().getAttribute("name"));
        doGet(request, response);
    }

在我为相同的
(String)request.getSession().getAttribute(“name”)
第二次调用
alterProduct
后,相同键的hashmap值为“-1”。

产品的类型/值是什么?它是如何连接到“购物车”的

我猜会发生什么,你弄乱了数据类型。另一个选项是您在
Cart.toString()方法中有bug。我建议您将代码更改为“普通”数据类型并重新检查。如果失败,请使用Cart类而不进行混乱的转换,并调试代码

您在这里遇到了错误:

  public void alterProduct(int code, String product){
    if(list.containsKey(product)) {
      if(code == -1) plusOne(product);
      if(code == 0) remove(product);
      else setValue(product, code);
  }


  private void setValue(String product, int code){
    asd asd = new asd();
    asd.a = code;
    list.put(product, asd);
  }
考虑一下当您第二次调用
art.alterProduct(-1,“某物”)
时会发生什么。
list.containsKey(产品)
为真(您使用相同的产品),代码为-1

if(code==-1)plusOne(产品);
按预期执行

但是你有点奇怪

if(code==0)删除(产品);
else设置值(产品、代码);

code==0
的计算结果为false,因此调用else指令。您正在调用
setValue(product,-1)


如上所示,setValue将为您观察到的asd.a分配-1。

产品是字符串。Cart是一个初始化
map
的类。我将
HashMap
更改为
HashMap
类MyClass{int a;}
成功了。你能提供完整的代码吗?你如何创建\检索地图,如何填充地图?(facepalm)对我的问题感到尴尬
  public void alterProduct(int code, String product){
    if(list.containsKey(product)) {
      if(code == -1) plusOne(product);
      if(code == 0) remove(product);
      else setValue(product, code);
  }


  private void setValue(String product, int code){
    asd asd = new asd();
    asd.a = code;
    list.put(product, asd);
  }