公司网站建设合同要交印花税吗,360doc 网站怎么做,如何开发一款app软件,怎么查那些人输入做网站ArrayList大家都知道了吧#xff0c;这是一个动态数组。以java语言来说#xff0c;数组是定长的#xff0c;在被创建之后就不能被加长或缩短了#xff0c;因此#xff0c;了解它的扩容机制对使用它尤为重要。下面#xff0c;我们就一起来看看它的扩容机制是怎么实现的吧。…ArrayList大家都知道了吧这是一个动态数组。以java语言来说数组是定长的在被创建之后就不能被加长或缩短了因此了解它的扩容机制对使用它尤为重要。下面我们就一起来看看它的扩容机制是怎么实现的吧。首先我们知道ArrayList有着三种初始化方式1)指定大小初始化public ArrayList(int initialCapacity)2)传入一个Collection对象初始化并将对象中的数据添加到ArrayList中public ArrayList(Collection c)3)默认构造函数初始化public ArrayList()ArrayList扩容机制发生在add()方法调用的时候从下面的代码我们可以看出当使用无参构造函数创建ArrayList时它的默认长度会为0private static final Object[] DEFAULTCAPACITY_EMPTY_ELEMENTDATA {};public ArrayList(){this.elementData DEFAULTCAPACITY_EMPTY_ELEMENTDATA;}下面是add()方法的源码public boolean add(E e){//扩容ensureCapacityInternal(size 1); // Increments modCount!!elementData[size] e;return true;}根据以上我们可以看到ensureCapacityInternal()是用来扩容的形参为最小扩容量进入此方法后private void ensureCapacityInternal(int minCapacity){ensureExplicitCapacity(calculateCapacity(elementData, minCapacity));}通过方法calculateCapacity(elementData, minCapacity)来获取:private static int calculateCapacity(Object[] elementData, int minCapacity){//如果传入的是个空数组则最小容量取默认容量与minCapacity之间的最大值if (elementData DEFAULTCAPACITY_EMPTY_ELEMENTDATA){return Math.max(DEFAULT_CAPACITY, minCapacity);}return minCapacity;}ensureExplicitCapacity方法可以判断是否需要扩容private void ensureExplicitCapacity(int minCapacity){modCount;// 如果最小需要空间比elementData的内存空间要大则需要扩容if (minCapacity - elementData.length 0)//扩容 grow(minCapacity);}下面是重点来了ArrayList扩容机制关键方法grow()private void grow(int minCapacity){// 获取到ArrayList中elementData数组的内存空间长度int oldCapacity elementData.length;// 扩容至原来的1.5倍int newCapacity oldCapacity (oldCapacity 1);// 再判断一下新数组的容量够不够够了就直接使用这个长度创建新数组// 不够就将数组长度设置为需要的长度if (newCapacity - minCapacity newCapacity minCapacity;//若预设值大于默认的最大值检查是否溢出if (newCapacity - MAX_ARRAY_SIZE 0)newCapacity hugeCapacity(minCapacity);// 调用Arrays.copyOf方法将elementData数组指向新的内存空间时newCapacity的连续空间// 并将elementData的数据复制到新的内存空间elementData Arrays.copyOf(elementData, newCapacity);}因此我们可以清晰看出ArrayList扩容的本质其实就是计算出新的扩容数组的size后实例化它并将原有数组内容复制到新数组中去。以上就是关于ArrayList扩容机制的全部内容了如果你还想要了解更多有关ArrayList相关的java常见问答知识就快来关注我们的网站吧。推荐阅读