java中对象拷贝的⼏种⽅式
⽅式⼀
实现Cloneable接⼝,重写clone()⽅法
⽰例对象
@Data
public class User implements Cloneable,Serializable {
private static final long serialVersionUID = 1L;
private String name;
private int age;
private List list = new ArrayList<String>();
@Override
public User clone() {
Object clone = null;
try {
clone = super.clone();
} catch (CloneNotSupportedException e) {
e.printStackTrace();
}
return (User)clone;
}
}
分析:使⽤clone()⽅法进⾏拷贝,这种⽅法的优点是可以直接使⽤⽗接⼝的clone()⽅法直接拷贝⼀个
对象,同时能够拷贝基本数据类型,但是引⽤数据类型不能拷贝,原对象和拷贝对象的引⽤属性是同⼀个属性,这种拷贝也就是常说的浅拷贝,测试如下
@Test
public void testNewInstance() throws IllegalAccessException, InstantiationException {
User user = new User();
user.setName("111");
User clone = user.clone();
List list = List();
//给原对象中的list进⾏赋值
list.add("hello");
//获取拷贝对象的list属性
List cloneList = List();
Object o = (0);
System.out.Name());//输出为111
System.out.String());//输出结果为hell0,说明引⽤的是同⼀个ArrayList对象
}
⽅式⼆
使⽤序列化,拷贝对象实现Serializable接⼝,并写⼊serialVersionUID
分析:能够完整的拷贝对象,包括引⽤类型属性,但是需要⾃⼰写序列化过程,测试如下
@Test
public void testSerializable() throws Exception {
User user = new User();
user.setName("111");
cloneByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();
ObjectOutputStream objectOutputStream = new ObjectOutputStream(byteArrayOutputStream);
objectOutputStream.writeObject(user);
ByteArrayInputStream byteArrayInputStream = new ByteArray());
ObjectInputStream objectInputStream = new ObjectInputStream(byteArrayInputStream);
User cloneUser = (User) adObject();
List list = List();
list.add("hello");
List cloneUserList = List();
System.out.println(cloneUserList.size());//输出为0,说明原对象list属性的改变对克隆对象的引⽤属性⽆影响,也就是不是引⽤的同⼀个对象,拷贝成功 System.out.Name());//输
出111,拷贝成功
}
注意:为什么要写⼊serialVersionUID,主要是⽤于反序列化,如果没有唯⼀的UID,⼀旦原类结构发⽣了改变,则⽆法进⾏反序列化
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论