ArrayList和LinkedList源码探究

ArrayList和LinkedList源码探究首先,ArrayList和LinkedList都是Java集合框架中List的子类,在面试过程中我们经常被问到这两个有什么不同?最常见的回答无非是ArrayList查询比较快,增删改比较慢。而LinkedList查询比较慢,增删改比较快。大多数人都能答道这点,但是为什么两个都是list,但是一个查询快另一个查询慢呢?ArrayList这就要从它的底层数据结构入手了,从源码可以看出,lis…

大家好,欢迎来到IT知识分享网。

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

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

  • ArrayList

    这就要从它的底层数据结构入手了,从源码可以看出,list的底层数据结构是一个EMPTY_ELEMENTDATA数组来存储ArrayList的值
    在这里插入图片描述
    而且从源码看得出来,数组的默认初始容量为10

在这里插入图片描述
只要拥有数据结构基础的小伙伴都应该知道数组是一块连续的内存空间,可以被随机访问,但是链表内存空间不一定连续,所以造成链表只能顺序访问。

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

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
ArrayList新增数据时,如果增加数据后的值返回数组的当前容量。

去除一个数据,把后面的数据整体前移
在这里插入图片描述
ArrayList的扩容,首先获取elementData的长度,计算一个newCapacity为oldCapacity的1.5倍。再判断newCapacity和oldCapacity,MAX_ARRAY_SIZE的关系。
在这里插入图片描述

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

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
remove的话首先从first节点遍历到要删除的节点,然后修改前一个指针的next节点指向被删节点的next节点。

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

免责声明:本站所有文章内容,图片,视频等均是来源于用户投稿和互联网及文摘转载整编而成,不代表本站观点,不承担相关法律责任。其著作权各归其原作者或其出版社所有。如发现本站有涉嫌抄袭侵权/违法违规的内容,侵犯到您的权益,请在线联系站长,一经查实,本站将立刻删除。 本文来自网络,若有侵权,请联系删除,如若转载,请注明出处:https://yundeesoft.com/15212.html

(0)

相关推荐

发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注

关注微信