private static Map<Integer, String> choices = new HashMap<Integer, String>(3);
// choices get populated here
将Map中的元素克隆到不同结构的最简单方法是什么。
答案 0 :(得分:2)
对于你的情况,因为整数和字符串是不可变的,你可以做Mark所说的。这是有效的,因为一旦创建了整数/字符串,就无法修改它们。
在一般情况下,如果您没有不可变对象,则需要非常清楚地了解您要执行的操作。有两种可能性,每种可能会产生截然不同的后果。
首先,您要创建一个新Map,其中包含对第一个Map中对象的等效引用。如果你走这条路线,两个地图都将包含指向相同基础对象的引用。即,如果从一个Map中拉出一个对象并对其进行修改,则更改将反映在另一个集合中,因为两个Maps都包含对相同对象的引用。如果你想走这条路,@ Mark提供了一个很好的答案。
第二个是您要创建一个新Map,其中包含对第一个Map中对象的副本的引用。在这种情况下,您实际上需要为第一个Map中的每个Object创建一个新Object。您可以向类定义添加copy()
方法,也可以在类上创建“复制构造函数”。这是一个构造函数,它接受对其类型的Object的引用并创建参数的副本。由于您自己复制对象,因此修改Map中的对象不会影响其他Map中的对象。请注意,如果您的对象依次引用其他对象,则还需要复制它们。
存在这些选择是因为在Java中,当您执行Object obj = new Object()
时,'obj'是您刚刚创建的事物的引用。如果您执行Object obj2 = obj
,则会有2个对同一基础对象的引用。在任一引用上调用方法或更改属性都会影响同一对象。
当你使用第一种方法时,你会在每个地图中得到不同的引用(因为java总是按值传递,这意味着复制了引用值),但那些不同的引用仍然具有相同的值,所以他们指向相同的基础对象。
答案 1 :(得分:1)
通过使用“克隆”,我假设您正在尝试将元素复制到另一个地图。你可以轻松地做到这一点:
Map<...> myMap;
Map<...> newMap = new HashMap<...>(myMap);
//or
Map<...> newMap;
newMap.putAll(myMap);
答案 2 :(得分:1)
这取决于你想克隆的深度。如果您的键和值是可序列化的,那么您可以再次反序列化和序列化。否则,替代方法是手动完成。