ArrayList和LinkedList源码探究

首先,ArrayList和LinkedList都是Java集合框架中List的子类,在面试过程中我们经常被问到这两个有什么不同?

最常见的回答无非是ArrayList查询比较快,增删改比较慢。而LinkedList查询比较慢,增删改比较快。大多数人都能答道这点,但是为什么两个都是list,但是一个查询快另一个查询慢呢?

  • ArrayList

    这就要从它的底层数据结构入手了,从源码可以看出,list的底层数据结构是一个EMPTY_ELEMENTDATA数组来存储ArrayList的值
    ArrayList和LinkedList源码探究_第1张图片
    而且从源码看得出来,数组的默认初始容量为10

ArrayList和LinkedList源码探究_第2张图片
只要拥有数据结构基础的小伙伴都应该知道数组是一块连续的内存空间,可以被随机访问,但是链表内存空间不一定连续,所以造成链表只能顺序访问。

ArrayList的增加和删除元素也就是对数组进行操作,增加的时候在数组中最后面的元素进行下标后移,删除或添加元素则把指定下标元素移除,后面元素向前或向后移动。

ArrayList和LinkedList源码探究_第3张图片
ArrayList和LinkedList源码探究_第4张图片
ArrayList和LinkedList源码探究_第5张图片
ArrayList新增数据时,如果增加数据后的值返回数组的当前容量。

去除一个数据,把后面的数据整体前移
ArrayList和LinkedList源码探究_第6张图片
ArrayList的扩容,首先获取elementData的长度,计算一个newCapacity为oldCapacity的1.5倍。再判断newCapacity和oldCapacity,MAX_ARRAY_SIZE的关系。
ArrayList和LinkedList源码探究_第7张图片

  • LinkedList
    从linkedlist的源码来看,我们知道linkedlist内部维护了一个双向链表,通过pre和next指针进行操作
    ArrayList和LinkedList源码探究_第8张图片
    而且从图中可以看出来,linkedlist的初始值为0,而且貌似没有扩容操作,因为链表可以利用不连续的内存,所以容量大小只内存相关。
    ArrayList和LinkedList源码探究_第9张图片
    linkedlist的add和remove
    ArrayList和LinkedList源码探究_第10张图片
    ArrayList和LinkedList源码探究_第11张图片
    add通过尾插法进行数据的插入

ArrayList和LinkedList源码探究_第12张图片
ArrayList和LinkedList源码探究_第13张图片
ArrayList和LinkedList源码探究_第14张图片
remove的话首先从first节点遍历到要删除的节点,然后修改前一个指针的next节点指向被删节点的next节点。

以上就是对ArrayList的源码和LinkedList源码的一些比较啦,嘿嘿!!

你可能感兴趣的:(Java基础,ArrayList,LinkedList,源码)