欢迎光临散文网 会员登陆 & 注册

千锋教育Java入门全套视频教程(java核心技术,适合java零基础,Java

2023-07-24 11:03 作者:bili_12581762483  | 我要投稿

ArrayList 底层是一个object数组elementData 存储元素

无参构造this.elementData = DEFAULTCAPACITY_EMPTY_ELEMENTDATA;将里面的数组赋值成一个空数组

add()方法

 public boolean add(E e) {
    ensureCapacityInternal(size + 1); //size 实际集合存储元素的个数
    elementData[size++] = e;//存储元素
    return true;
 }
private void ensureCapacityInternal(int minCapacity) {
  ensureExplicitCapacity(calculateCapacity(elementData, minCapacity));//calculateCapacity计算集合容量 
}
private static int calculateCapacity(Object[] elementData, int minCapacity) {
    if (elementData == DEFAULTCAPACITY_EMPTY_ELEMENTDATA) {
      return Math.max(DEFAULT_CAPACITY, minCapacity);//如果集合是空数组 ,返回 默认最小的集合长度10与实际需要的集合长度size+1的较大值
   }
    return minCapacity;//不是空集合,就返回size+1
 }
  private void ensureExplicitCapacity(int minCapacity) {
    modCount++;

    // overflow-conscious code
    if (minCapacity - elementData.length > 0)
      grow(minCapacity);//如果计算的长度大于集合的长度,就扩容,grow扩容集合长度
 }
  private void grow(int minCapacity) {
    // overflow-conscious code
    int oldCapacity = elementData.length;
    int newCapacity = oldCapacity + (oldCapacity >> 1);//集合长度的1.5倍
    if (newCapacity - minCapacity < 0)//如果新长度小于size+1
      newCapacity = minCapacity;
    if (newCapacity - MAX_ARRAY_SIZE > 0)
      newCapacity = hugeCapacity(minCapacity);
    // minCapacity is usually close to size, so this is a win:
    elementData = Arrays.copyOf(elementData, newCapacity);//数组拷贝,将原先数组内容拷贝到新长度的数组,再将新数组的地址赋给elementData
 }

结论:第一次添加数据的时候,数组扩容为10,以后每次扩容的时候长度为原本数组长度的1.5倍

带参的构造可以指定数组的长度,以后再添加数据的时候避免频繁的扩容

千锋教育Java入门全套视频教程(java核心技术,适合java零基础,Java的评论 (共 条)

分享到微博请遵守国家法律