如果为特定键更新了值,则为所有键更新哈希图

时间:2019-04-25 03:03:30

标签: java hashmap

我有一个哈希图,键为整数,值作为日期列表。我正在尝试为特定整数更新值之一。最初,所有键的日期都相同。

现在,我想将日期之一设置为101键的null,当我更新特定键时,所有键的日期都将更新。我在哪里做错了?请提出建议。

这是我的代码

初始日期设置如下

   // Set dates to all records
   resultDate = [Mon Jan 01 00:00:00 IST 2018, Fri Dec 31 00:00:00 IST 9999] // Typo here 
   Set<Integer> records= parsedResults.keySet();
        if (records.size() > 0) {               
            for (Integer record: records) {
                dateMap.get(Integer.parseInt(record));
                dateMap.put(record,resultDate);
            }
        }

然后仅将101的更新结束日期作为null

for (Map.Entry<Integer, List<Date>> entry : dateMap.entrySet()) {
            if(entry.getKey().equals(Integer.parseInt("101"))) {
                List<Date> dates = entry.getValue();
                if(null == effDate) {
                    dates.set(0, null);
                } else {
                    dates.set(0, effDate);          
                }
                if(null == endDate) {
                    dates.set(1, null); 
                } else {
                    dates.set(1, endDate);
                }
                dateMap.put(Integer.parseInt("101"), dates);                                        
            }
        }

初始dateMap响应

{101=[Mon Jan 01 00:00:00 IST 2018, Fri Dec 31 00:00:00 IST 9999], 102=[Mon Jan 01 00:00:00 IST 2018, Fri Dec 31 00:00:00 IST 9999], 103=[Mon Jan 01 00:00:00 IST 2018, Fri Dec 31 00:00:00 IST 9999]}

当我更新为null之后,

{101=[Mon Jan 01 00:00:00 IST 2018, null], 102=[Mon Jan 01 00:00:00 IST 2018, null], 103=[Mon Jan 01 00:00:00 IST 2018, null]}

2 个答案:

答案 0 :(得分:2)

问题在于每个键都与同一个列表对象配对,在for循环中,每次使用new ArrayList(Collection<? extends E> c)构造函数创建新对象

if (records.size() > 0) {               
        for (Integer record: records) {
            dateMap.get(Integer.parseInt(record));  //you can remove this line
            dateMap.put(record,new ArrayList(resultDate));
        }
    }

公共ArrayList(集合c)

  

构造一个列表,该列表包含指定集合的​​元素(按集合的迭代器返回的顺序)。

答案 1 :(得分:0)

您的值可能使用一个带有diff别名的列表

List one = new AraayList();
map.put("k1", one);
map.put("k2", one);
List alias = one;
map.put("k3", alias);

这些值使用相同的实例,当您更新一个实例时,其他实例将查看更改。