大家好,我是IT修真院深圳分院第十二期学员,一枚正直纯洁善良的JAVA程序员。
今天给大家分享一下,修真院官网JAVA任务十的一个知识点:List集合
深入学习网址:http://www.jnshu.com/login/1/12744596
愿不再有程序渣,我们只生产代码,而不是生产BUG。
1.背景介绍
2.知识剖析
3.常见问题
4.解决方案
5.编码实战
6.扩展思考
7.参考文献
8.更多讨论
1.背景介绍
集合,或者叫容器,是一个包含多个元素的对象;集合可以对数据进行存储,检索,操作;集合的作用就是以一定的方式组织、存储数据。集合类存放于java.util包中。而我们使用的一些集合都是实现的java.util.Collection 这个集合接口。 集合类型主要有3种:set(集)、list(列表)和map(映射)。
2.知识剖析
2.1.对于集合需要关注的四个点
2.2.ArrayList源码分析
2.3.ArrayList的优缺点
2.4.ArrayList和Vector的区别
2.1.对于集合需要关注的四个点
1、是否允许空
2、是否允许重复数据
3、是否有序,有序的意思是读取数据的顺序和存放数据的顺序是否一致
4、是否线程安全
关 注 点 | 结 论 |
ArrayList是否允许空 | 允许 |
ArrayList是否允许重复数据 | 允许 |
ArrayList是否有序 | 有序 |
ArrayList是否线程安全 | 非线程安全 |
2.2.ArrayList源码分析
2.3.ArrayList的优缺点
1、ArrayList底层以数组实现,是一种随机访问模式,再加上它实现了RandomAccess接口,因此查找也就是get的时候非常快
2、ArrayList在顺序添加一个元素的时候非常方便,只是往数组里面添加了一个元素而已
不过ArrayList的缺点也十分明显:
1、删除元素的时候,涉及到一次元素复制,如果要复制的元素很多,那么就会比较耗费性能
2、插入元素的时候,涉及到一次元素复制,如果要复制的元素很多,那么就会比较耗费性能
因此,ArrayList比较适合顺序添加、随机访问的场景。
3.常见问题
3.1.ArrayList是线程不安全的,那么想保证线程安全应该用什么?
3.2.ArrayList删除的速度较慢,为什么?
3.3.ArrayList的容量必须满足1.5倍扩容么?
4.解决方案
4.1.ArrayList是线程不安全的,那么想保证线程安全应该用什么?
ArrayList是线程非安全的,这很明显,因为ArrayList中所有的方法都不是同步的,在并发下一定会出现线程安全问题。那么我们想要使用ArrayList并且让它线程安全怎么办?一个方法是用
//Collections.synchronizedList方法把你的ArrayList变成一个线程安全的List,比如:
List<String>synchronizedList=Collections.synchronizedList(list);
synchronizedList.add("aaa");
synchronizedList.add("bbb");
for(inti=0;i<synchronizedList.size();i++){
System.out.println(synchronizedList.get(i));
}
另一个方法就是Vector,它是ArrayList的线程安全版本,其实现90%和ArrayList都完全一样,区别在于:
1、Vector是线程安全的,ArrayList是线程非安全的
2、Vector可以指定增长因子,如果该增长因子指定了,那么扩容的时候会每次新的数组大小会在原数组的大小基础上加上增长因子;如果不指定增长因子,那么就给原数组大小*2,源代码是这样的:
intnewCapacity=oldCapacity+((capacityIncrement>0)?
capacityIncrement:oldCapacity);
4.2.ArrayList删除的速度较慢,为什么?
因为ArrayList在删除的时候,需要将该元素之后的所有元素全部往前移,也就是说除了删除这个元素之外,还需要做很多额外的操作,所以耗时较久
4.3.ArrayList的容量必须满足1.5倍扩容么?
是的,因为源码中已经写死了相关机制。
//以下为源码privatevoidgrow(intminCapacity){//overflow
-consciouscodeintoldCapacity=elementData.length;
//分析这一步,就可以得出新容量值是旧容量值的1.5倍intnewCapacity=oldCapacity
+(oldCapacity>>1);if(newCapacity-minCapacity<0)newCapacity
=minCapacity;if(newCapacity-MAX_ARRAY_SIZE>0)newCapacity=hugeCapacity
(minCapacity);//minCapacityisusuallyclosetosize,sothisisawin
:elementData=Arrays.copyOf(elementData,newCapacity);}
5.编码实战
6.扩展思考
7.参考文献
CSDN、百度百科
8.更多讨论
8.1.什么情况下你会使用ArrayList?什么时候你会选择LinkedList?
这又是一个大多数面试者都会困惑的问题。多数情况下,当你遇到访问元素比插入或者是删除元素更加频繁的时候,你应该使用ArrayList。另外一方面,当你在某个特别的索引中,插入或者是删除元素更加频繁,或者你压根就不需要访问元素的时候,你会选择LinkedList。这里的主要原因是,在ArrayList中访问元素的最糟糕的时间复杂度是”1″,而在LinkedList中可能就是”n”了。在ArrayList中增加或者删除某个元素,通常会调用System.arraycopy方法,这是一种极为消耗资源的操作,因此,在频繁的插入或者是删除元素的情况下,LinkedList的性能会更加好一点。
8.2.如何复制某个ArrayList到另一个ArrayList中去?写出你的代码?
下面就是把某个ArrayList复制到另一个ArrayList中去的几种技术:
-
使用clone()方法,比如ArrayList newArray = oldArray.clone();
-
使用ArrayList构造方法,比如:ArrayList myObject = new ArrayList(myTempObject);
-
使用Collection的copy方法。
注意1和2是浅拷贝(shallow copy)。
8.3.Collection和Collections的区别
java.util.Collection 是一个集合接口。它提供了对集合对象进行基本操作的通用接口方法。Collection接口在Java 类库中有很多具体的实现。Collection接口的意义是为各种具体的集合提供了最大化的统一操作方式。
java.util.Collections 是一个包装类。它包含有各种有关集合操作的静态多态方法。此类不能实例化,就像一个工具类,服务于Java的Collection框架。
今天的分享就到这里啦,欢迎大家点赞、转发、留言、拍砖~
技能树.IT修真院
“我们相信人人都可以成为一个工程师,现在开始,找个师兄,带你入门,掌控自己学习的节奏,学习的路上不再迷茫”。
这里是技能树.IT修真院,成千上万的师兄在这里找到了自己的学习路线,学习透明化,成长可见化,师兄1对1免费指导。
快来与我一起学习吧~
腾讯视频: