List的clone方法的应用

来源:互联网 发布:微课录屏软件有哪些 编辑:程序博客网 时间:2024/05/20 20:45

一、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 Cloneable                throw 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;    }    @Override    public String toString() {        return "Student [name=" + name + ", age=" + age + "]";    }    @Override    protected Student clone(){        Student stuent = new Student(this.name,this.age);         return stuent;     }       }
复制代码

 

原创粉丝点击