如何创建HashMap对象副本,修改副本不影响原对象值?
如何创建不影响原对象的HashMap副本?
兄弟,你踩了Java里引用赋值的经典坑!你写的OfferLimitsForCalculations = productOfferLimitsForCart;根本不是创建新副本,只是让两个变量指向了同一个HashMap对象——相当于给同一个柜子贴了两张标签,不管通过哪张标签改柜子里的东西,另一个标签打开看到的自然也是修改后的状态。
给你几种简单靠谱的解决方案,针对你这个键值都是Integer(不可变类型)的场景,浅拷贝就完全够用:
使用HashMap的拷贝构造函数
这是最直接的方式,直接把原HashMap作为参数传入新HashMap的构造器,它会自动复制所有键值对到新对象里:HashMap<Integer, Integer> productOfferLimitsForCart = new HashMap<>(); productOfferLimitsForCart.put(Integer.valueOf(liveModel.getId()), 0); // 用拷贝构造器创建独立副本 HashMap<Integer, Integer> OfferLimitsForCalculations = new HashMap<>(productOfferLimitsForCart);使用
putAll()方法
如果已经提前创建了空的HashMap,用这个方法批量导入原Map的内容也能达到同样效果:HashMap<Integer, Integer> productOfferLimitsForCart = new HashMap<>(); productOfferLimitsForCart.put(Integer.valueOf(liveModel.getId()), 0); HashMap<Integer, Integer> OfferLimitsForCalculations = new HashMap<>(); // 把原Map的所有键值对复制到新Map OfferLimitsForCalculations.putAll(productOfferLimitsForCart);Java 8+ 可选:Stream API(适合复杂场景)
如果之后需要对复制的键值对做过滤、转换等操作,用Stream会更灵活,单纯拷贝的话前面两种更简洁:HashMap<Integer, Integer> OfferLimitsForCalculations = productOfferLimitsForCart.entrySet() .stream() .collect(Collectors.toMap( Map.Entry::getKey, Map.Entry::getValue, (existing, replacement) -> existing, // 处理键冲突的策略,这里保留原有的 HashMap::new ));
补充一句:如果你的HashMap里存的是自定义可变对象(比如自己写的User、Order类),那上面的浅拷贝就不够用了——因为拷贝的是对象引用,修改新Map里对象的内部属性,原Map里的对象也会跟着变。这时候就得手动实现深拷贝,比如遍历每个元素时创建对象的新实例并复制属性,不过你的场景里是Integer(不可变),完全不用操心这个~
内容的提问来源于stack exchange,提问作者user12426457
相关产品推荐
相关产品推荐

