Java基础——List集合整理(脑图,源码,面试题)

常在知乎牛客网关注Java的一些面试,了解过校招社招常面哪些内容。Java集合不只使用频率高并且在初面中也经常被问到,何止是经常,关于ArrayList的扩容,HashMap的一些底层等等都被问到烂了。所以,稍微深刻学习下集合这部分迫在眉睫。如下为本身的一些知识点总结与网上搜刮来的面试题总结。html

1.集合的引入 面试

数组大小固定且只可以存储同一种类型的元素,集合容量可动态改变。api

数组能存储基本数据类型和引用类型,集合只能存储引用类型(你存储的是int,会自动装箱成Integer)数组

2.掌握集合的体系结构 安全

引用自CSDN:https://blog.csdn.net/haovip123/article/details/45423683源码分析

3.掌握以ArrayList为表明的增删改查和一些其余API的使用 post

ArrayList能够说是使用频率很高的集合,掌握以它为表明的经常使用API的使用,如add,addAll,remove,遍历等。 性能

4.源码分析List集合之ArrayList与Vector的剖析学习

具体的细节不予多讲,前辈们都在源码的基础上剖析总结的很是细致,在他们的基础上学习便可。附链接spa

https://blog.csdn.net/panweiwei1994/article/details/76760238

https://blog.csdn.net/panweiwei1994/article/details/77110354

https://blog.csdn.net/zymx14/article/details/78324464

http://www.javashuo.com/article/p-csdeqcso-dm.html

重点小结:

ArrayList集合与Vector集合的区别?

ArrayList与Vecto都实现了List接口,具备元素有序容许重复和为null的特色。底层都采用数组,具备数组增删慢,查询快的特色。主要区别是Vector集合(只作了简单了解)给全部的api都套上了synchronized修饰,因此Vector集合是同步的,在线程上安全的,但有得必有失,失去的是代码在实现同步时间花销大(有些操做你不须要进行同步操做它也给你进行了这是它最大的缺点)。其次在实现动态扩容时,ArrayList是原来的1.5倍而Vector是原来的2倍。

关于ArrayList的扩容是如何实现的原理是什么?

首先明确ArrayList的构造方法有三种,默认的initCapacity容量为10,若是初始化时一开始指定了容量,或者经过集合做为元素,则容量为指定的大小或参数集合的大小。每次扩容为原来的1.5倍,若是扩容后的容量小于所需的最小容量,则数组容量为所需的最小容量。若是扩容后的容量大于所需的最小容量,则数组容量为扩容后的容量。 每次扩容后都要调用arraycopy    ,涉及到整个数组的复制和移动。因此要尽可能减小扩容的次数提升效率,在数据量比较大的时候初始化时指定容量的大小。

LinkedList的底层与经常使用方法实现的了解

LinkedList也实现了List接口,有序且容许元素重复和为null值,底层是双向链表,具备链表增删效率高和查询效率慢的特色。虽然它在查询实现时采用了折半查找提升效率的思想,但在查询上仍是比不过按索引查的ArrayList.作过单链表,双向链表练习的人应该再看LinkedList源代码感到很熟悉。

5.List集合面试题总结:

结合源代码与上面贴的博客连接认真看完,在回答下面的List集合的面试题就比较自信了。以前有整理过,此次在整理过一遍,答案见:

http://www.javashuo.com/article/p-vevncfnn-bn.html

1.请比较ArrayList集合与Vector的区别?

2.往ArrayList集合加入一万条数据,应该怎么提升效率?

3. ArrayList插入删除必定很慢吗?

4.ArrayList的遍历和LinkedList遍历性能比较如何?

5. ArrayList是如何扩容的\ArrayList是如何实现自动增长的?

6. 什么状况下你会使用ArrayList?何时你会选择LinkedList?

7. 如何复制某个ArrayList到另外一个ArrayList中去?

8. 在索引中ArrayList的增长或者删除某个对象的运行过程?效率很低吗?解释一下为何?

9. ArrayList list = new ArrayList(20);中的list扩充_____次。

10.下列代码判读扩容了几回?

每一次的add都要检查容量是否足够,这里使用for循环一个个增长元素,因此扩容过程为20->30->45->67,3次。

11.有以下代码,判断list最后容量的大小。    

可知list初始化为5个容量,以后一次性增长15个容量,第一次扩容为10,以后发现15>10,因此15为数组的新容量。调用debug咱们能够查看

相关文章
相关标签/搜索