public void ensureCapacity(int minCapacity) { modCount++; int oldCapacity = elementData.length; if (minCapacity > oldCapacity) { Object oldData[] = elementData; int newCapacity = (oldCapacity * 3)/2 + 1; if (newCapacity < minCapacity) newCapacity = minCapacity; // minCapacity is usually close to size, so this is a win: elementData = Arrays.copyOf(elementData, newCapacity); } } 还有arraylist得数组扩容方法里也有特别诡异得一个写法,Object oldData[] = elementData; 后面oldData没有任何调用,这又是什么意思呢??是跟垃圾回收有关系么?
public void ensureCapacity(int minCapacity) {
modCount++;
int oldCapacity = elementData.length;
if (minCapacity > oldCapacity) {
Object oldData[] = elementData;
int newCapacity = (oldCapacity * 3)/2 + 1;
if (newCapacity < minCapacity)
newCapacity = minCapacity;
// minCapacity is usually close to size, so this is a win:
elementData = Arrays.copyOf(elementData, newCapacity);
}
}
还有arraylist得数组扩容方法里也有特别诡异得一个写法,Object oldData[] = elementData; 后面oldData没有任何调用,这又是什么意思呢??是跟垃圾回收有关系么?
好处有两个
第一,也就是final的逻辑用意,可以预防后续的代码中程序员对final变量重新赋值。
第二,用final变量,会赢得少许的性能提高,因为final的变量地址不需要在每次方法调用时再从新计算,而是事先算好的。
因为elementData 是transient的。
所以需要一个引用来保证它不会在方法结束前,由于持久化的原因而挂掉