Arraylist和Linkedlist的区别

本文详细对比了ArrayList和LinkedList两种数据结构的特点与应用场景。ArrayList基于动态数组实现,适合频繁查询和固定位置插入删除操作;而LinkedList基于双向链表,适用于频繁的元素增删操作。文章还介绍了它们的底层实现原理,如ArrayList的扩容机制和LinkedList的双向链表特性。
摘要由CSDN通过智能技术生成

参考:https://blog.csdn.net/weixin_42468526/article/details/81178698

 

总的来说:

ArrayList初始大小为10,每次1.5倍进行扩容;它的底层是用数组实现的,所以查询速度相对LinkedList要快。

2.LinkedList解说

(1)* LinkedList 是一个继承于AbstractSequentialList的双向链表。它也可以被当作堆栈、队列或双端队列进行操作。
         * LinkedList 实现 List 接口,能对它进行队列操作。
         * LinkedList 实现 Deque 接口,即能将LinkedList当作双端队列使用。
         * LinkedList 实现了Cloneable接口,即覆盖了函数clone(),能克隆。
         * LinkedList 实现java.io.Serializable接口,这意味着LinkedList支持序列化,能通过序列化去传输。
         * LinkedList 是非同步的。

  由于它的底层是用双向链表实现的,所以它对元素的增加、删除效率要比ArrayList好;它是一个双向链表,没有初始化大小,也没有扩容的机制,就是一直在前面或者后面新增就好。
 

Arraylist:底层是基于动态数组,向数组尾部添加元素的效率高,但删除数组元素及向中间添加数据效率低,

因需要移动数组。

而之所以称为动态数组,是因为Arraylist在数组元素超过其容量大,Arraylist可以进行扩容(针对JDK1.8  数组扩容后的容量是扩容前的1.5倍),Arraylist源码中最大的数组容量是Integer.MAX_VALUE-8,对于空出的8位,目前解释是 :①存储Headerwords;②避免一些机器内存溢出,减少出错几率,所以少分配③最大还是能支持到Integer.MAX_VALUE(当Integer.MAX_VALUE-8依旧无法满足需求时)

 数组添加元素:

指定位置添加元素:

  /**
     * Inserts the specified element at the specified position in this
     * list. Shifts the element currently at that position (if any) and
     * any subsequent elements to the right (adds one to their indices).
     *
     * @param index index at which the specified element is to be inserted
     * @param element element to be inserted
     * @throws IndexOutOfBoundsException {@inheritDoc}
     */
    public void add(int index, E element) {
        rangeCheckForAdd(index);

        ensureCapacityInternal(size + 1);  // Increments modCount!!
        System.arraycopy(elementData, index, elementData, index + 1,
                         size - index);
        elementData[index] = element;
        size++;
    }

Linkedlist基于链表的动态数组,数据添加删除效率高,只需要改变指针指向即可,但是访问数据的平均效率低,需要对链表进行遍历。

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值