List是常用的一种数据集合,默认size值是10.如果增加的数据超过默认值,会扩大到原来数据长度的一半。原来是N,那么扩大后N+N/2
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); }
采用>>进行除于2,实际上是二进制向右移动一位。相当高明。
ArrayList长度是有限制的,最长是:Integer.MAX_VALUE - 8=2147483639(2亿多的量,一般用到这量内存溢出也是很正常的事)(int 是4个字节,一个字节为8位)