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用?

解决方案 »

  1.   

    向楼主学习!很久没有看过jdk的源码了。
      

  2.   

    HashMap中也有类似情况,构造器最后一句调用一个init()方法,里面却是空实现,不知目的是什么?
      

  3.   

    是不是防止 elementData 被垃圾回收?
      

  4.   

    这个还真没注意过,看来sun的码农水平也一般呀。
      

  5.   

    楼主看的是jdk1.6的吧,你去看看1.7的,没有这行了,估计当时调试用,忘删了
      

  6.   

    言归正传!这行代码是 JDK 6 中的,至于为什么会存在,呵呵,那可能是失误导致的。为什么会出现这样的失误呢?实际上看看 JDK 6 之前版本 JDK 5 中的代码就知道了:    /**
         * 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
      

  7.   

    实际上在 JDK 7 正式发布前这个方法又改掉了两个 BUG,正式发布的 JDK 7 中 ArrayList#ensureCapacity 方法的源代码已经被拆成了三个方法处理。
      

  8.   

    其实ArrayList就是用数组实现的,而new ArrayList的时候会默认一个数组的长度,当你一直add把数组填满的时候,就会重新new一个更大的数组,源码就是下面这段。            int newCapacity = (oldCapacity * 3)/2 + 1;
                if (newCapacity < minCapacity)
                    newCapacity = minCapacity;
                elementData = (E[])new Object[newCapacity];
    而定义  Object oldData[] = elementData;
    就是为了最后一步 把oldData全部copy到新new出来的数组System.arraycopy(oldData, 0, elementData, 0, size);
      

  9.   

    编译的时候会报警告的吧。
    难道说真的是只注重error完全无视warning?