2 qixinbruce qixinbruce 于 2016.03.22 15:44 提问

ArrayList底层的动态数组怎么实现?

数组怎么实现动态分配长度?数组的长度为什么不固定?求大神讲解

3个回答

danielinbiti
danielinbiti   Ds   Rxr 2016.03.22 15:54
已采纳

没有动态,最终还是数组复制,小数组换大数组

//这是数据扩充的核心代码,最终就是arrays.copyof
 private void grow(int minCapacity) {
         // overflow-conscious code
         int oldCapacity = elementData.length;
         int newCapacity = oldCapacity + (oldCapacity >> 1);
         if (newCapacity - minCapacity < 0)
             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);
     }
cock333
cock333   2016.03.22 15:57

数组的长度是固定的,arrayList的add会生成个新的“够长的数组”
elementData = Arrays.copyOf(elementData, newCapacity);
看一看源码就明白了

caozhy
caozhy   Ds   Rxr 2016.03.22 15:59

ArrayList的底层还是数组,每次分配一批,当数组不够的时候,会重新分配,然后拷贝到新的数组中。

Csdn user default icon
上传中...
上传图片
插入图片
准确详细的回答,更有利于被提问者采纳,从而获得C币。复制、灌水、广告等回答会被删除,是时候展现真正的技术了!