Copy ArrayList的四种方式

Copy ArrayList的四种方式

简介

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

使用构造函数

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

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

上面的代码我们可以看出,底层实际上调用了Arrays.copyOf方法来对数组进行拷贝。这个拷贝调用了系统的native arraycopy方法,注意这里的拷贝是引用拷贝,而不是值的拷贝。这就意味着这如果拷贝之后对象的值发送了变化,源对象也会发生改变。

举个例子:

1 [@Test](https://my.oschina.net/azibug) 2 public void withConstructor(){ 3 List<String> stringList=new ArrayList<>(Arrays.asList("a","b","c")); 4 List<String> copyList = new ArrayList<>(stringList); 5 copyList.set(0,"e"); 6 log.info("{}",stringList); 7 log.info("{}",copyList); 8 9 List<CustBook> objectList=new ArrayList<>(Arrays.asList(new CustBook("a"),new CustBook("b"),new CustBook("c"))); 10 List<CustBook> copyobjectList = new ArrayList<>(objectList); 11 copyobjectList.get(0).setName("e"); 12 log.info("{}",objectList); 13 log.info("{}",copyobjectList); 14 }

运行结果:

122:58:39.001 [main] INFO com.flydean.CopyList - [a, b, c] 222:58:39.008 [main] INFO com.flydean.CopyList - [e, b, c] 322:58:39.009 [main] INFO com.flydean.CopyList - [CustBook(name=e), CustBook(name=b), CustBook(name=c)] 422: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方法,我们可以使用这个方法来进行拷贝:

1 [@Test](https://my.oschina.net/azibug) 2 public void withAddAll(){ 3 4 List<CustBook> objectList=new ArrayList<>(Arrays.asList(new CustBook("a"),new CustBook("b"),new CustBook("c"))); 5 List<CustBook> copyobjectList = new ArrayList<>(); 6 copyobjectList.addAll(objectList); 7 copyobjectList.get(0).setName("e"); 8 log.info("{}",objectList); 9 log.info("{}",copyobjectList); 10 }

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

使用Collections.copy

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

1 [@Test](https://my.oschina.net/azibug) 2 public void withCopy(){ 3 List<CustBook> objectList=new ArrayList<>(Arrays.asList(new CustBook("a"),new CustBook("b"),new CustBook("c"))); 4 List<CustBook> copyobjectList = new ArrayList<>(Arrays.asList(new CustBook("d"),new CustBook("e"),new CustBook("f"))); 5 Collections.copy(copyobjectList, objectList); 6 copyobjectList.get(0).setName("e"); 7 log.info("{}",objectList); 8 log.info("{}",copyobjectList); 9 }

使用stream

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

1 [@Test](https://my.oschina.net/azibug) 2 public void withStream(){ 3 4 List<CustBook> objectList=new ArrayList<>(Arrays.asList(new CustBook("a"),new CustBook("b"),new CustBook("c"))); 5 List<CustBook> copyobjectList=objectList.stream().collect(Collectors.toList()); 6 copyobjectList.get(0).setName("e"); 7 log.info("{}",objectList); 8 log.info("{}",copyobjectList); 9 10 }

总结

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

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

欢迎关注我的公众号:程序那些事,更多精彩等着您! 更多内容请访问 www.flydean.com

点赞
收藏

评论区

加载中...

相关推荐

Oracle 分组与拼接字符串同时使用

SELECTT.,ROWNUMIDFROM(SELECTT.EMPLID,T.NAME,T.BU,T.REALDEPART,T.FORMATDATE,SUM(T.S0)S0,MAX(UPDATETIME)CREATETIME,LISTAGG(TOCHAR(

手写Java HashMap源码

HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程22

java几个类的简单使用

RandomRandom类用来创建一个新的随机数生成器。对象数组ArrayList集合的长度是可以随意改变的。ArrayList<E这个<E代表泛型泛型:装在集合当中的所有元素,全部都是统一的类型。泛型只能是引用类型,不能使用基本元素。importjava.util.ArrayList;

java ArrayList集合

ArrayList集合是程序中最常见的一种集合,它属于引用数据类型(类)。在ArrayList内部封装了一个长度可变的数组,当存入的元素超过数组长度时,ArrayList会在内存中分配一个更大的数组来存储这些元素,因此可以将ArrayList集合看作一个长度可变的数组。集合的创建格式导包:importjava.util.ArrayList;

ArrayList底层

一、ArrayList集合底层数据结构1.ArrayList集合介绍List集合的可调整大小数组实现。2.数组结构介绍增删快:每次增加删除元素,都需要更改数组长度、拷贝以及移除元素位置。查询快:由于数组在内存中是一块连续空间,因此可以根据地址索引的方式快速获

Java 集合遍历与循环多种方式

前言Java中集合是非常常用非常重要的,应用是十分广泛的,作为集合这种数据结构,遍历循环方式也有很多种我们可以梳理总结不同的遍历方式,方便理解和运用List遍历方式1.List继承了Collection,是有序的列表。2.实现类有ArrayList、LinkedList、Vector、Stack等1.ArrayList是基于数组实现的,是