ArrayList 和 LinkedList 比较

文章详细介绍了ArrayList的底层数据结构为Object数组,讨论了其添加、删除操作的时间和空间效率,尤其强调了扩容机制。LinkedList则被描述为一种带有链表头的双向链表,其增删操作的优势在于无需数据移动,而查询速度相对较慢。
摘要由CSDN通过智能技术生成

1、ArrayList 

底层数据结构为 Object 类型数组,所有可以添加到底层数组数据的方法,都有对应的泛型约束,保证数据类型,支持多样性的同时,满足数据类型完全一致化(add addAll set) ,同时获取集合底层数组数据的方法返回值类型也有对应的泛型约束,满足数据类型一致化(remove(int) set get)

底层 Object 类型数组依赖于 grow 方法可以满足容量扩容操作,每次扩容的容量大约是原容量的1.5倍左右,如果扩容1.5倍无法满足当前需求,就按照当前添加操作所需的最小容量来进行新数组创建和扩容操作

 ArrayList 构造方法
            ArrayList(); 底层 Object 数组默认容量为 10 DEFAULT_CAPACITY 
            ArrayList(int initCapacity);

性能:

     增删慢

                1、增加操作有可能触发底层数组扩容,扩容操作对于【时间效率较低】

                        【空间效率较低】

                2、除增加操作在数组的末尾【尾插法】对于性能影响不大,如果在数组指定下

                标位置添加元素,数组中的元素内容整体向后移动,移动过程【时间效率较低】

                3、删除操作在数组的末尾进行删除操作,性能ok,但是一旦删除数组中的指定

                 下标操作,数组中的元素整体向前移动,移动过程中【时间效率底】

                4、删除操作有可能会导致数组有效元素个数和总容量的比例降低,同时有可能

                  触发空闲容量超出【阈值】

        查询快

                底层为数组结构,数据存储空间连续,且可以根据下标+数组首地址方式快速计

                算元素所在的空间位置,CPU快速寻址,效率极高。

2、LinkedList

带有链表头的双向链表结构

class LinkedList {

        Node<E> first;

        Node<E> last;

        int size;

}

class Node<E> {

        Node<E> prev;

        E e;

        Node<E> next;

}

 性能

        增删快

                增加和删除操作节点。有且只是对于节点直接的进行赋值操作,调正结点中

                next 和 prev 指向关系,不涉及数据移动和底层数据扩容

        查询慢

                如果操作LinkedList 中间的结点元素,我们需要从头节点或者尾结点开始挨个跳

                转找到目标元素,效率极低,但是操作头节点和尾结点效率极高

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值