集合---List (2)

List可以分为ArrayList,LinkedList,Vector等分支。List的特性是可重复数据,有序。

ArrayList的底层实现是数组,默认容量为10,当需要扩容时,会变为原来容量的1.5倍。因为是数组实现,ArrayList适合查找数据。

/**
     * Default initial capacity.          默认容量为10
     */                    
    private static final int DEFAULT_CAPACITY = 10;
 public boolean add(E e) {
        ensureCapacityInternal(size + 1);  // Increments modCount!!
        elementData[size++] = e;            
        return true;
    }

private void ensureCapacityInternal(int minCapacity) {
        if (elementData == DEFAULTCAPACITY_EMPTY_ELEMENTDATA) {
            minCapacity = Math.max(DEFAULT_CAPACITY, minCapacity);
        }

        ensureExplicitCapacity(minCapacity);
    }
    private void ensureExplicitCapacity(int minCapacity) {
        modCount++;

        // overflow-conscious code
        if (minCapacity - elementData.length > 0)
            grow(minCapacity);
    }
    private void grow(int minCapacity) {
        // overflow-conscious code
        int oldCapacity = elementData.length;
        int newCapacity = oldCapacity + (oldCapacity >> 1);       //原本容量右移一位,缩小为原来的一半,加上原                 容量本身,即变为1.5倍容量
        if (newCapacity - minCapacity < 0)
            newCapacity = minCapacity;
        if (newCapacity - MAX_ARRAY_SIZE > 0)
            newCapacity = hugeCapacity(minCapacity);
        // minCapacity is usually close to size, so this is a win:
        elementData = Arrays.copyOf(elementData, newCapacity);
    }

LinkedList靠链表实现,默认容量是0,其中有addFirst()和addLast(),add()默认使用addLast()。

transient int size = 0;     //默认容量


public boolean add(E e) {      //默认add方法添加到链表尾部
        linkLast(e);
        return true;
    }

Vector也是通过数组实现的,相比较于ArrayList,这种集合线程安全,但速度较慢。默认容量也为10,但扩容时会变为原来的2倍。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章