ensureCapacity是add等方法内部调用的一个方法 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);
}
}其中Object oldData[] = elementData;这行代码的作用是什么呢?
出了if判断块,局部变量oldData就被销毁了,那么在if判断块第一句话就定义这个变量却又不使用它,是出于什么目的呢?难道是debug用?
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);
}
}其中Object oldData[] = elementData;这行代码的作用是什么呢?
出了if判断块,局部变量oldData就被销毁了,那么在if判断块第一句话就定义这个变量却又不使用它,是出于什么目的呢?难道是debug用?
* Increases the capacity of this <tt>ArrayList</tt> instance, if
* necessary, to ensure that it can hold at least the number of elements
* specified by the minimum capacity argument.
*
* @param minCapacity the desired minimum capacity.
*/
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;
elementData = (E[])new Object[newCapacity];
System.arraycopy(oldData, 0, elementData, 0, size);
}
}从上面的代码可以看出,JDK 5 是使用 System.arraycopy 去完成数组复制工作的。而在 JDK 6 中 Arrays 增加了一个 copyOf 方法,因此 JDK 的开发人员只将这一行给改了,把上面的 oldData 给遗漏了!这是个 JDK 的 BUG,BUG 编号为 6812879,BUG 地址:
http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=6812879在 JDK 7 正式发布前的 build 51 版中已经把这行代码删除了源代码文件修改的 diff 比较数据见:
http://hg.openjdk.java.net/jdk7/jdk7-gate/jdk/diff/6568cd51ae12/src/share/classes/java/util/ArrayList.java
if (newCapacity < minCapacity)
newCapacity = minCapacity;
elementData = (E[])new Object[newCapacity];
而定义 Object oldData[] = elementData;
就是为了最后一步 把oldData全部copy到新new出来的数组System.arraycopy(oldData, 0, elementData, 0, size);
难道说真的是只注重error完全无视warning?