2011-05-21 123 views
1
private static Map<Integer, String> choices = new HashMap<Integer, String>(3); 
// choices get populated here 

将Map中的元素克隆到不同结构的最简单方法是什么?如何克隆地图中的元素

+0

你想复制到的其他数据结构是什么?另一张地图? – 2011-05-21 02:56:05

+0

你想要做什么?用*参考*的副本创建一个新的地图到原始对象中?或者创建一个新的地图,* *对象本身*的*副本。非常不同的事情。 – hvgotcodes 2011-05-21 03:00:07

+0

是复制到另一个地图,并想克隆地图本身的所有元素 – Jason 2011-05-21 03:09:34

回答

1

通过你使用“克隆”我假设你试图将元素复制到另一个地图。你可以很容易地做到这一点:

Map<...> myMap; 

Map<...> newMap = new HashMap<...>(myMap); 

//or 

Map<...> newMap; 
newMap.putAll(myMap); 
+0

我想知道是否有一个辅助函数在commons-lang库中的某处做了类似的事情。我认为这应该是简单直接的,但我想这种方法很好 – Jason 2011-05-21 03:11:16

+0

它怎么会更简单? – MeBigFatGuy 2011-05-21 03:30:10

1

这取决于你想克隆多深。如果你的键和值是可序列化的,那么你可以反序列化和序列化。否则,另一种方法是手动。

+0

在这种情况下,浅层克隆与完全深层克隆一样好,因为整数和字符串是不可变的。 – MeBigFatGuy 2011-05-21 03:30:43

2

对于你的情况,因为Integers和Strings是不可变的,所以你可以做Mark说的。这是可行的,因为一旦创建完成后就不能修改整数/字符串。

在一般情况下,如果您没有不可变对象,您需要非常清楚地了解您要做什么。有两种可能性,每种可能都会产生截然不同的后果。

首先是您要创建一个新的Map,其中包含对第一个Map中的对象的等效引用。如果你走这条路线,两个地图都将包含指向相同基础对象的引用。即如果您从Map导出对象并对其进行修改,则更改将反映在其他集合中,因为两个Maps都包含对相同对象的引用。如果你想走这条路,@Mark提供了一个很好的答案。

第二个是您要创建一个新的Map,其中包含对第一个Map中的对象的副本的引用。在这种情况下,您实际上需要为第一个Map中的每个对象创建一个新对象。您可以将copy()方法添加到类定义中,也可以在该类上创建“复制构造函数”。这是一个构造函数,它接受对其类型的Object的引用并创建参数的副本。由于您正在复制对象本身,因此修改地图中的对象不会影响其他地图中的对象。请注意,如果您的对象反过来引用其他对象,您也需要复制这些对象。

这些选择,因为在Java中存在,当你做Object obj = new Object(),“OBJ”是参考到您刚才创建的东西。如果你做Object obj2 = obj你有2个引用到相同的基础对象。调用方法或更改任一参考的属性都会影响同一个对象。当你使用第一种方法时,最终会在每个映射中引用不同的引用(因为java总是按值传递,这意味着引用值被复制),但这些不同的引用仍然具有相同的值,所以他们指向相同的基础对象。

+0

我猜在这种情况下,马克的解决方案将工作,因为整数和字符串都是不可变的,但否则个别元素必须克隆(以某种方式)并添加到新地图。 – 2011-05-21 03:19:34

+0

@bala你是对的。让我修改我的答案,这样我就不必浪费所有的努力;) – hvgotcodes 2011-05-21 03:21:06