如何完全clone 一个HashMap?

f123 2005-06-03 02:01:03
加精
如何完全克隆一个HashMap包括 key 和 value。
我尝试枚举出里面的所有value,但Objdect类还是无法克隆。

哪位有办法?
...全文
4304 49 打赏 收藏 转发到动态 举报
AI 作业
写回复
用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)

62,635

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧