一、ArrayList的Clone方法的源码

  • 返回一个Object对象,所以在使用此方法的时候要强制转换
  • ArrayList的本质是维护了一个Object的数组,所以克隆也是通过数组的复制实现的,属于浅复制
public Object clone() {try {@SuppressWarnings("unchecked")ArrayList<E> v = (ArrayList<E>) super.clone();v.elementData = Arrays.copyOf(elementData, size);v.modCount = 0;return v;} catch (CloneNotSupportedException e) {// this shouldn't happen, since we are Cloneablethrow new InternalError();}}

二、ArrayList的Clone浅复制的巧妙使用

 当你需要使用remove方法移除掉集合中的对象,而非要修改集合中的对象的时候,可以选择使用。

//添加两个元素
Student stJack=new Student("Jack", 13);
Student stTom=new Student("Tom", 15);
list.add(stJack);
list.add(stTom);
//克隆
ArrayList<Student> listCopy=(ArrayList<Student>) list.clone();
//移除且不修改
listCopy.remove(1);
System.out.println(list);
System.out.println(listCopy);

代码解读:

remove之前的:

remove之后的:

所以移除且不修改集合中的元素,只是在List内部的数组中移除了指向元素的地址,可以放心的使用clone。

三、实现List的深复制

如果你想要修改克隆后的集合,那么克隆前的也会被修改。那么就需要使用深复制。通过实现对象类的clone方法。

public class testClone {public static void main(String[] args) {ArrayList<Student> list=new ArrayList<Student>();//添加两个元素Student stJack=new Student("Jack", 13);Student stTom=new Student("Tom", 15);list.add(stJack);list.add(stTom);//深克隆ArrayList<Student> listCopy=new ArrayList<Student>();for (Student student : list) {listCopy.add(student.clone());}//移除且不修改listCopy.get(0).setAge(20);System.out.println(list);System.out.println(listCopy);}
}class Student{private String name;private int 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;}public Student(String name, int age) {super();this.name = name;this.age = age;}@Overridepublic String toString() {return "Student [name=" + name + ", age=" + age + "]";}@Overrideprotected Student clone(){Student stuent = new Student(this.name,this.age); return stuent; }}

转载于:https://www.cnblogs.com/lyajs/p/5779021.html

如何巧妙的使用ArrayList的Clone方法相关推荐

  1. java cloneable_java开发——Cloneable接口、clone()方法和深浅拷贝

    1.实现Cloneable接口表明该类的对象是允许克隆的. 2.允许克隆的意思是:可以调用clone()方法. 3.深拷贝还是浅拷贝,取决于如何重写Object的clone()方法. 4.原对象和克隆 ...

  2. java的cloneable_Java的Cloneable接口和clone方法

    1. 克隆的用处 在日常编码中我们经常需要产生某个对象的副本,这里的副本并不是指向同一个对象的不同引用,而是与当前对象状态一模一样的另一个新的对象.如果使用单纯的引用赋值,会发生什么效果呢? 我们可以 ...

  3. 一种巧妙的删除程序自己的方法

    一种巧妙的删除程序自己的方法     大家都知道,一般的程序运行的时候,可执行文件本身是被操作系统保护的,不能用改写的方式访问,更别提在本身还在运行的时侯删除自己了.在Lu0的主页上看到一种UNDOC ...

  4. clone方法是如何工作的

    2019独角兽企业重金招聘Python工程师标准>>> clone()是java.lang.Object类下面的一个很难处理的方法,clone()的作用很简单,提供一种克隆机制创建对 ...

  5. 回味集合(三)ArrayList的add方法

    啥也不说了,直接撸源码: public class ArrayList<E> extends AbstractList<E>implements List<E>, ...

  6. ArrayList的subList方法

    李说: ArrayList的subList方法获取到的是ArrayList的一段list,只是其中的一段视图.所以修改subList ,ArrayList同时会修改,因为本来就是同一个东西. jdk文 ...

  7. arraycopy用法_Java复制(拷贝)数组的4种方法:arraycopy()方法、clone() 方法、copyOf()和copyOfRan...

    所谓复制数组,是指将一个数组中的元素在另一个数组中进行复制.本文主要介绍关于 Java 里面的数组复制(拷贝)的几种方式和用法.在 Java 中实现数组复制分别有以下 4 种方法: Arrays 类的 ...

  8. java深度克隆_浅析Java中clone()方法浅克隆与深度克隆

    现在Clone已经不是一个新鲜词语了,伴随着"多莉"的产生这个词语确实很"火"过一阵子,在Java中也有这么一个概念,它可以让我们很方便的"制造&qu ...

  9. (二十三)原型模式详解(clone方法源码的简单剖析)

    作者:zuoxiaolong8810(左潇龙),转载请注明出处,特别说明:本博文来自博主原博客,为保证新博客中博文的完整性,特复制到此留存,如需转载请注明新博客地址即可. 原型模式算是JAVA中最简单 ...

最新文章

  1. 学长告诉你 java注解——深入浅出
  2. C#进阶系列——WebApi 身份认证解决方案:Basic基础认证
  3. what are the associated papers accepted at the Harvard business review from cambridge
  4. 计算机本地用户删除后怎么恢复,电脑本地磁盘盘符被隐藏C盘不见了恢复方法...
  5. mysql 查询语句_SQL语言mysql基础查询语句
  6. android rxbus 一个页面监听,Android RxBus的使用
  7. 9、play中缓存的使用
  8. DotnetCharting控件的破解方法
  9. 迭代器模式(Iterator)
  10. 数据结构与算法-复杂的问题简单化
  11. 对大脑有益的16种食物_对大脑有益的食物有哪些?
  12. POJ 3090 (欧拉函数) Visible Lattice Points
  13. 任正非号召华为员工学习一份20页 5G PPT:认识5G,发展5G
  14. android setting 开发者模式,Android 设置 Setting ---开发者选项 中选项为默认配置
  15. 【题解】HNOI-2015落忆枫音
  16. crystal xcelsius 的使用
  17. Nginx 实战-负载均衡
  18. jmeter- 循环控制器计数器 实现批量添加操作
  19. 初学者怎样学好Java
  20. java.lang.NumberFormatException 数字转换异常的错误及解决办法

热门文章

  1. 魅族8.0系统手机最完美激活xposed框架的步骤
  2. Spring框架—SpringBean加载过程
  3. RabbitMQ—常见报错
  4. 报错:Your CPU supports instructions that this TensorFlow binary was not compiled to use: AVX2
  5. 1041 考试座位号
  6. java:提示Could not initialize class sun.awt.X11GraphicsEnvironment
  7. [九省联考2018]IIIDX 贪心 线段树
  8. stream的filter用法
  9. VS2010建立Windows服务项目时的一些问题
  10. context 的理解