首页 > 编程 > Java > 正文

Java集合的深拷贝

2019-11-11 02:51:15
字体:
来源:转载
供稿:网友
package test01;import java.io.ByteArrayInputStream;import java.io.ByteArrayOutputStream;import java.io.IOException;import java.io.ObjectInputStream;import java.io.ObjectOutputStream;import java.io.Serializable;import java.util.ArrayList;import java.util.List;public class ClassCopy {	public static void main(String[] args) {		List<Student> list = new ArrayList<Student>();		list.add(new Student("1",1));		list.add(new Student("2",2));		list.add(new Student("3",3));		list.add(new Student("4",4));		list.add(new Student("5",5));		List<Student> copyList = new ArrayList<Student>();		try {			copyList = CopyListBySerialize(list);		} catch (ClassNotFoundException e) {			e.PRintStackTrace();		} catch (IOException e) {			e.printStackTrace();		}		list.remove(2);		System.out.println(list.size());		System.out.println(copyList.size());	}		public static List CopyListBySerialize(List list) throws IOException, ClassNotFoundException{		//字节数组输出流在内存中创建一个字节数组缓冲区,所有发送到输出流的数据都保存在该字节数组缓冲区;		ByteArrayOutputStream byteOut = new ByteArrayOutputStream();		//创建一个对象输出流对象(对字节数组输出流对象的一个包装)		/*		 * 为什么需要包装流:目的是为了增强流的功能,如OutputStream,只负责输出字节,字节数组,关闭等简单的原始字节操作。		 * 为了使其在输出过程中具备更多的功能,如可以输出数字,布尔值,整数,小数,对象,UTF字符串等,		 * 则可以使用ObjectOutputStream,DataOutputStream完成各种数据的输出转换,		 * 并且将转换后的数据传递给被包装得原始OutputStream流,如FileOutputStream		 */		ObjectOutputStream out = new ObjectOutputStream(byteOut);		//把集合写入对象流中		out.writeObject(list);		//创建一个字节数组输入流对象,数据为之前输出流的数据		ByteArrayInputStream byteIn = new ByteArrayInputStream(byteOut.toByteArray());		//创建一个对象输入流对象(对字节数组输入流对象的一个包装)		ObjectInputStream in = new ObjectInputStream(byteIn);		//获取输出流中的对象		List copyList = (List) in.readObject();		return copyList;	}	}class Student implements Serializable{	private String name;	private int age;	public Student() {		super();	}	public Student(String name, int age) {		super();		this.name = name;		this.age = age;	}	public String getName() {		return name;	}	public void setName(String name) {		this.name = name;	}	public int getAge() {		return age;	}	public void setAge(int age) {		this.age = age;	}}

如实体类Student没有实现Seralizable接口的话,则会出现如下报错:

java.io.NotSerializableException: test01.Student。

正确输出为:

45


发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表