浅拷贝
User类
public class User {
private String name;
public User(String name) {
this.name = name;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
@Override
public String toString() {
return "User{" +
"name='" + name + '\'' +
'}';
}
}
浅拷贝类
public static void main(String[] args) {
Map<String, User> originalMap = new HashMap<>();
originalMap.put("key1", new User("张三"));
originalMap.put("key2", new User("李四"));
// 浅拷贝
Map<String, User> shallowCopy = new HashMap<>(originalMap);
System.out.println("原始Map: " + originalMap);
System.out.println("拷贝Map: " + shallowCopy);
// 修改原始Map
originalMap.get("key1").setName("王五");
System.out.println("====修改后====");
System.out.println("原始Map: " + originalMap);
System.out.println("拷贝Map: " + shallowCopy);
}
执行结果
深拷贝
User类
public class User implements Cloneable{
private String name;
public User(String name) {
this.name = name;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
@Override
public String toString() {
return "User{" +
"name='" + name + '\'' +
'}';
}
@Override
protected Object clone() throws CloneNotSupportedException {
return super.clone();
}
}
深拷贝类
public static void main(String[] args) {
Map<String, User> originalMap = new HashMap<>();
originalMap.put("key1", new User("张三"));
originalMap.put("key2", new User("李四"));
Map<String, User> deepCopy = new HashMap<>();
originalMap.forEach((key, value) -> {
try {
deepCopy.put(key, (User) value.clone());
} catch (CloneNotSupportedException e) {
throw new RuntimeException(e);
}
});
System.out.println("原始Map: " + originalMap);
System.out.println("拷贝Map: " + deepCopy);
// 修改原始Map
originalMap.get("key1").setName("王五");
System.out.println("====修改后====");
System.out.println("原始Map: " + originalMap);
System.out.println("拷贝Map: " + deepCopy);
}
执行结果
结论
- 浅拷贝:复制对象的引用,修改一个会影响另一个。
- 深拷贝:递归复制所有对象,修改一个不会影响另一个。
常用的Map拷贝方法
put()
HashMap<String, String> aMap = new HashMap<>();
HashMap<String, String> bMap = new HashMap<>();
aMap.foreach((key, value)-> {
bMap.put(key,value);
});
putAll()
HashMap<String, String> aMap = new HashMap<>();
HashMap<String, String> bMap = new HashMap<>();
bMap.putAll(aMap);
clone()
HashMap<String, String> map = new HashMap<>();
Object cloneMap = map.clone();
toMap()
Set<Map.Entry<String, String>> entries = map.entrySet();
Map<String, String> copyMap = entries.stream().collect(Collectors.toMap(Map.Entry::getKey, Map.Entry::getValue));
Google Guava - 不可变的map
ImmutableMap<String, String> immutableMap = ImmutableMap.copyOf(map);
apache commons包
HashMap<String, String> cloneMap = SerializationUtils.clone(map);