Java:使用另一个Map的信息创建一个新Map,而不是创建一个引用

时间:2017-08-15 18:55:46

标签: java dictionary reference hashmap

我无法找到这个问题的确切答案,所以我只是想问问自己。

我有一个Map<Integer, State> states;,其中包含有关特定日期的信息。每天当天的信息都保存在Map<Integer, DayLog> dayLog;中,其中DayLog包含已保存的Map<Integer, State> states;

问题是,当我更改实时states时,states中所有已保存的dayLog也会因创建的引用而发生更改,而不是新创建的信息。

如何将信息保存在新地图中,而不仅仅是创建参考?

希望这是可以理解的。 提前致谢! :)

2 个答案:

答案 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

然后清除最初的Mapmap.clear()

然后,当您在初始Map中添加元素时,它不会对刚刚创建的Map产生副作用。