为了能到远方,脚下的每一步都不能少.|

岁月记忆

园龄:3年8个月粉丝:2关注:3

集合框架部分源码分析

ArrayList

ArrayList add方法源码分析

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 中国大陆许可协议进行许可。

posted @   岁月记忆  阅读(141)  评论(0编辑  收藏  举报
点击右上角即可分享
微信分享提示
评论
收藏
关注
推荐
深色
回顶
收起