[code="java"]
public boolean add(E e) {
ensureCapacity(size + 1); // Increments modCount!!调用ensureCapacity
elementData[size++] = e;
return true;
}
[/code]
[code="java"]
public void ensureCapacity(int minCapacity) {
modCount++;
int oldCapacity = elementData.length;
if (minCapacity > oldCapacity) {
Object oldData[] = elementData;//为什么要用到oldDAte[]
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);
}
}
[/code]
Object oldData[] = elementData我觉得没有必要啊?大家觉得呢?还是为了什么性能问题?
调用ensureCapacity 方法应该好理解的,就是说arraylist的内部实现其实也是数组。这样的话在动态的增长的话,一定要看看是不是会越界,要是有大于界点就要增大数组的长度,这样才能继续放更多的东西进来。ensureCapacity 正是实现了这种思想。
Object oldData[] = elementData;//为什么要用到oldDAte[]
乍一看来后面并没有用到关于oldData, 这句话显得多此一举!但是这是一个牵涉到内存管理的类, 所以要了解内部的问题。 而且为什么这一句还在if的内部,这跟elementData = Arrays.copyOf(elementData, newCapacity); 这句是有关系的,下面这句Arrays.copyOf的实现时新创建了newCapacity大小的内存,然后把老的elementData放入。好像也没有用到oldData,有什么问题呢。问题就在于旧的内存的引用是elementData, elementData指向了新的内存块,如果有一个局部变量oldData变量引用旧的内存块的话,在copy的过程中就会比较安全,因为这样证明这块老的内存依然有引用,分配内存的时候就不会被侵占掉,然后copy完成后这个局部变量的生命期也过去了,然后释放才是安全的。不然在copy的的时候万一新的内存或其他线程的分配内存侵占了这块老的内存,而copy还没有结束,这将是个严重的事情。
为什么不要这行代码,
Object oldData[] = elementData;这行用来存放当前的数组,
ensureCapacity()用来增加数组的容量,
要知道elementData数组对象是定长的,长度不可变,
楼上的,学习了!哈哈!