我无法找到这个问题的确切答案,所以我只是想问问自己。
我有一个Map<Integer, State> states;
,其中包含有关特定日期的信息。每天当天的信息都保存在Map<Integer, DayLog> dayLog;
中,其中DayLog包含已保存的Map<Integer, State> states;
。
问题是,当我更改实时states
时,states
中所有已保存的dayLog
也会因创建的引用而发生更改,而不是新创建的信息。
如何将信息保存在新地图中,而不仅仅是创建参考?
希望这是可以理解的。 提前致谢! :)
答案 0 :(得分:3)
创建DayLog时需要进行深层复制:
/**
* Create a new DayLog object with the current set of states.
* This constructor will make a deep copy of the states so they cannot be
* changed later outside of this log.
* @param currentStates the states as they exist right now
*/
public DayLog(Map<Integer, State> currentStates) {
this.states = new HashMap<>();
for(Integer key : currentStates.keySet()) {
State state = currentStates.get(key);
State newState = new State(state); // assuming copy constructor
this.states.put(key, newState);
}
}
可能有多种方法可以实现这一目标(克隆,使用state.archive()
方法或其他方法)但这将是基本方法 - 创建状态的映射,因为它们现在存在并且不会引用实时数据。
或者,使用数据库 - 它非常擅长存储数据。
答案 1 :(得分:0)
如何在新地图中保存信息,而不仅仅是创建一个 参考
您可以使用构造函数创建HashMap
,该构造函数将Map
作为参数:
public HashMap(Map<? extends K, ? extends V> m)
来自Javadoc:
使用与指定Map相同的映射构造一个新的HashMap。
它会将所有元素都放在新的HashMap
。
然后清除最初的Map
:map.clear()
。
然后,当您在初始Map中添加元素时,它不会对刚刚创建的Map
产生副作用。