今天在使用ArrayList的时候遇到一个问题,搞了快一个钟头才知道怎么回事,这都是没有好好看API的结果。ArrayList相当于数组的作用,按顺序存放一系列数据,存放的类型可以为任意类型,常用的方法都在API中很好理解,大家可以查看API。
关于复制Java的API中有这样一句话:
.clone()
Returns a shallow copy of this ArrayList instance.
这说明ArrayList 是一种浅表拷贝,只是拷贝表层数据。
但是,到底什么是表层数据的拷贝呢?
看到网上一个例子很贴切:
就好比一个爸爸一个儿子
浅拷贝:你克隆一下,只得到一个爸爸,这是浅
深拷贝:你克隆一下,既得到了爸爸,又得到了儿子,这是深
也就是说如果ArrayList<E>中:
E如果是一个基本数据类型,使用clone()拷贝,能够实现拷贝一个新的值。
但是,如果E是一种复合类型,例如是个类,那么.clone()只是实现了对一个对象引用的拷贝,这个拷贝的ArrayList仍然同原来的ArrayList指向内容相同,一个变了,另一个也跟着变了,并没有实现真正意义上的拷贝,所以所以是一种浅拷贝。
实现ArrayList 深拷贝的方法:(在网上借的)
public List deepCopy(List src) throws IOException, ClassNotFoundException{
ByteArrayOutputStream byteOut = new ByteArrayOutputStream();
ObjectOutputStream out = new ObjectOutputStream(byteOut);
out.writeObject(src);
ByteArrayInputStream byteIn = new ByteArrayInputStream(byteOut.toByteArray());
ObjectInputStream in =new ObjectInputStream(byteIn);
List dest = (List)in.readObject();
return dest;
}
}
也就是把ArrayList的原来的对象进行序列化,之后在进行反序列化读取出来。
因此,使用这种深拷贝方法必须满足集合中的元素能够序列化,必须实现Serializable接口。
分享到:
相关推荐
ArrayList是我们经常会用到的集合类,有时候我们需要拷贝一个ArrayList,今天向大家介绍拷贝ArrayList常用的四种方式。 使用构造函数 ArrayList有个构造函数,可以传入一个集合: public ArrayList(Collection c) {...
如果更改了 ArrayList.Capacity 属性的值,则自动进行内存重新分配和元素复制。 ArrayList 提供添加、插入或移除某一范围元素的方法。在 Array 中,您只能一次获取或设置一个元素的值。 使用 Synchronized 方法...
Java文件夹复制(远程复制(网络传输),用于远程备份文件)(支持文件夹,嵌套子文件夹) import java.io.*; import java.util.*; public class FileSelection { private File rootDirectory;//根目录 private ...
当从ArrayList的中间位置插入或者删除元素时,需要对数组进行复制、移动、代价比较高。因此,它适合随机查找和遍历,不适合插入和删除。 2.Vector与ArrayList一样,也是通过数组实现的,不同的是它支持线程的同步,...
2.如何把一个array复制到arrayList里 foreach( object o in array )arrayList.Add(o); 3.datagrid.datasouse可以连接什么数据源 [dataset,datatable,dataview] dataset,datatable,dataview , IList 4.概述反射和序列...
在Java中,CopyOnWriteArrayList(写入时复制数组列表)是线程安全的集合类,它实现了List接口,并使用了"写入时复制"的策略来保证线程安全性。 CopyOnWriteArrayList的主要特点是:在进行修改操作(例如添加、修改...
当我们修改了ArrayList的容量时,则可以自动进行内存重新分配和元素复制,比如往1号索引位插入n个元素,插入后,元素的索引依次向后n个位置排列,它是动态版本的数组类型。 2.ArrayList提供添加、插入或移除某一...
List<Student> students=new ArrayList(); (Student2)students//在这个表达式(记得光标在表达式里面哦)按下alt+Enter,选中“哟嚯。。。好爽啊”就能自动生成下面代码 for(Student student:students){ Student...
但是从头开始添加或删除条目很慢-在内部,这意味着将所有剩余的条目复制到新数组中。 如果只想在列表末尾添加或删除项目,请使用ArrayList 。 ArrayList内部管理数组。 通过索引访问元素非常快。 在开始处添加项目...
如:List,ArrayList 2. 多态 答Java引用变量分为编译时的类型和运行时的类型编译时类型由声明该变量时使用的类型决定运行时类型由实际赋给该变量的对象决定如果两类型不一致就出现多态 3.阻塞 答当前正在执行的线
List currentList[] =new ArrayList[3]; // 当前的出牌 List playerList[] = new ArrayList[3]; // 定义3个玩家表 List lordList;//地主牌 Card card[] = new Card[56]; // 定义54张牌 JTextField ...
下载解压压缩包,把对应的jar包复制到对应的java安装目录下,重启eclipse,即可运行
自己定义了一个学生类,学生类中存储了学生的所有信息,把学生的年龄提取出来放在一个arraylist中,然后在把arraylist中的复制到int[]中,对int[]进行快速排序。然后将排序后的结果进行循环遍历,把该学生类的全部...
2.将D:/Employee.txt文件用程序复制到项目根目录; 3.读取项目根目录下的文件Employee.txt内容存入ArrayList 4.以工号为键,员工姓名为值存入HashMap,String>中.再遍历输出Map集合中的内容; 5.当公司记录该信息的...
2.如何把一个array复制到arrayList里 foreach( object o in array )arrayList.Add(o); 3.datagrid.datasouse可以连接什么数据源 [dataset,datatable,dataview] dataset,datatable,dataview , IList 4.概述反射和序列...
自定义webview长按文本弹出选项,并且点击后返回选项与所选中的文本,你的webview不再只支持系统的复制等功能了,长按web文本实现文本一键收藏、分享,就是这么简单。Demo中附带对webView的详细使用:api详解,配置...
在这种情况下,所有元素都从一个数组复制到另一个数组,这需要 O(n) 时间。 那么为什么我们不说添加到 ArrayList 是 O(n) 时间? 因为增长的操作会在所有数组推送中摊销。 每个元素被推送一次并复制一次。 因此,...
这个源码主要是对我的Jsoup笔记进行整合,初步实现saz格式文件到csv文件转换的基本...6、Java类集:List,ArrayList,Iterator 7、Java中正则表达式的使用 8、Java工程如何打包成双击即可以执行的jar文件 、bat文件
Python中的列表(list)类似于C#中的可变数组(ArrayList),用于顺序存储结构。 创建列表 复制代码 代码如下:sample_list = [‘a’,1,(‘a’,’b’)] Python 列表操作 复制代码 代码如下:sample_list = [...
List是python中的基本数据结构之一,和Java中的ArrayList有些类似,支持动态的元素的增加。list还支持不同类型的元素在一个列表中,List is an Object。 最基本的创建一个列表的方法 复制代码 代码如下:myList = [...