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
。