Copy ArrayList的四种方式

简介: Copy ArrayList的四种方式

目录



Copy ArrayList的四种方式


简介


ArrayList是我们经常会用到的集合类,有时候我们需要拷贝一个ArrayList,今天向大家介绍拷贝ArrayList常用的四种方式。


使用构造函数


ArrayList有个构造函数,可以传入一个集合:


public ArrayList(Collection<? extends E> c) {
        elementData = c.toArray();
        if ((size = elementData.length) != 0) {
            // c.toArray might (incorrectly) not return Object[] (see 6260652)
            if (elementData.getClass() != Object[].class)
                elementData = Arrays.copyOf(elementData, size, Object[].class);
        } else {
            // replace with empty array.
            this.elementData = EMPTY_ELEMENTDATA;
        }
    }


上面的代码我们可以看出,底层实际上调用了Arrays.copyOf方法来对数组进行拷贝。


这个拷贝调用了系统的native arraycopy方法,注意这里的拷贝是引用拷贝,而不是值的拷贝。这就意味着这如果拷贝之后对象的值发送了变化,源对象也会发生改变。


举个例子:


@Test
    public void withConstructor(){
        List<String> stringList=new ArrayList<>(Arrays.asList("a","b","c"));
        List<String> copyList = new ArrayList<>(stringList);
        copyList.set(0,"e");
        log.info("{}",stringList);
        log.info("{}",copyList);
        List<CustBook> objectList=new ArrayList<>(Arrays.asList(new CustBook("a"),new CustBook("b"),new CustBook("c")));
        List<CustBook> copyobjectList = new ArrayList<>(objectList);
        copyobjectList.get(0).setName("e");
        log.info("{}",objectList);
        log.info("{}",copyobjectList);
    }


运行结果:


22:58:39.001 [main] INFO com.flydean.CopyList - [a, b, c]
22:58:39.008 [main] INFO com.flydean.CopyList - [e, b, c]
22:58:39.009 [main] INFO com.flydean.CopyList - [CustBook(name=e), CustBook(name=b), CustBook(name=c)]
22:58:39.009 [main] INFO com.flydean.CopyList - [CustBook(name=e), CustBook(name=b), CustBook(name=c)]


我们看到对象的改变实际上改变了拷贝的源。而copyList.set(0,"e")实际上创建了一个新的String对象,并把它赋值到copyList的0位置。


使用addAll方法


List有一个addAll方法,我们可以使用这个方法来进行拷贝:


@Test
    public void withAddAll(){
        List<CustBook> objectList=new ArrayList<>(Arrays.asList(new CustBook("a"),new CustBook("b"),new CustBook("c")));
        List<CustBook> copyobjectList = new ArrayList<>();
        copyobjectList.addAll(objectList);
        copyobjectList.get(0).setName("e");
        log.info("{}",objectList);
        log.info("{}",copyobjectList);
    }


同样的拷贝的是对象的引用。


使用Collections.copy


同样的,使用Collections.copy也可以得到相同的效果,看下代码:


@Test
    public void withCopy(){
        List<CustBook> objectList=new ArrayList<>(Arrays.asList(new CustBook("a"),new CustBook("b"),new CustBook("c")));
        List<CustBook> copyobjectList = new ArrayList<>(Arrays.asList(new CustBook("d"),new CustBook("e"),new CustBook("f")));
        Collections.copy(copyobjectList, objectList);
        copyobjectList.get(0).setName("e");
        log.info("{}",objectList);
        log.info("{}",copyobjectList);
    }


使用stream


我们也可以使用java 8引入的stream来实现:


@Test
    public void withStream(){
        List<CustBook> objectList=new ArrayList<>(Arrays.asList(new CustBook("a"),new CustBook("b"),new CustBook("c")));
        List<CustBook> copyobjectList=objectList.stream().collect(Collectors.toList());
        copyobjectList.get(0).setName("e");
        log.info("{}",objectList);
        log.info("{}",copyobjectList);
    }


总结


好了,四种方法讲完了,大家要注意四种方法都是引用拷贝,在使用的时候要小心。

本文的例子https://github.com/ddean2009/learn-java-collections

相关文章
|
5月前
|
Java
java8中List对象转另一个List对象
java8中List对象转另一个List对象
239 0
|
4月前
|
Dart
Dart之集合详解(List、Set、Map)
Dart之集合详解(List、Set、Map)
|
4月前
|
Java
Java list中的对象转为list,list中的对象转为map
Java list中的对象转为list,list中的对象转为map
85 1
|
5月前
|
Java
Java中拷贝list数组如何实现
Java中拷贝list数组如何实现
51 0
list中所有方法的使用
学习List(列表)的使用方法。 /之前不能使用 值=什么 *之后只能使用 值=什么
66 0
|
Dart
Dart之List、数组创建
Dart之List、数组创建
96 0
Dart之List、数组创建
|
安全
List和ArrayList的区别
List和ArrayList的区别
66 0
|
Java
Java 数组(Array)与集合(List、ArrayList ...)的区别
Java 数组(Array)与集合(List、ArrayList ...)的区别
150 0
|
Java
Java基础——List、Set、Map的简单操作与遍历
Java基础——List、Set、Map的简单操作与遍历
89 0
ArrayList的remove()方法解读
remove()方法:要注意在remove()方法有两种形式: ①:remove(int index):按照集合下表查找,这个也是默认的,返回值是Object型。 ②:remove(Object o):按照value值进行移除操作涉及装箱,所以默认是第一种,其返回值是boolean型,表示操作是否成功。 remove(int index): @Test public void test1() { ArrayList arrayList...
191 0
ArrayList的remove()方法解读