Java源码中如何对ArrayList进行容量调整呢?
下文笔者讲述Arraylist扩容的相关源码分析
通过此篇源码分析,你将掌握JDK对ArrayList数组容量的扩容思路
数组扩容的方法
ArrayList中数组扩容是通过调用ensureCapacityInternal方法 达到数组扩容的目的 ensureCapacityInternal方法用于保证数组的容量处于够用状态
ensureCapacityInternal方法的源码
//主方法:用于确保数量够用 private void ensureCapacityInternal(int minCapacity) { ensureExplicitCapacity(calculateCapacity(elementData, minCapacity)); } //计算当前容量 //注意事项: //如果elementData等于null,则返回默认容量10与minCapacity=size+1中的最大值 private static int calculateCapacity(Object[] elementData, int minCapacity) { if (elementData == DEFAULTCAPACITY_EMPTY_ELEMENTDATA) { return Math.max(DEFAULT_CAPACITY, minCapacity); } return minCapacity; } //检测当前ArrayList的实际大小 //此方法用于判断elementData是否够用 private void ensureExplicitCapacity(int minCapacity) { modCount++; //minCapacity如果大于了实际elementData的长度 //则说明elementData数组的长度不够用 //增长值为:所需最小空间-数组长度 if (minCapacity - elementData.length > 0) //ArrayList自动扩容方法 grow(minCapacity); } //Array扩容的真真方法 private void grow(int minCapacity) { //将扩充前的elementData大小给oldCapacity // overflow-conscious code int oldCapacity = elementData.length; //新容量newCapacity是1.5倍的旧容量oldCapacity int newCapacity = oldCapacity + (oldCapacity >> 1); //这句话就是适应于elementData就空数组的时候,length=0,那么oldCapacity=0,newCapacity=0,所以这个判断成立,在这里就是真正的初始化elementData的大小了,就是为10。 if (newCapacity - minCapacity < 0) newCapacity = minCapacity; //如果newCapacity超过了最大的容量限制,就调用hugeCapacity,也就是将能给的最大值给newCapacity if (newCapacity - MAX_ARRAY_SIZE > 0) newCapacity = hugeCapacity(minCapacity); //其实扩容是采用数组复制达到数组变大的效果 elementData = Arrays.copyOf(elementData, newCapacity); } //为数组赋最大值 private static int hugeCapacity(int minCapacity) { if (minCapacity < 0) // overflow throw new OutOfMemoryError(); //当minCapacity都大于MAX_ARRAY_SIZE //则返回Integer.MAX_VALUE返回 //否则将MAX_ARRAY_SIZE返回 //Integer.MAX_VALUE:2147483647 //MAX_ARRAY_SIZE:2147483639 return (minCapacity > MAX_ARRAY_SIZE) ? Integer.MAX_VALUE : MAX_ARRAY_SIZE; }
版权声明
本文仅代表作者观点,不代表本站立场。
本文系作者授权发表,未经许可,不得转载。