Java集合中HashMap日常问题及解决办法_hashmap本地没问题,服务器上不生效-程序员宅基地

技术标签: Java  Hashmap  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
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/a6984021/article/details/86286780

智能推荐

人生七年 全系列 英文版(中文字幕)-程序员宅基地

文章浏览阅读3.8k次。有很强的的教育意义, 希望大家多多观看, 教育孩子, 教育才是重点!!!!《人生七年》(英文原名《7 up》)由迈克尔·艾普特执导,Bruce Balden 、Jacqueline Bassett 、Symon Basterfield等出演的一部由ITV出品的纪录片。迈克尔·艾普特从1964年开始拍摄的纪录片系列的第一部。迈克尔·艾普特在1964年为英国BBC电视台拍摄了记录片《7 Up》,采...

CUDA从入门到精通(转载)-程序员宅基地

文章浏览阅读913次。CUDA从入门到精通(零):写在前面在老板的要求下,本博主从2012年上高性能计算课程开始接触CUDA编程,随后将该技术应用到了实际项目中,使处理程序加速超过1K,可见基于图形显示器的并行计算对于追求速度的应用来说无疑是一个理想的选择。还有不到一年毕业,怕是毕业后这些技术也就随毕业而去,准备这个暑假开辟一个CUDA专栏,从入门到精通,步步为营,顺便分享设计的一些经验教训,希望能_cuda从入门到精通

以太坊StateDB原理和流程说明-程序员宅基地

文章浏览阅读1.3w次,点赞4次,收藏9次。单位和全局变量以太币Ether单位以太币Ether单位之间的换算就是在数字后边加上wei、finney、szabo或ether来实现的,如果后面没有单位,缺省为 Wei。例如2ether==2000finney的逻辑判断值为true。时间单位秒是缺省时间单位,在时间单位之间,数字后面带有seconds、minutes、hours、days、w..._statedb

如果用seagull php框架开发一个类似zen cart,Oscommerce,magento这样的模块会什么样_seagull类似的-程序员宅基地

文章浏览阅读1.2k次。Os,zen cart的成功是为什么,是因为开源,是因为低端(使用需要小,易于使用,普通程序员可轻易学习),我想更多的是因为庞大市场的存在。尽管它们存在的诸多的问题,然而一个免费的系统,一个容易让程序员入手的程序加上市场给它带来了大量的用户。而magento(据说是小日本赞助的)正是看到了巨大的市场而推出的一个系统,然而商人终究是商人,它的复杂,尽管它真的很开放,很灵活,它的资源消耗让很多用户是又_seagull类似的

vb点名程序 随机点名不重复算法的实现 算法复杂度最优为O(n)_vb程序设计随机点名-程序员宅基地

文章浏览阅读4k次。vb点名程序,随机不重复,算法最优_vb程序设计随机点名

从spring boot 到 spring cloud- 2018/7/17 (1)_eclipse 搭建 spring cloud-程序员宅基地

文章浏览阅读286次。 学习spring cloud之前首先学习搭建spring boot框架 并且整合ssm框架,搭建一个demo使用eclipse 建立spring boot工程选择web 以及mybatiis/mysql工程结构如图所示建立models-》student.javapackage com.example.demo.models;public class Stude..._eclipse 搭建 spring cloud

随便推点

org.springframework.context.ApplicationContextException的解决办法-程序员宅基地

文章浏览阅读1.7w次,点赞9次,收藏11次。org.springframework.context.ApplicationContextException: Failed to start bean 'documentationPluginsBootstrapper的解决办法:在pom.xml中使用低版本的spring-boot-starter,例:使用2.1.7.RELEASE的spring-boot-starter配合2.9.2版本的swagger:<?xml version="1.0" encoding="UTF-8"?>&_org.springframework.context.applicationcontextexception: failed to start bea

EBGAN, LSGAN, BEGAN_began和ebgan-程序员宅基地

文章浏览阅读2.2k次。本文主要对EBGAN, LSGAN, BEGAN三个模型核心理论进行简单记录.引言  GAN的原理就是利用Discriminator作为Generator的引导,使得最终Generator生成的samples可以以假乱真,具体过程可以用下图表示.  上图来自李宏毅深度学习PPT中,蓝色线表示Generator distribution, 绿色线表示data distributi_began和ebgan

python实现排序算法_八种经典排序算法(python实现)-程序员宅基地

文章浏览阅读79次。分享八种经典排序算法的python代码。1.#冒泡排序def bubbleSort(nums):for i in range(len(nums) - 1):for j in range(len(nums) - i - 1):if nums[j] > nums[j + 1]:nums[j], nums[j + 1] = nums[j + 1], nums[j]return nums2.#选择排序de..._for i in range(len(nums) - 1)

用canvas 实现个图片三角化(LOW POLY)效果-程序员宅基地

文章浏览阅读72次。转载: 之前无意中看到Ovilia 用threejs做了个LOW POLY,也就是图片平面三角化的效果,觉得很惊艳,然后就自己花了点时间尝试了一下。   我是没怎么用过threejs,所以就直接用canvas的2d绘图API来做,因为感觉似乎这效果也用不上threejs。   直接上demo先:http://whxaxes.github.io/canvas-test/src/Funn..._canvas poly 绘图

输出所有大于平均值的数 (15分)_7-12 输出所有大于平均值的数 分数 15 作者 颜晖 单位 浙大城市学院 本题要求编写-程序员宅基地

文章浏览阅读9.1k次,点赞2次,收藏11次。输出所有大于平均值的数 (15分)本题要求编写程序,将输入的n个整数存入数组a中,然后计算这些数的平均值,再输出所有大于平均值的数。输入格式:输入在第1行中给出一个正整数n(1≤n≤10),第2行输入n个整数,其间以空格分隔。题目保证数据不超过长整型整数的范围。输出格式:输出在第1行给出平均值,保留2位小数。在第2行输出所有大于平均值的数,每个数的后面有一个空格;如果没有满足条件的数,则输出空行。如果输入的n不在有效范围内,则在一行中输出"Invalid."。输入样例1:1055 23 8_7-12 输出所有大于平均值的数 分数 15 作者 颜晖 单位 浙大城市学院 本题要求编写

永久WordPress管理员注意事项:第4部分-程序员宅基地

文章浏览阅读227次。到目前为止,在本系列文章中,我们已经介绍了两种消除永久WordPress管理员通知的方法。 我们将在本教程系列的第四部分也是最后一部分的基础上,通过研究两种更具体的方法来永久解除管理员通知,以此为基础。 我们将通过展示如何创建自己的自定义管理员通知类型以及添加装饰(例如图标)来解决问题。 粘性管理员通知 我们已经知道如何显示可以被撤消的管理员通知。 我们要做的就是将is-dismissi...

推荐文章

热门文章

相关标签