看一下对比
public static void main(String[] args) {
//得到当前时间
Long nowTime = System.currentTimeMillis();
List<Integer> nosize = new ArrayList<>();
for (int i = 0; i < 10000000; i++) {
//默认不设置大小
nosize.add(1);
}
System.out.println("初始化不指定指定大小用时时长" + (System.currentTimeMillis() - nowTime) + "毫秒");
List<Integer> size = new ArrayList<>(1);
nowTime = System.currentTimeMillis();
for (int i = 0; i < 10000000; i++) {
//初始化默认大小
size.add(1);
}
System.out.println("初始化指定大小用时时长" + (System.currentTimeMillis() - nowTime) + "毫秒");
}
结果:
初始化不指定指定大小用时时长141毫秒
初始化指定大小用时时长180毫秒
public static void main(String[] args) {
//得到当前时间
Long nowTime = System.currentTimeMillis();
for (int i = 0; i < 10000000; i++) {
List<Integer> nosize = new ArrayList<>();
//默认不设置大小
nosize.add(1);
}
System.out.println("初始化不指定指定大小用时时长" + (System.currentTimeMillis() - nowTime) + "毫秒");
nowTime = System.currentTimeMillis();
for (int i = 0; i < 10000000; i++) {
List<Integer> size = new ArrayList<>(1);
//初始化默认大小
size.add(1);
}
System.out.println("初始化指定大小用时时长" + (System.currentTimeMillis() - nowTime) + "毫秒");
}
结果:
初始化不指定指定大小用时时长142毫秒
初始化指定大小用时时长67毫秒
从上面可以看出扩容是比较费时间的
源码:
public boolean add(E e) {
//首先确定链表的大小,如果初始化不指定的话默认大小是10
ensureCapacityInternal(size + 1); // Increments modCount!!
elementData[size++] = e;
return true;
}
private void ensureCapacityInternal(int minCapacity) {
if (elementData == DEFAULTCAPACITY_EMPTY_ELEMENTDATA) {
//如果大于十会默认去除当前的位置
minCapacity = Math.max(DEFAULT_CAPACITY, minCapacity);
}
ensureExplicitCapacity(minCapacity);
}
private void ensureExplicitCapacity(int minCapacity) {
modCount++;
// 如果内存不够会进行扩容!不经浪费时间还浪费内存
if (minCapacity - elementData.length > 0)
grow(minCapacity);
}
//如果大小不够的话要进行扩容进行扩容(最大是0x7fffffff=2147483647),否则孔融0x7fffffff-8,很浪费内存
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);
}
版权声明:本文为m0_46086429原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。