ArrayList 和 LinedList

158 阅读2分钟

ArrayList 和 LinkedList 的区别

1、两个的基于的数据结构不同,ArrayList基于的是数组和LinedList基于的是链表

2、一般来说ArrayList基于的是数组是 增删慢,查快,LinedList基于的是链表 增删快,查慢。

之所以这样说是因为一般 LinedList的增删操作只需要改动前一个节点和后一个节点的前后指向就可以了,效率较高且稳定,而 ArrayList 增删操作通常需要通过拷贝数组方式进行调整,所以效率会比较低。但是这里面也存在一些特殊情况。比如:首先我们知道ArrayList是有个容量和扩容概念的,扩容逻辑是以原本的1.5倍扩容的。基于这个场景就会出现当ArrayList的数组容量本身还有剩余时,是不需要扩容调整复制数组的,仅仅需要在后面加新元素加上即可。

public boolean add(E e) {
   // 如果这一步没扩容,那么直接elementData[size++] = e 没什么效率消耗
    ensureCapacityInternal(size + 1);  
    elementData[size++] = e;
    return true;
}


private void ensureCapacityInternal(int minCapacity) {
    ensureExplicitCapacity(calculateCapacity(elementData, minCapacity));
}

private static int calculateCapacity(Object[] elementData, int minCapacity) {
    if (elementData == DEFAULTCAPACITY_EMPTY_ELEMENTDATA) {
        return Math.max(DEFAULT_CAPACITY, minCapacity);
    }
    return minCapacity;
}


private void ensureExplicitCapacity(int minCapacity) {
    modCount++;

    // overflow-conscious code
    if (minCapacity - elementData.length > 0)
        grow(minCapacity);
}

替换指定位置的元素时,ArrayList比LinkedList更快。
ArrayList:数组[index] = elelement 就可以了,非常的快。
LinkedList:需要先找到inde位置的元素,然后再调整指针的指向。
因此,替换元素时,ArrayList比LinkedList更快。

ArrayList 和 LinkedList 哪个更占空间

LinkedList 是双向链表,需要存储数据本身的同时还需要记录前后地址的两个节点所以占用的空间会相对比ArrayList大。但是还是由于ArrayList的扩容机制问题,扩容之后有可能存在空闲的空间等待着,最多可能浪费将近一半的空间。不过 ArrayList 的 数组elementData是 用transient修饰的, 且重写了writeObject 方法,在序列化的时候并不会把空闲的空间进行序列化。

使用场景

ArrayList 我们比较常用,例如数据库取出数据后的返回结果、接口传参数组等。

LinkedList 使用场景比较经典的就是 LRU缓存机制,因为实现需要频繁调整头部尾部的元素,所以用 LinkedList 很合适,参考资料 juejin.cn/post/699687…