Java集合中HashMap日常问题及解决办法

在这里插入图片描述
前言
  今天在学习Java中Session的时候,利用了Session可持久化保存服务器端的特性尝试做了一下用HashMap嵌套的购物车(没有将购物车的商品信息保存在数据库中),之所以做的这么麻烦是为了巩固之前学习的Map知识和锻炼逻辑能力,正好也在其中遇到了一个关于HashMap 的问题,在此做个小小的记录,方便日后查看。

问题
  服务器端保存购物车商品信息用的是HashMap嵌套,内层HashMap存放的是商品和该商品的数量,内层的HashMap中只存放一组键值对,外层HashMap存放的是商品和该商品总价,根据页面传过来的商品id在数据库中获取到商品的信息,。再遍历HashMap根据id判断是否已经存在该商品,再针对不同情况进行处理,所遇到的问题是购物车存在页面穿进来的该商品,那么我如果修改内层Map的Integer(数量),再修改外层HashMap的Value(该商品的总价),就会出现空指针异常,解决方案是先将商品总价保存起来,把内层HashMap从外层HashMap中remove掉,再修改商品数量,再将修改数量后的内层HashMap添加到外层HashMap中,代码如下:
  在这里插入图片描述
  在这里插入图片描述
  在这里插入图片描述
  在这里插入图片描述
  出错代码待添加
  //此处写的是Shop是因为数据表中给定的表名是shop
package model;/**

  • TODO
  • @Author Whyat
  • @Date 2019/1/9 17:10
    /
    public class Shop {
    private int sid,price;
    private String code,name,type; public Shop() {
    } public Shop(int price, String code, String name, String type) {
    this.price = price;
    this.code = code;
    this.name = name;
    this.type = type;
    } public Shop(int sid, int price, String code, String name, String type) {
    this.sid = sid;
    this.price = price;
    this.code = code;
    this.name = name;
    this.type = type;
    } public int getSid() {
    return sid;
    } public Shop setSid(int sid) {
    this.sid = sid;
    return this;
    } public int getPrice() {
    return price;
    } public Shop setPrice(int price) {
    this.price = price;
    return this;
    } public String getCode() {
    return code;
    } public Shop setCode(String code) {
    this.code = code;
    return this;
    } public String getName() {
    return name;
    } public Shop setName(String name) {
    this.name = name;
    return this;
    } public String getType() {
    return type;
    } public Shop setType(String type) {
    this.type = type;
    return this;
    } @Override
    public String toString() {
    return “Shop{” +
    “sid=” + sid +
    “, price=” + price +
    “, code=’” + code + ‘’’ +
    “, name=’” + name + ‘’’ +
    “, type=’” + type + ‘’’ +
    ‘}’;
    }
    }
    结论
      在Key嵌套HashMap的HashMap,如果修改已经存放的Key的内容时,再用修改后的外层Key去获取外层HashMap的Value,是会报空指针异常的。但是如果不是HashMap嵌套,这样做是不会出异常,以上结论仅根据做的简单的测试得出的,如有错误,望不吝赐教。
    package servlet;import model.Good;
    import model.Shop;import java.util.HashMap;
    import java.util.Map;
    import java.util.Set;/
    *
  • TODO
  • @Author Whyat
  • @Date 2019/1/10 22:05
    /
    public class test {
    public static void main(String[] args) {
    //test1();
    test2();
    } /
    *
    • 修改map外面的key的内容内层的key的内容也会改变,
    • 再用修改后的key去获得之前的value是可以的,
    • 而且可以覆盖之前的键值对
      /
      private static void test1() {
      Map<Shop, Integer> map = new HashMap<>();
      Shop shop = new Shop(2, 3, “code”, “name”, “type”);
      map.put(shop, 3);
      shop.setSid(4);
      int i = map.get(shop);
      Set set = map.keySet();
      for (Shop shop1 : set) {
      System.out.println(shop1);
      }
      map.put(shop, 4);
      System.out.println("…");
      } /
      *
    • 修改外层的key,根据key获取外层的value会出现空指针异常
      */
      private static void test2() {
      Map<Map<Good,Integer>, Integer> bigMap = new HashMap<>();
      Map<Good,Integer> smallMap = new HashMap<>();
      Good good = new Good(1, “name”, “class”, 10, “code”); smallMap.put(good, 5);
      bigMap.put(smallMap, 100);
      //修改了内层小map的内容
      smallMap.put(good, 6);
      //大map再根据小map获取之前大map的value报空指针异常
      int i = bigMap.get(smallMap);
      bigMap.put(smallMap, i + 10);
      System.out.println("…");
      }
      }
      文章来自:https://www.itjmd.com/news/show-5342.html
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值