社区
Java SE
帖子详情
如何完全clone 一个HashMap?
f123
2005-06-03 02:01:03
加精
如何完全克隆一个HashMap包括 key 和 value。
我尝试枚举出里面的所有value,但Objdect类还是无法克隆。
哪位有办法?
...全文
4344
49
打赏
收藏
如何完全clone 一个HashMap?
如何完全克隆一个HashMap包括 key 和 value。 我尝试枚举出里面的所有value,但Objdect类还是无法克隆。 哪位有办法?
复制链接
扫一扫
分享
转发到动态
举报
写回复
配置赞助广告
用AI写文章
49 条
回复
切换为时间正序
请发表友善的回复…
发表回复
打赏红包
f123
2005-06-06
打赏
举报
回复
诸位,搬家了。
又新发一贴,请进入看看:
http://community.csdn.net/Expert/topic/4062/4062251.xml?temp=.1975214
kaleon
2005-06-03
打赏
举报
回复
路过
f123
2005-06-03
打赏
举报
回复
下班走了。
f123
2005-06-03
打赏
举报
回复
fog628(无名) 像你那样map放进去的必须是一个Value呀?
fog628
2005-06-03
打赏
举报
回复
treeroot(旗鲁特)
怎么老不上QQ了/???????
当然序列化是最容易了,但。。。。。
treeroot
2005-06-03
打赏
举报
回复
Cloneable是个标记接口
clone方法确实在Object中定义的
treeroot
2005-06-03
打赏
举报
回复
上面的确实不行,这是由于Java本身的Clone机制造成的
f123
2005-06-03
打赏
举报
回复
treeroot(旗鲁特) ( ) :
des.put( ((Cloneable) key).clone(),((Cloneable)value).clone());
好像也不行吧…………
f123
2005-06-03
打赏
举报
回复
谢谢两位,我先试试。
treeroot
2005-06-03
打赏
举报
回复
fog628(无名) 兄弟写的实际用处不大
如果需要一个通用的深拷贝,可以用序列化,但是你不要觉得效率低下!我也不忍心用这种方式
来实现的,幸好大部分情况是不需要深拷贝的.
public static Object clone(Object src) throws IOException, ClassNotFoundException{
if(src==null) return src;
ByteArrayOutputStream baos=new ByteArrayOutputStream();
ObjectOutputStream oos=new ObjectOutputStream(baos);
oos.writeObject(src);
ByteArrayInputStream bais=new ByteArrayInputStream(baos.toByteArray());
ObjectInputStream ois=new ObjectInputStream(bais);
return ois.readObject();
}
treeroot
2005-06-03
打赏
举报
回复
如果你已经实现了Cloneable
des.put( ((Cloneable) key).clone(),((Cloneable)value).clone());
就可以了
fog628
2005-06-03
打赏
举报
回复
上面的是用了两个自己写的类,
一个用来作key, 一个用来作value,
大概可以实现 HashMap 的 Deep Clone
fog628
2005-06-03
打赏
举报
回复
import java.io.*;
import java.util.*;
class CloneHashMap{
//深Clone Keys
private static ArrayList cloneKeys(Set set){
ArrayList oldList = new ArrayList(set);
ArrayList newList = (ArrayList)oldList.clone();
for (int i = 0; i< oldList.size() ; i++){
//Clone到每一个Key
newList.add(((Key)oldList.get(i)).clone());
}
return newList;
}
public static Map cloneMap(HashMap oldMap){
Map newMap = (HashMap)oldMap.clone();
ArrayList newKeys = cloneKeys(oldMap.keySet());
for (int i = 0; i < newKeys.size(); i++){
Object k = newKeys.get(i);
//Clone到每一个Value
Object v = ((Value)oldMap.get(k)).clone();
newMap.put(k, v);
}
return newMap;
}
public static void main(String[] args) throws Exception{
HashMap oldmap = new HashMap();
for (int i = 0; i < 5; i++){
oldmap.put(new Key(i), new Value(i));
}
System.out.println("更改值以前的HashMap:");
System.out.println(oldmap);
System.out.println("-----------------------------------");
System.out.println("Clone出来的HashMap:");
Map newmap = cloneMap(oldmap);
System.out.println(newmap);
System.out.println("-----------------------------------");
Iterator i = newmap.keySet().iterator();
while(i.hasNext()){
((Value)newmap.get(i.next())).increment();
}
System.out.println("更改Clone出来的HashMap中的值, 原来的旧HashMap");
System.out.println(oldmap);
System.out.println("-----------------------------------");
System.out.println("更改Clone出来的HashMap中的值, 现在的新的HashMap");
System.out.println(newmap);
}
}
//一个用来作Value的类
class Value implements Cloneable{
private int value;
Value(int i){
this.value = i;
}
public void increment(){
value *= 100;
}
public Object clone(){
Object o = null;
try{
o = super.clone();
}catch(CloneNotSupportedException e){
e.printStackTrace();
}
return o;
}
public String toString(){
return "" + value;
}
}
//一个用来作Key的类
class Key implements Cloneable{
private int value;
public Key(int i){
this.value = i;
}
public Object clone(){
Object o = null;
try{
o = super.clone();
}catch(CloneNotSupportedException e){
e.printStackTrace();
}
return o;
}
public boolean equals(Object o){
return (o instanceof Key)
&&(this.value == ((Key)o).value);
}
public int hashCode(){
return this.value;
}
}
f123
2005-06-03
打赏
举报
回复
具体怎么实现????
treeroot
2005-06-03
打赏
举报
回复
如果不你觉得效率低下的话
就用序列化和反序列化
否则你就定义一个接口来实现你的深拷贝
inteface DeepCloneable
treeroot
2005-06-03
打赏
举报
回复
我怎么把这个给忘了!
f123
2005-06-03
打赏
举报
回复
怎么没人了呢?
f123
2005-06-03
打赏
举报
回复
treeroot(旗鲁特)
现在的问题就是从map里得到的是一个Object,但Object不能直接用clone方法呀!
fog628(无名):
是呀,就是这个问题不能解决,所以才想用clone的。
treeroot
2005-06-03
打赏
举报
回复
return des;
f123
2005-06-03
打赏
举报
回复
是呀,我说的就是这个呀。
加载更多回复(29)
HashSet 和
HashMap
区别?
本文深入探讨了HashSet如何基于
HashMap
实现其功能,解释了除
clone
()、writeObject()和readObject()方法外,HashSet几乎
完全
依赖于
HashMap
的方法调用来完成其核心操作。
Java面试之HashSet 和
HashMap
区别
本文深入探讨了HashSet与
HashMap
之间的紧密联系,揭示了HashSet实际上是如何基于
HashMap
实现的。除了必要的
clone
()、writeObject()和readObject()方法外,HashSet的其他功能几乎
完全
依赖于
HashMap
的方法调用,展示了两者间的设计与实现细节。
HashMap
不支持深拷贝问题解决方案
本文探讨了在Java中实现
HashMap
深拷贝的方法,针对自定义对象作为value时的浅拷贝问题,提出了一种解决方案,通过重写
clone
方法并实现Required
Clone
able接口,确保了对象的
完全
复制。
浅复制和深复制-以
HashMap
为例
本文详细探讨了Java中
HashMap
的浅复制和深复制,包括概念解释、实例演示以及多种实现方式。浅复制创建新
HashMap
但引用相同对象,深复制则创建
完全
独立的对象副本。常见实现包括
HashMap
构造器、
clone
方法、Java 8 Stream API以及序列化与反序列化。推荐使用序列化工具如Jackson、Gson或Protostuff进行深复制,以确保对象完整独立。
Overload the
HashMap
clone
()
本文探讨了使用
HashMap
的
clone
()方法时出现的问题,并提供了
一个
通过覆写
clone
()方法实现深克隆的具体实例。作者发现默认的浅拷贝会导致原始对象被意外修改,因此详细解释了如何创建
一个
深拷贝。
Java SE
62,622
社区成员
307,257
社区内容
发帖
与我相关
我的任务
Java SE
Java 2 Standard Edition
复制链接
扫一扫
分享
社区描述
Java 2 Standard Edition
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
暂无公告
试试用AI创作助手写篇文章吧
+ 用AI写文章