JDK 소스 의 벡터

Vector 는 JDK 기반 용기 로 본질 적 으로 배열 에 대한 조작 집합 입 니 다. 데 이 터 를 저장 하 는 데이터 구 조 를 통 해 proctected Object [] element Data 를 알 수 있 습 니 다.
먼저 Vector 의 몇 가지 인 자 를 살 펴 보 겠 습 니 다.
protected int elementCount;         
protected int capacityIncrement;         ,    

벡터 의 구조 함수
public Vector(int initialCapacity, int capacityIncrement) {
    super();
    if (initialCapacity < 0)//        0,    
        throw new IllegalArgumentException("Illegal Capacity: "+
                                           initialCapacity);
    this.elementData = new Object[initialCapacity];//     
    this.capacityIncrement = capacityIncrement;
}

Vector 는 스 레 드 가 안전 하지만 스 레 드 안전 의 실현 은 대량의 버스 잠 금 synchronized 를 통 해 수식 되 지만 외곽 함수 가 모두 사용 되 어 실현 되 기 때문에 효율 이 낮 습 니 다.
public synchronized void copyInto(Object[] anArray)
public synchronized void trimToSize()
public synchronized void ensureCapacity(int minCapacity)
public synchronized void setSize(int newSize)
public synchronized int capacity()
public synchronized int size()
public synchronized boolean isEmpty()
public synchronized int indexOf(Object o, int index)
public synchronized int lastIndexOf(Object o)
public synchronized int lastIndexOf(Object o, int index)
public synchronized E elementAt(int index)
public synchronized E firstElement()
public synchronized E lastElement()
public synchronized void setElementAt(E obj, int index)
public synchronized void removeElementAt(int index)
public synchronized void addElement(E obj)
......

Vector 는 간단 합 니 다. 확장 작업 grow 는 synchronized 수식 을 사용 하지 않 았 지만 외곽 함수 들 은 synchronized 수식 을 사용 하기 때문에 스 레 드 가 안전 합 니 다.
private void grow(int minCapacity) {
    int oldCapacity = elementData.length;
    int newCapacity = oldCapacity + ((capacityIncrement > 0) ?
                                     capacityIncrement : oldCapacity); 
    if (newCapacity - minCapacity < 0)
        newCapacity = minCapacity;
    if (newCapacity - MAX_ARRAY_SIZE > 0)
        newCapacity = hugeCapacity(minCapacity);
    elementData = Arrays.copyOf(elementData, newCapacity);
}

벡터 요소 삭제 동작 removeElementAt
public synchronized void removeElementAt(int index) {
    modCount++;
    if (index >= elementCount) {
        throw new ArrayIndexOutOfBoundsException(index + " >= " +
                                                 elementCount);
    }
    else if (index < 0) {
        throw new ArrayIndexOutOfBoundsException(index);
    }
    int j = elementCount - index - 1;
    if (j > 0) {
        System.arraycopy(elementData, index + 1, elementData, index, j);
    }
    elementCount--;
    elementData[elementCount] = null; /* to let gc do its work */      ,    ,                ,        ,          null,      
}

좋은 웹페이지 즐겨찾기