Java HashMap值在“0”之后更改;获得;

Java HashMap值在“0”之后更改;获得;,java,Java,我有一个 private Map<String,List<ProductScheme>> discountMap = new HashMap<String,List<ProductScheme>>(); private-Map-discountMap=new-HashMap(); 现在,如果我从discountMap获取列表,并在列表中添加一个项目 我是否必须将该列表再次放入折扣地图,或者它将不需要???不,它不是必需的get返回对存储在地图中

我有一个

private Map<String,List<ProductScheme>> discountMap = new HashMap<String,List<ProductScheme>>();
private-Map-discountMap=new-HashMap();
现在,如果我从
discountMap
获取列表,并在列表中添加一个项目
我是否必须将该列表再次放入
折扣地图
,或者它将不需要???

不,它不是必需的
get
返回对存储在地图中的列表的引用。因此,无论您对使用
get
(添加、删除…)获得的列表做了什么修改,都会反映在地图中的列表上,因为它们是同一个对象。

您只需要添加一个以前不存在的列表。我使用的模式是

List<ProductScheme> list = discountMap.get(key);
if (list == null)
    discountMap.put(key, list = new ArrayList<>());
list.add(value);
List List=discountMap.get(键);
if(list==null)
put(key,list=newarraylist());
列表。添加(值);

由于您只从地图中获取列表的对象引用,因此无需将其再次放到地图中

List someList = discountMap.get("firstList");

仍然是相同的列表,只是另一个变量,用于存储指向对象的指针

否。无需再次将修改的对象添加到discountMap变量中。当您从映射调用get方法时,它只返回该特定对象的引用(对象地址),并且您正在使用上述对象引用修改映射中的该对象(实际上,即使在映射中,它也有对象引用。因此,我们使用其内存位置从两个位置引用同一对象)

这在我们使用对象的引用引用对象的所有情况下都是常见的


不,当你做一个
get
时,你会得到列表的引用,所以你对列表所做的任何更改都是问题中的同一个列表!我对我的低级Java感到生疏,很高兴有人用一种让我找到它的方式表达了他们的问题。如果(!discountMap.containsKey(key))@iccthedral使用
containsKey
可以有一个有效的
null
值,我会使用
。在这种情况下,
null
列表无效,您只需要使用
get
而不是
containsKey
get
(如果有),即查找次数翻倍;但它起到了安全网的作用
null
作为一个值,可能会在您不知道的情况下发生。@iccthedral它不是一个安全网,它是虚假的安全。你正在检查一些你并不关心的东西——是否有映射是无关紧要的。您应该检查空值以避免NPE,如上所述,使用
containsKey
无助于此,因此只会使您忽略更重要的空值检查。Null作为一个值发生在您不知道的情况下,这正是您应该检查Null而不是映射的原因。@iccthedral您可以使用
map.put(key,Null)
在这种情况下,键在映射中,但
map.get(key)
返回
Null
。如果您需要了解差异(这很少见)
containsKey
不能确保值不为
null
,则只需检查
containsKey