首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > 编程 >

深入辨析ArrayList源代码

2012-11-21 
深入剖析ArrayList源代码ArrayList这个容器实质上就是个会自动增长的数组,默认初始容量是10,按原容器的1.5

深入剖析ArrayList源代码

ArrayList这个容器实质上就是个会自动增长的数组,默认初始容量是10,按原容器的1.5倍扩容。在ArrayList里面定义了一个私有的数组。

/**     * Appends the specified element to the end of this list.     *     * @param e element to be appended to this list     * @return <tt>true</tt> (as specified by {@link Collection#add})     */    public boolean add(E e) {ensureCapacity(size + 1);  // Increments modCount!!elementData[size++] = e;return true;    }/**     * 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;            // minCapacity is usually close to size, so this is a win:            elementData = Arrays.copyOf(elementData, newCapacity);}    }
?在往容器添加数据的方法中可以看到每添加一个元素都会调用一次ensureCapacity()方法,也就是添加容器长度的方法。但是传的参数是size+1,而size是容器包含的元素个数。所以每次添加的是包含元素个数+1的值。当然这里会有个判断,但元素个数+1超过原有数组长度的时候,就会执行扩容的动作。新数组的容量会是原数组的1.5倍。int newCapacity = (oldCapacity * 3)/2 + 1,接着会执行一个数组复制的动作。所以说到底ArrayList就是一个会自动增长长度的数组。从add()方法中也可以看出在ArrayList中可以增加重复的元素,并不会判断元素是否相等。

热点排行