liuzongan1985 2009-04-21 18:04
浏览 201
已采纳

关于java 中ArrayList愿码的不理解

[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我觉得没有必要啊?大家觉得呢?还是为了什么性能问题?

  • 写回答

3条回答 默认 最新

  • xfei6868 2009-04-21 19:37
    关注

    调用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还没有结束,这将是个严重的事情。

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(2条)

报告相同问题?