ArrayList源码中public方法详解

本文详细介绍了集合的基本操作,包括但不限于:获取集合元素数量、检查集合是否为空、添加与删除元素、查询元素位置等,并提供了多种实用的方法说明。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1、int size() 返回当前集合中元素的数量
2、void trimToSize() 去除集合两端的null
3、 boolean isEmpty() 返回当前集合是否为空
4、 boolean contains(Object o) 返回当前集合中是否包含参数指定的元素
5、 int indexOf(Object o) 返回参数元素在集合中从左到右第一次匹配的下标位置,存在int值返回(0~size-1),不存在返回-1
6、 int lastIndexOf(Object o) 返回参数元素在集合中从右到左第一次匹配的下标位置,存在返回(0~size-1),不存在返回-1
7、 E get(int index) 获取集合中,参数指定下标位置的元素。如果下标越界,会抛下标越界异常。
8、 E set(int index, E element)
替换参数1指定下标位置的元素为参数2的元素。如果下标越界,会抛下标越界异常。
9、 boolean add(E e)
向集合元素尾部追加参数元素对象
10、 void add(int index, E element)
向集合中参数1指定的位置插入参数2指定的对象。
11、 boolean addAll(Collection<? extends E> c)
向集合尾部追加参数集合中的所有有效元素
12、 boolean addAll(int index, Collection<? extends E> c)
向集合中参数1指定的位置插入参数2集合中包含的所有元素。下标越界<0 或者>size
13、 boolean remove(Object o)
从集合中移除第一个出现与参数元素匹配的元素,不存在返回false。存在移除并返回true。
14、 E remove(int index)
从集合中移除参数指定位置的元素。下标越界
15、 boolean removeAll(Collection<?> c)
从集合中移除参数集合中所有能匹配的元素
16、 boolean removeIf(Predicate<? super E> filter)
移除集合中符合参数过滤器特征的元素
17、 void removeRange(int fromIndex,int toIndex)
移除集合中从参数1指定的下标开始(前包含)到参数2指定的下标位置结束(后不包含)的所有元素
boolean retainAll(Collection<?> c)
18、 保留集合中参数集合指定的元素或者移除集合中和参数集合不匹配的所有元素
19、 void replaceAll(UnaryOperator operator)
将集合中所有元素替换成参数操作符操作后的元素
20、 Object clone()
将当前集合克隆一个副本
21、 void clear()
移除集合中所有列表有效元素,size为0
22、 void forEach(Consumer<? super E> action)
以迭代的方式逐一去操作集合元素
23、 void sort(Comparator<? super E> c)
以参数提供的比较器对集合中的元素进行排序
24、 ListIterator listIterator(int index)
返回的是双向迭代器。从列表中指定的位置开始返回列表中的元素的列表迭代器

下标越界<0或者>size
25、 ListIterator listIterator()
从0开始,按当前集合中现有的元素进行迭代(双向迭代)
26、 Iterator iterator()
返回当前集合的双向迭代器
27、 Spliterator spliterator()
分割迭代。将集合中的元素分裂成多个迭代器对象返回
28、 List subList(int fromIndex, int toIndex)
将当前集合中从参数1指定位置开始(前包含)到参数2指定位置结束(后不包含)的元素提取包装成另一个集合返回。(保持当前集合不变)
29、 Object[] toArray()
将当前集合中的所有元素转化成顶级Object类型对象数组返回
30、 T[] toArray(T[] a)
将集合中的元素依次存入参数数组中并返回。

### Java `ArrayList` 源码详解 #### 一、类定义与继承关系 `ArrayList` 是实现了 `List` 接口的一个动态数组实现。其内部维护了一个对象数组作为存储容器,允许随机访问元素并支持高效的迭代操作[^1]。 ```java public class ArrayList<E> extends AbstractList<E> implements List<E>, RandomAccess, Cloneable, java.io.Serializable { private static final long serialVersionUID = 8683452581122892189L; } ``` #### 二、底层数据结构 `ArrayList` 的核心在于它使用了 Object 数组来保存所有的元素: ```java transient Object[] elementData; // non-private to simplify nested class access ``` 当创建一个新的 `ArrayList` 实例时,默认容量为空,即不分配任何空间给 `elementData`;只有在第一次添加元素时才会初始化默认大小为 10 的数组[^2]。 #### 三、扩容机制 每当向列表中追加新项而当前容量不足以容纳这些新增项目时,就会触发一次扩容过程。具体来说,会按照现有长度的一半增加新的容量,并将旧的数据复制到更大的内存区域中去[^3]。 ```java private void grow(int minCapacity) { int oldCapacity = elementData.length; int newCapacity = oldCapacity + (oldCapacity >> 1); if (newCapacity - minCapacity < 0) newCapacity = minCapacity; ... elementData = Arrays.copyOf(elementData, newCapacity); } ``` #### 四、常用方法解析 ##### 添加元素 (`add(E e)`) 此方法用于在列表末尾插入指定元素。如果必要的话还会调用前面提到过的 `grow()` 函数来进行自动扩展。 ```java public boolean add(E e) { ensureCapacityInternal(size + 1); elementData[size++] = e; return true; } ``` ##### 获取元素 (`get(int index)`) 通过索引快速定位所需位置上的值,时间复杂度 O(1),因为可以直接计算出目标地址。 ```java public E get(int index) { rangeCheck(index); return elementData(index); } ``` ##### 删除元素 (`remove(int index)`) 移除特定下标的成员并将后续部分向前移动一位填补空缺,平均情况下需要线性扫描整个序列完成调整工作。 ```java 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; // clear to let GC do its work return oldValue; } ``` #### 五、遍历方式 除了传统的基于索引循环外,还可以利用增强型for-each语句或是 Iterator 来高效地处理大量连续排列的对象实例集合。 ```java // 使用Iterator遍历 Iterator<String> it = list.iterator(); while(it.hasNext()){ String str = it.next(); } // 或者更简洁的方式 for(String s : list){ } ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值