ArrayList源码分析

简介: ArrayList源码分析

ArrayList 是 Java 集合框架中的一个动态数组实现类,它基于数组实现了可变长度的列表。

  1. 内部数组存储:
private transient Object[] elementData;
  1. 添加元素:
public boolean add(E e) {
    ensureCapacityInternal(size + 1);  // 确保容量足够
    elementData[size++] = e;  // 将元素添加到数组末尾
    return true;
}
  1. 获取元素:
public E get(int index) {
    rangeCheck(index);  // 检查索引范围是否有效
    return elementData(index);
}
@SuppressWarnings("unchecked")
E elementData(int index) {
    return (E) elementData[index];
}
  1. 删除元素:
public E remove(int index) {
    rangeCheck(index);
    modCount++;  // 修改操作计数器
    E oldValue = elementData(index);
    int numMoved = size - index - 1;
    if (numMoved > 0)
        System.arraycopy(elementData, index + 1, elementData, index, numMoved);
    elementData[--size] = null;  // 将最后一个元素置为null,协助垃圾回收
    return oldValue;
}
  1. System.arraycopy() 是 Java 中的一个数组复制方法,用于将一个数组中的一部分元素复制到另一个数组中。
public static native void arraycopy(Object src, int srcPos, Object dest, int destPos, int length);
  1. 参数解释:

 

  • src:源数组,即要复制的原始数组。
  • srcPos:源数组中复制的起始位置索引。
  • dest:目标数组,即要将数据复制到的目标数组。
  • destPos:目标数组中放置的起始位置索引。
  • length:要复制的元素个数。

5.扩容机制 :

private void ensureCapacityInternal(int minCapacity) {
    if (elementData == DEFAULTCAPACITY_EMPTY_ELEMENTDATA) {
        minCapacity = Math.max(DEFAULT_CAPACITY, minCapacity);  // 使用默认容量和所需容量的较大值
    }
    ensureExplicitCapacity(minCapacity);
}
private void ensureExplicitCapacity(int minCapacity) {
    modCount++; // 增加修改操作计数器
    if (minCapacity - elementData.length > 0) 
        grow(minCapacity);  // 扩容
}
private void grow(int minCapacity) {
    int oldCapacity = elementData.length;
    int newCapacity = oldCapacity + (oldCapacity >> 1);  // 扩容为原容量的1.5倍
    if (newCapacity - minCapacity < 0)
        newCapacity = minCapacity;
    if (newCapacity - MAX_ARRAY_SIZE > 0)
        newCapacity = hugeCapacity(minCapacity);
    elementData = Arrays.copyOf(elementData, newCapacity);  // 数组复制
}

ArrayList 在添加元素时会动态扩容,即当元素数量超过当前内部数组的容量时,会调用 grow() 方法进行容量的扩增。grow() 方法会根据原有容量计算出新的容量,并使用 Arrays.copyOf() 方法将原数组复制到新的数组中。

这是 ArrayList 的一些关键源码解析。它实现了动态数组,通过数组来存储元素,并提供了添加、获取和删除等操作。扩容机制保证了列表能够适应不断变化的元素数量。


目录
相关文章
|
2月前
ArrayList源码解读
ArrayList源码解读
10 1
|
2月前
|
存储 算法
HashMap源码分析
HashMap源码分析
|
11月前
|
存储 Java
HashMap 的 源码分析
HashMap 的 源码分析
68 0
|
存储 Java 容器
一文带你进行ArrayList 源码分析
一文带你进行ArrayList 源码分析
10876 1
|
12月前
|
存储 安全 Java
源码剖析之ArrayList
ArrayList 是一个数组队列,相当于 动态数组。与Java中的数组相比,它的容量能动态增长。它继承于AbstractList,实现了List, RandomAccess, Cloneable, java.io.Serializable这些接口。
68 0
ArrayList与LinkedList获取指定元素对比(源码分析)
ArrayList与LinkedList获取指定元素对比(源码分析)
65 0
|
存储 Java
LinkedList源码分析
Java中List是一个必须要掌握的基础知识,List是一个接口,实现List接口的基础类有很多,其中最具有代表性的两个:ArrayList和LinkedList。
212 0
LinkedList源码分析
|
存储 索引
ArrayList与LinkedList区别源码分析
1、ArrayList是基于数组,LinkedList是基于链表 2、基于数组的ArrayList对于根据索引值查找比较高效;基于链表的LinkedList对于增加、删除操作比较高效 3、剖析CRUD:
197 0
|
存储 缓存 Java
ArrayList源码浅析
Java中List是一个必须要掌握的基础知识,List是一个接口,实现List接口的基础类有很多,其中最具有代表性的两个:ArrayList和LinkedList。
149 0
|
存储 安全 Java
java集合系列(3)ArrayList(源码分析)
这篇文章开始介绍ArrayList。ArrayList基本上是我们在平时的开发当中,使用最多的一个集合类了,它是一个其容量能够动态增长的动态数组。所以这篇文章,旨在从源码的角度进行分析和理解。为了使得文章更加有条理,还是先给出这篇文章的大致脉络: 首先,ArrayList的基本介绍和源码API(只给出方法分析,重要的方法给出详细代码)。 然后,介绍遍历ArrayList的几种方式 接下来,叙述一下ArrayList与其他集合关键字的区别和优缺点 最后,进行一个总结
224 0
java集合系列(3)ArrayList(源码分析)