Day019 集合 ArrayList和一点单链表双链表

ArrayList LInkedList Vector

ArrayList集合

  • 默认初始化的容量是10;(底层 先创建了一个长度为0的数组,当添加第一个元素的时候,初始化的容量是10.)

  • 集合底层是一个Object[]数组

  • 构造方法:

    new ArrayList();

    new ArrayList(20);

    • ArrayList集合的扩容:

image-20210517194052974

  • ArrayList集合的扩容:

    增长到原容量的1.5倍

ArrayList集合底层是数组,优化:尽可能少扩容,因为数组扩容效率比较低,建议在使用ArrayList集合的时候预估计元素的个数,给定一个初始化的容量(这是ArrayList比较重要的优化方式)

  • 数组的优点:检索效率比较高(每个元素占用空间大小相同,内存地址是连续的,知道首元素内存地址,然后知道下标,通过数学表达式计算出元素的内存地址,所以检索效率最高)

 

  • 数组的缺点:随机增删元素效率比较低,向数组末尾添加元素,效率还是高的

另外数组无法存储大数据量(很难找到一块非常巨大的连续的内存空间)

 

  • 面试官经常问的问题?

    • 这么多的集合中,使用哪个集合最多

    • 答:ArrayList集合,因为往数组末尾添加元素,效率不受影响。

    • 另外,我们检索|查找某个元素的操作比较多

     

  • ArrayList不是线程安全的

 

linkedList

对于链表数据结构来说:基本的单元是节点,

每一个节点Node都有两个属性,一个属性是存储的数据

一个是下一节点的内存地址

  • 链表优点:随机增删元素效率较高。(因为增删元素不涉及到大量的元素位移)、

所以随机增删元素的时候不会有大量元素位移,因此随机增删效率比较高,

在以后的开发中,如果遇到了随机增删集合中元素的业务比较多的时候,建议使用LinkedList

 

  • 链表 缺点:查询效率较低,每一次查找某个元素的时候都需要从头节点开始往下遍历

    不能通过数学表达式计算被查找元素的内存地址,每一次查找都是从头节点开始遍历,直到找到为止,所以ArrayList用的比LinkedList多。


    image-20210517203034065

LinkedList集合底层也是有下标的

注意:ArrayList之所以检索效率比较高,不单纯是因为有下标的原因,是因为底层数组发挥的作用,

LinkedList集合照样有下标,但是检索、查找某个元素的效率比较低,因为只能从头节点开始一个一个遍历

双向链表

基本单元还是节点Node

三部分:数据,上节点的内存地址,下一节点的内存地址

头尾节点是null

image-20210517203441513

 

posted @ 2021-05-17 21:53  各人blanknote  阅读(79)  评论(0)    收藏  举报