zoukankan      html  css  js  c++  java
  • Java基础——List集合整理(脑图,源码,面试题)

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

    1.集合的引入

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

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

    2.掌握集合的体系结构

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

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

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

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

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

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

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

    https://blog.csdn.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    ,涉及到整个数组的复制和移动。所以要尽量减少扩容的次数提高效率,在数据量比较大的时候初始化时指定容量的大小。

    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.下列代码判读扩容了几次?

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

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

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

  • 相关阅读:
    ini_set /ini_get函数功能-----PHP
    【转】那个什么都懂的家伙
    word 2007为不同页插入不同页眉页脚
    August 26th 2017 Week 34th Saturday
    【2017-11-08】Linux与openCV:opencv版本查看及库文件位置等
    August 25th 2017 Week 34th Friday
    August 24th 2017 Week 34th Thursday
    August 23rd 2017 Week 34th Wednesday
    August 22nd 2017 Week 34th Tuesday
    August 21st 2017 Week 34th Monday
  • 原文地址:https://www.cnblogs.com/zengcongcong/p/11200862.html
Copyright © 2011-2022 走看看