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

时间:2024-07-01 00:04:50

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

1.集合的引入

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

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

2.掌握集合的体系结构

引用自****:https://blog.****.net/haovip123/article/details/45423683

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

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

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

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

具体的细节不予多讲,前辈们都在源码的基础上剖析总结的非常细致,在他们的基础上学习即可。附连接

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

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

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

https://juejin.im/post/5ad40593f265da23750759ad

重点小结:

ArrayList集合与Vector集合的区别?

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

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

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

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

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

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

5.List集合面试题总结:

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

https://www.cnblogs.com/zengcongcong/p/10805799.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.下列代码判读扩容了几次?

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

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

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

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

可知list初始化为5个容量,之后一次性增加15个容量,第一次扩容为10,之后发现15>10,所以15为数组的新容量。调用debug我们可以查看

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