我不明白我的数据是如何在所有三个地图中更新的?
public void updateMap(Map<String, WagonFinalInfo> map, String wagons, String rates, String tariffs) {
List<WagonRateAndTariff> listRateAndTariff = PrepareDateForInsert.fillListForUpdate(wagons, rates, tariffs);
Map<String, WagonFinalInfo> oldMap = new HashMap<>(map);
Map<String, WagonFinalInfo> tempNewMap = new HashMap<>(map);
logger.debug("listRateAndTariff: {}", listRateAndTariff);
for (Map.Entry<String, WagonFinalInfo> _map: tempNewMap.entrySet()) {
for (WagonRateAndTariff list : listRateAndTariff) {
if (_map.getKey().equals(list.getNumberOfWagon())) {
if (_map.getValue().getRate() != (Double) list.getRate()) {
_map.getValue().setRate(list.getRate());
}
if (_map.getValue().getTariff() != (Double) list.getTariff()) {
_map.getValue().setTariff(list.getTariff());
}
}
}
}
newMapWagonFinalInfo.putAll(tempNewMap);
logger.info("newMapWagonFinalInfo: {}, oldMap: {}", newMapWagonFinalInfo, oldMap);
classHandlerInsertRateOrTariff.insertDate(newMapWagonFinalInfo, oldMap);
calculateYield(newMapWagonFinalInfo);
}
他们像 in 一样更新它tempNewMap,但是在输出中我得到了 inmap和 in 的更新oldMap,这不应该是。这是怎么发生的?
因为集合存储对对象的引用,而不是对象本身。如果您正在创建两个视图
将对象添加到第一个
然后“复制”到第二个
那么堆上只剩下一个对象,并且对该对象的引用被添加到第二个映射中。为避免这种情况,您需要执行深拷贝,即在堆上创建一个新对象并将数据从旧对象传输到该对象。将对象的复制功能留给自己是一个很好的做法。这通常通过声明一个复制构造函数来完成:
然后在需要创建显示副本的代码位置
我怀疑在您的情况下,流不仅可用于创建深层副本,而且还可用于将使用二次算法的整个详细方法减少到几行,显着减少内存消耗和处理器周期。
不得不这样做
我从没想过我会遇到这种情况:)而且复制地图并不是那么容易的事实