Java 如何克隆地图中的元素 private static Map choices=newhashmap(3); //选择在这里填充

Java 如何克隆地图中的元素 private static Map choices=newhashmap(3); //选择在这里填充,java,Java,将地图中的元素克隆到不同结构的最简单方法是什么。通过使用“克隆”,我假设您正在尝试将元素复制到另一个地图。您可以轻松做到这一点: private static Map<Integer, String> choices = new HashMap<Integer, String>(3); // choices get populated here Map-myMap; Map newMap=newhashmap(myMap); //或 地图新地图; newMap.putA

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

通过使用“克隆”,我假设您正在尝试将元素复制到另一个地图。您可以轻松做到这一点:

private static Map<Integer, String> choices = new HashMap<Integer, String>(3);
// choices get populated here
Map-myMap;
Map newMap=newhashmap(myMap);
//或
地图新地图;
newMap.putAll(myMap);
通过使用“克隆”,我假设您正在尝试将元素复制到另一个地图。您可以轻松做到这一点:

private static Map<Integer, String> choices = new HashMap<Integer, String>(3);
// choices get populated here
Map-myMap;
Map newMap=newhashmap(myMap);
//或
地图新地图;
newMap.putAll(myMap);

这取决于要克隆的深度。如果键和值是可序列化的,则可以再次反序列化和序列化。否则,另一种方法是手动执行。

这取决于要克隆的深度。如果键和值是可序列化的,则可以再次反序列化和序列化。否则,另一种方法是手动执行。

对于您的情况,由于整数和字符串是不可变的,所以您可以按照Mark所说的操作。这是因为一旦创建了整数/字符串,就不能修改它们

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

首先,您希望创建一个新映射,其中包含对第一个映射中对象的等效引用。如果按此路线操作,两个贴图将包含指向相同基础对象的引用。i、 e.如果从任一贴图中拉出一个对象并对其进行修改,则更改将反映在另一个集合中,因为两个贴图都包含对相同对象的引用。如果你想走这条路,@Mark提供了一个很好的答案

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

这些选择之所以存在,是因为在Java中,当您执行
对象obj=new Object()
时,“obj”是对您刚刚创建的对象的引用。如果随后执行
Object obj2=obj
操作,则对同一基础对象有两个引用。对任一引用调用方法或更改属性都会影响同一对象


使用第一种方法时,每个映射中都会有不同的引用(因为java总是按值传递,这意味着引用值会被复制),但这些不同的引用仍然具有相同的值,因此它们指向相同的基础对象。

对于您的情况,因为整数和字符串是不可变的,你可以照马克说的做。这是因为一旦创建了整数/字符串,就不能修改它们

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

首先,您希望创建一个新映射,其中包含对第一个映射中对象的等效引用。如果按此路线操作,两个贴图将包含指向相同基础对象的引用。i、 e.如果从任一贴图中拉出一个对象并对其进行修改,则更改将反映在另一个集合中,因为两个贴图都包含对相同对象的引用。如果你想走这条路,@Mark提供了一个很好的答案

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

这些选择之所以存在,是因为在Java中,当您执行
对象obj=new Object()
时,“obj”是对您刚刚创建的对象的引用。如果随后执行
Object obj2=obj
操作,则对同一基础对象有两个引用。对任一引用调用方法或更改属性都会影响同一对象


使用第一种方法时,每个映射中都会有不同的引用(因为java总是按值传递,这意味着引用值会被复制),但这些不同的引用仍然具有相同的值,因此它们指向相同的底层对象。

您要复制到的另一个数据结构是什么?另一张地图?你想具体做什么?创建一个新地图,其中包含对原始地图中对象的引用副本?或者使用对象本身的副本创建新地图。非常不同的东西。是的,将它们复制到另一个映射中,并希望克隆映射中的所有元素。您希望复制到的其他数据结构是什么?另一张地图?你想具体做什么?创建一个新地图,其中包含对原始地图中对象的引用副本?或者使用对象本身的副本创建新地图。非常不同的东西。是的,将它们复制到另一个地图中,并希望克隆地图中的所有元素