ArrayList 与 LinkedList 对比与源码解读

目录

1. 基本概述与对比

1.1 整体对比

特性 ArrayList LinkedList
底层实现 动态数组 双向链表
随机访问 O(1) O(n)
插入删除 O(n) O(1)
内存占用 连续内存空间 零散内存空间
默认容量 10 无初始容量

1.2 数据结构示意图

ArrayList结构:

┌─────┬─────┬─────┬─────┬─────┐
│  0  │  1  │  2  │  3  │  4  │
└─────┴─────┴─────┴─────┴─────┘

LinkedList结构:

┌───┐    ┌───┐    ┌───┐
│ 1 │<-->│ 2 │<-->│ 3 │
└───┘    └───┘    └───┘

2. ArrayList详解

2.1 核心属性

public class ArrayList<E> extends AbstractList<E> {
   
    
    
    // 默认初始容量
    private static final int DEFAULT_CAPACITY = 10;
    
    // 存储元素的数组
    transient Object[] elementData;
    
    // 实际元素数量
    private int size;
    
    // 用于空实例的共享空数组
    private static final Object[] EMPTY_ELEMENTDATA = {
   
    
    };
    
    // 用于默认大小的空实例的共享数组
    private static final Object[] DEFAULTCAPACITY_EMPTY_ELEMENTDATA = {
   
    
    };
}

2.2 动态扩容机制

ArrayList最关键的特性是动态扩容。当数组空间不足时,会创建更大的数组并复制元素。

private void grow(int minCapacity) {
   
    
    
    // 获取旧容量
    int oldCapacity = elementData.length;
    // 新容量 = 旧容量 + 旧容量/2 (增加50%)
    int newCapacity = oldCapacity + (oldCapacity >> 1);
    
    // 如果新容量仍小于需要的容量,直接使用需要的容量
    if (newCapacity - minCapacity < 0)
        newCapacity = minCapacity;
        
    // 如果超过最大数组大小,使用最大值
    if (newCapacity - MAX_ARRAY_SIZE > 0)
        newCapacity = hugeCapacity(minCapacity);
        
    // 创建新数组并复制元素
    elementData = Arrays.copyOf(elementData, newCapacity);

猜你喜欢

转载自blog.csdn.net/weixin_45970964/article/details/144880271