java Map 复制和对象的复制

来源:互联网 发布:淘宝龙桃子剑装强袭 编辑:程序博客网 时间:2024/06/11 00:20

1.java里的clone分为: 
A:浅复制(浅克隆)浅复制仅仅复制所考虑的对象,而不复制它所引用的对象。 

b:深复制(深克隆):深复制把要复制的对象所引用的对象都复制了一遍。 


序列化和反序列化 Serializable

序列化的对象要实现Serializable接口才能实现序列化。

序列化后,通过反序列化可以得到和当前对象一样的对象。

@SuppressWarnings("unchecked")
public static <T extends Serializable> T clone(T obj){

T clonedObj = null;
try {
ByteArrayOutputStream baos = new ByteArrayOutputStream();
ObjectOutputStream oos = new ObjectOutputStream(baos);
oos.writeObject(obj);
oos.close();

ByteArrayInputStream bais = new ByteArrayInputStream(baos.toByteArray());
ObjectInputStream ois = new ObjectInputStream(bais);
clonedObj = (T) ois.readObject();
ois.close();

}catch (Exception e){
e.printStackTrace();
}

return clonedObj;
}




程序案例:


import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.io.Serializable;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;


public class ObjectCp {


/**
* @param args
*/
public static void main(String[] args) {
System.out.println("*************关于Map的复制****************");
cpmap();
System.out.println("*************关于对象的复制****************");
objus();
}

public static void objus()
{
user ur= new user(1,"qq",23,"ww");
user ur2=ur;

System.out.println("数据展示");
System.out.println(ur.toString());
System.out.println(ur2.toString());

System.out.println("修改属性值后数据展示");
ur.setAge(88);
System.out.println(ur.toString());
System.out.println(ur2.toString());

System.out.println("序列化后修改属性值后数据展示");
ur2= clone(ur);
ur.setAge(11);
System.out.println(ur.toString());
System.out.println(ur2.toString());
}


public static void cpmap()
{
String str="ppppp";
List<Integer> list = new ArrayList<Integer>();
list.add(100);
list.add(200);

HashMap<String,Object> map = new HashMap<String,Object>();

//放基本类型数据
map.put("basic", 100);
map.put("str", str);
//放对象
map.put("list", list);

HashMap<String,Object> mapNew = new HashMap<String,Object>();
mapNew.putAll(map);//只对 基本类型和String 类型有效,对象类型无效

System.out.println("----数据展示-----");
System.out.println(map);
System.out.println(mapNew);

System.out.println("----更改基本类型数据-----");
map.put("basic", 200);
        
System.out.println(map);
System.out.println(mapNew);

System.out.println("----更改引用类型数据-----");
list.add(300);
mapNew.put("str", "wwwwwwww");
System.out.println(map);
System.out.println(mapNew);


System.out.println("----使用序列化进行深拷贝-----");
mapNew = clone(map);
list.add(400);
map.put("str", "mmmmmmm");
System.out.println(map);
System.out.println(mapNew);


System.out.println("----使用序列化进行深拷贝-----");
HashMap<String,Object> mapNews = new HashMap<String,Object>();
mapNews = clone(map);
list.add(500);
mapNews.put("str", "wwwwwwww");
System.out.println(map);
System.out.println(mapNews);
}

@SuppressWarnings("unchecked")
public static <T extends Serializable> T clone(T obj){

T clonedObj = null;
try {
ByteArrayOutputStream baos = new ByteArrayOutputStream();
ObjectOutputStream oos = new ObjectOutputStream(baos);
oos.writeObject(obj);
oos.close();

ByteArrayInputStream bais = new ByteArrayInputStream(baos.toByteArray());
ObjectInputStream ois = new ObjectInputStream(bais);
clonedObj = (T) ois.readObject();
ois.close();

}catch (Exception e){
e.printStackTrace();
}

return clonedObj;
}


}


class user implements Serializable{

user(int uid,String uname,int age,String up)
{
this.uid=uid;
this.uname=uname;
this.age=age;
this.up=up;
}
private int uid;
private String uname;
private int age;
private String up;
public int getUid() {
return uid;
}
public void setUid(int uid) {
this.uid = uid;
}
public String getUname() {
return uname;
}
public void setUname(String uname) {
this.uname = uname;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public String getUp() {
return up;
}
public void setUp(String up) {
this.up = up;
}

public String toString()
{
return String.format("uid:%d,uname:%s,age:%d,up:%s",uid,uname,age,up);
}





结论:

1.Map 对象 使用putall 可是实现对基本类型和String类型的深度复制,对引用类型必须通过序列化与反序列化处理。

2.对象间的复制,使用序列化进行深度复制。

0 0
原创粉丝点击