集合框架部分源码分析
ArrayList
public boolean add(E e) {
// 1
ensureCapacityInternal(size + 1); // Increments modCount!!
// 先将e保存到数组下标为size处,然后在自加,表示数组中保存元素的个数
elementData[size++] = e;
return true;
}
/*
验证数组是否需要扩容
*/
private void ensureCapacityInternal(int minCapacity) {
// 第一次调用add方法时,minCapacity为1
// 如果是第一次对数组扩容,则calculateCapacity方法返回10
ensureExplicitCapacity(calculateCapacity(elementData, minCapacity));
}
private static int calculateCapacity(Object[] elementData, int minCapacity) {
//如果当前保存元素的数组为new ArrayList()调用无参构造给的默认的空数组,则返回10
if (elementData == DEFAULTCAPACITY_EMPTY_ELEMENTDATA) {
// DEFAULT_CAPACITY 默认长度:10
return Math.max(DEFAULT_CAPACITY, minCapacity);
}
return minCapacity;
}
private void ensureExplicitCapacity(int minCapacity) { // 10
modCount++;
// overflow-conscious code
if (minCapacity - elementData.length > 0)
// 对数组扩容
grow(minCapacity); // 10
}
// 对ArrayList集合中的数组进行扩容
private void grow(int minCapacity) {
// 先取出老数组的长度
int oldCapacity = elementData.length; // 0
// 计算新数组的长度: 老长度 + 老长度 / 2, 每次扩容1.5倍
int newCapacity = oldCapacity + (oldCapacity >> 1);
if (newCapacity - minCapacity < 0)
// 如果扩容的长度比传递进来的10还要小,则新数组长度为10
newCapacity = minCapacity;
if (newCapacity - MAX_ARRAY_SIZE > 0)
newCapacity = hugeCapacity(minCapacity);
// minCapacity is usually close to size, so this is a win:
// 将老数组中的元素复制到新数组中,并且将新数组的引用赋给了elementData
elementData = Arrays.copyOf(elementData, newCapacity);
}
LinkedList源码分析
public class LinkedList<E> implements List<E>, Deque<E>{
// 集合中实际保存的元素的个数
transient int size = 0;
// 集合中第一个数据的节点
transient Node<E> first;
// 集合中最后一个数据的节点
transient Node<E> last;
public boolean add(E e) {
// 将数据e插入到集合的末尾
linkLast(e);
return true;
}
void linkLast(E e) {
// 获取最后一个节点
final Node<E> l = last;
// 创建新节点,l为当前节点的上一个节点(last)
final Node<E> newNode = new Node<>(l, e, null);
// 将新节点作为集合中最后一个节点
last = newNode;
// 判断新节点的上一个节点是否为第一个节点
if (l == null)
// 将新节点作为第一个节点
first = newNode;
else
// 新节点的上一个节点不是第一个,则将新节点的上一个节点的下一个节点
// 指向当前的新节点
l.next = newNode;
size++;
modCount++;
}
}
本文作者:岁月记忆
本文链接:https://www.cnblogs.com/huang2979127746/p/16657925.html
版权声明:本作品采用知识共享署名-非商业性使用-禁止演绎 2.5 中国大陆许可协议进行许可。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步