ArrayList扩容机制

  介绍

ArrayList扩容机制?相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。

@Test   公共空间testArrayList () {//创建一个泛型为字符串的数组列表(这里泛型是什么不重要)   ArrayList列表=new ArrayList ();//依次添加11个元素   list.add (“1“);   list.add (“2“);   list.add (“3“);   list.add (“4“);   list.add (“5“);   list.add (“6“);   list.add (“7”);   list.add (“8”);   list.add (“9”);   list.add (“10“);   list.add (“11”);   }

上面的代码中,我们就只调用了添加(),在看()添加源码前,我必须给你们先介绍一些在ArrayList的常量和变量,因为在接下来的源码中会涉及到这些,怕你们到时一脸蒙

私有静态最终int DEFAULT_CAPACITY=10;
  私有静态最终对象[]DEFAULTCAPACITY_EMPTY_ELEMENTDATA=https://www.yisu.com/zixun/{};
  瞬态对象[]elementData;
  私人int大小;
  私有静态最终int MAX_ARRAY_SIZE=整数。MAX_VALUE - 8; 

》DEFAULT_CAPACITY: default_capcity,默认的容量大小,也就是当你第一次创建数组并往里面添加第一个元素时,数组的默认容量大小

》DEFAULTCAPACITY_EMPTY_ELEMENTDATA: DEFAULTCAPACITY_EMPTY_ELEMENTDATA是默认的空数组,他的作用是当elementData为{},即空数组时,把它赋值给elementData,要是理解不了,请你往下继续看!

》elementData:表示的就是当前存储元素的数组

》大小:他表示当前还没有添加新元素前的数组中有效的元素个数,比如说数组长度为10,只保存了5个元素,那有效长度就是5

》MAX_ARRAY_SIZE:最大数组长度,它用来标识当前数组可保存元素的最大长度,值为Integer_MAX_VALUE 8,即2147483647 - 8,这里的8代表8字节用来保存数组本身的内存大小。

现在我们进入到添加()里面看他们具体如何实现的,如下代码:

私人空ensureCapacityInternal (int minCapacity) {
  ensureExplicitCapacity (calculateCapacity (elementData minCapacity));
  }

这里面涉及两个方法ensureExplicitCapacity()和calculateCapacity ():

》calculateCapacity():计算容量,它用来计算当前的数组所需的最小容量minCapacity,你可以理解为当前数组的有效长度;源码如下:

私人空ensureExplicitCapacity (int minCapacity) {
  modCount + +;//当overflow-conscious代码最小容量大于当前的数组大小时
  如果(minCapacity - elementData。长度比;0)//计算扩容后的数组大小
  成长(minCapacity);
  }

我们第一次list.add(),最小容量minCapacity是10,elementData.length长度为0,所以条件成立,进入增长()(第二次minCapacity是2,elementData.length为10条件不成立就不再扩容了;当第11次时,11在10,又可以扩容了)

私人空间增长(int minCapacity) {//得到当前数组的大小,即老数组大小
  int oldCapacity=elementData.length;//将旧数组大小+旧数组/2,即旧数组的1.5倍是新数组的大小(先不要在意祝辞祝辞1的意思,你只要知道oldCapacity祝辞祝辞1)表示oldCapacity/2就行)
  int newCapacity=oldCapacity + (oldCapacity祝辞祝辞1);//如果扩容后的是数组大小还是小于最小所需容量,直接让minCapacity赋值到新容量
  如果(newCapacity - minCapacity & lt;0)
  newCapacity=minCapacity;//若新容量大小大于数组长度的最大预设值,由于扩容后是原数组的1.5倍,则非常有可能会溢出这个预设值
  如果(newCapacity - MAX_ARRAY_SIZE祝辞0)
  newCapacity=hugeCapacity (minCapacity);//minCapacity通常是接近的大小,这是一个胜利://上面都是为了确定最终的新容量的大小,这个方法是真正的扩容实现
  elementData=https://www.yisu.com/zixun/Arrays.copyOf (elementData newCapacity);
  }

ArrayList扩容机制