如何完全clone 一个HashMap?

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

哪位有办法?
...全文
4278 49 打赏 收藏 转发到动态 举报
写回复
用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)
课程基础概述本门课程,大喵将会打着大家从零打造一款属于大家自己的 CLI命令行脚手架工具,本课程主要面向新手同学,对命令行工具开发,前端工具开发感兴趣的同学,可以通过本门课程学习到如何使用Node.JS开发一款适配自身项目特色的脚手架命令行工具。并且也会带着大家推送自己开发完成的CLI工具到NPM线上仓库,供所有人下载安装使用。整个课程,大喵会详细讲解所需要依赖的第三方模块包的具体使用,让同学们可以举一反三开发具备自身特色的CLI工具,最终大喵会运用到前面所讲解的基础内容,独立自主开发一个具备 damiao [ add | delete | list | init ] 四种子命令的CLI脚手架工具。CLI命令行工具命令行工具(Cmmand Line Interface)简称cli,顾名思义就是在命令行终端中使用的工具。我们常用的 git 、npm、vim 等都是 cli 工具,比如我们可以通过 git clone 等命令简单把远程代码复制到本地。在目前前端工程大流行的环境下,vue-cli、create-reate-app、angular-cli 等等方便快捷的命令行脚手架工具诞生,极大的提升了我们的开发效率与质量,我们可以通过这些脚手架工具在本地快速构建我们的开发项目。 课程目录结构1、CLI课程介绍   2、CLI课程纲领和讲师介绍3、CLI课程内容概述    4、CLI命令行工具及场景应用5、CLI课程准备工具和技术   6、CLI课程收获和收益  7、CLI课程实战案例介绍   8、npm CLI 命令行工具发展现状9、创建第一个命令行自定义命令   10、process.argv 接收命令行参数11、commander 工具使用介绍一   12、commander 工具使用介绍二13、inquirer 工具使用介绍   14、ora 加载工具使用介绍15、chalk 颜色工具使用介绍   16、download-git-repo 仓库工具介绍17、创建脚手架命令   18、创建命令可执行文件19、damiao add 命令行指令开发   20、damiao add 模板录入校验21、damiao delete 命令行指令开发   22、damiao list 命令行指令开发23、damiao init 初始化项目指令开发   24、damiao init 指令参数输入校验25、damiao 命令行指令测试.mp4  26、创建npm个人账号及发布npm仓库27、全局安装脚手架工具

62,614

社区成员

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

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