List底层源码剖析之List扩容机制

阿里云国内75折 回扣 微信号:monov8
阿里云国际,腾讯云国际,低至75折。AWS 93折 免费开户实名账号 代冲值 优惠多多 微信号:monov8 飞机:@monov6

在list集合中有一个add方法:

 

在众多类中最长使用的是ArrayList,其中有个方法是add方法

在add方法底层存在

private int size;

ensureCapacityInternal(size + 1)

其中的size+1会对add方法的调用次数进计数每调用一次加1;

下边有个数组是elementData[] 中的size++用来确定存储对象的位置

 

 在ensureCapacityInternal方法中定义了一个minCapacity 最小容量的参数

 如果最小容量比数组长度大那么调用grow方法更新数组

 1.指定一个初始的数组长度为10将数组长度传给初始容量

2.初始化了一个新的容量是初始容量的1.5倍

如果入参长度小于新的容量那么数组长度扩容为初始的1.5.倍

如果入参长度大于新的容量那么就把入参长度作为数组长度

如果还不够那么就会传给一个int的最大范围

如果int最大范围还不够会传Integer.MAX_VALUE给这个数组

其中  MAX_ARRAY_SIZE = Integer.MAX_VALUE - 8;

 总结一下:

MAX_ARRAY_SIZE = Integer.MAX_VALUE - 8

list底层创建了一个elementData数组长度为10

创建了一个oldcapacity初始容量用来记录数组长度

创建了newcapacity新容量的长度为初始容量的1.5倍;

用方法ensureCapacityInternal中的minCapacity最小容量来接收传入elementData数组的长度当最小容量小于elementData数组的初始化长度10的时候使用默认长度当最小容量大于初始化长度那么使用Arrays.copyOf方法elementData数组长度扩容为原来1.5倍如果1.5倍还是不够那么最小容量是多少就给定多大的elementData的长度如果并且被付给的新容量达到了比MAX_ARRAY_SIZE还大的程度就会把Integer.MAX_VALUE的值付给elementData将该数组扩容到最大

阿里云国内75折 回扣 微信号:monov8
阿里云国际,腾讯云国际,低至75折。AWS 93折 免费开户实名账号 代冲值 优惠多多 微信号:monov8 飞机:@monov6