private static Map<Integer, String> choices = new HashMap<Integer, String>(3);
// choices get populated here
将Map中的元素克隆到不同结构的最简单方法是什么?如何克隆地图中的元素
private static Map<Integer, String> choices = new HashMap<Integer, String>(3);
// choices get populated here
将Map中的元素克隆到不同结构的最简单方法是什么?如何克隆地图中的元素
通过你使用“克隆”我假设你试图将元素复制到另一个地图。你可以很容易地做到这一点:
Map<...> myMap;
Map<...> newMap = new HashMap<...>(myMap);
//or
Map<...> newMap;
newMap.putAll(myMap);
我想知道是否有一个辅助函数在commons-lang库中的某处做了类似的事情。我认为这应该是简单直接的,但我想这种方法很好 – Jason 2011-05-21 03:11:16
它怎么会更简单? – MeBigFatGuy 2011-05-21 03:30:10
这取决于你想克隆多深。如果你的键和值是可序列化的,那么你可以反序列化和序列化。否则,另一种方法是手动。
在这种情况下,浅层克隆与完全深层克隆一样好,因为整数和字符串是不可变的。 – MeBigFatGuy 2011-05-21 03:30:43
对于你的情况,因为Integers和Strings是不可变的,所以你可以做Mark说的。这是可行的,因为一旦创建完成后就不能修改整数/字符串。
在一般情况下,如果您没有不可变对象,您需要非常清楚地了解您要做什么。有两种可能性,每种可能都会产生截然不同的后果。
首先是您要创建一个新的Map,其中包含对第一个Map中的对象的等效引用。如果你走这条路线,两个地图都将包含指向相同基础对象的引用。即如果您从Map导出对象并对其进行修改,则更改将反映在其他集合中,因为两个Maps都包含对相同对象的引用。如果你想走这条路,@Mark提供了一个很好的答案。
第二个是您要创建一个新的Map,其中包含对第一个Map中的对象的副本的引用。在这种情况下,您实际上需要为第一个Map中的每个对象创建一个新对象。您可以将copy()
方法添加到类定义中,也可以在该类上创建“复制构造函数”。这是一个构造函数,它接受对其类型的Object的引用并创建参数的副本。由于您正在复制对象本身,因此修改地图中的对象不会影响其他地图中的对象。请注意,如果您的对象反过来引用其他对象,您也需要复制这些对象。
这些选择,因为在Java中存在,当你做Object obj = new Object()
,“OBJ”是参考到您刚才创建的东西。如果你做Object obj2 = obj
你有2个引用到相同的基础对象。调用方法或更改任一参考的属性都会影响同一个对象。当你使用第一种方法时,最终会在每个映射中引用不同的引用(因为java总是按值传递,这意味着引用值被复制),但这些不同的引用仍然具有相同的值,所以他们指向相同的基础对象。
我猜在这种情况下,马克的解决方案将工作,因为整数和字符串都是不可变的,但否则个别元素必须克隆(以某种方式)并添加到新地图。 – 2011-05-21 03:19:34
@bala你是对的。让我修改我的答案,这样我就不必浪费所有的努力;) – hvgotcodes 2011-05-21 03:21:06
你想复制到的其他数据结构是什么?另一张地图? – 2011-05-21 02:56:05
你想要做什么?用*参考*的副本创建一个新的地图到原始对象中?或者创建一个新的地图,* *对象本身*的*副本。非常不同的事情。 – hvgotcodes 2011-05-21 03:00:07
是复制到另一个地图,并想克隆地图本身的所有元素 – Jason 2011-05-21 03:09:34