java面试题知识点整理(五 对象拷贝)

1. 为什么要使用克隆?

克隆可以基于原型实例,进行复制对象,并且不影响原型对象

优点 : 不需要new 实例对象,再逐一初始化参数。 

(Java 中 clone 是 native 方法,克隆使用也非常快)

2. 如何实现对象克隆?

实现首先需要克隆的类 要实现 Cloneable,使用类对象 调用 Object#clone()

注意:

  1. 不实现 Cloneable,使用clone() 会抛出CloneNotSupportedException
  2. 类重写clone(),需要调用super.clone()
  3. 所有数组(任何引用或原始类型的数组)都被认为实现了接口 Cloneable,并且数组类型 T[] 的克隆方法的返回类型是 T[]。
  4. clone()方法会创建此对象的类的新实例,并使用此对象的相应字段的内容来初始化新实例所有字段,就像通过赋值一样;字段的内容本身不会被克隆。因此,此方法执行此对象的“浅拷贝”,而不是“深拷贝”操作。
  5. clone()在Object类中是受限的,不能采用Object类调用clone(),如
Object o = new Student(); // 其中Student 实现了 Cloneable
o.clone();   // 编译不通过

克隆对象与原型对象会存在的关系:

  •  x.clone() != x
  •  x.clone().getClass() == x.getClass()
  •  x.clone().equals(x)
@HotSpotIntrinsicCandidate
protected native Object clone() throws CloneNotSupportedException;

3. 深拷贝和浅拷贝区别是什么?

浅拷贝

克隆实例的所有内容都是通过原型实例的内容赋值而得,

实现 :  Object#clone 方法

深拷贝

克隆实例的所有内容都是通过原型实例的内容 克隆 而得,

实现 : 重写clone 方法 ; 将原型实例 序列化与反序列化

序列化与反序列化

序列化:是指将对象实例转化为可存储或可传输的数据结构,如json、xml、二进制等。

反序列化:就是将可存储或可传输的数据结构 转换、重新生成一个对象实例

深浅拷贝代码对比:

ArrayList<String> arr = new ArrayList<>();
arr.add(new String("abd"));
// 使用克隆
ArrayList<String> clone = (ArrayList<String>)arr.clone();
// 使用json序列化
String s = JSONArray.toJSONString(arr);
List<String> jsonObject = JSONArray.parseArray(s, String.class);
System.out.println(arr.get(0) == clone.get(0)); // true
System.out.println(arr.get(0).equals(clone.get(0))); // true
System.out.println(arr.get(0) == jsonObject.get(0)); // false
System.out.println(arr.get(0).equals(jsonObject.get(0))); // true

Java实现序列化 ,使用类实现接口 Java.io.Serializable , 开启可序列化标识(序列化与反序列化为二进制)

在序列化和反序列化过程中需要特殊处理的类必须实现具有以下确切签名的特殊方法:

 private void writeObject(java.io.ObjectOutputStream out)
       throws IOException
   private void readObject(java.io.ObjectInputStream in)
       throws IOException, ClassNotFoundException;
   private void readObjectNoData()
       throws ObjectStreamException;

上一章 反射

下一章

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值