자바 벡터 소스 학습

5635 단어
Vector public class Vector extends AbstractList implements List, RandomAccess, Cloneable, java.io.Serializable
1. 자동 확장 메커니즘
The Vector class implements a growable array of objects. Like an array, it contains components that can be accessed using an integer index. However, the size of a Vector can grow or shrink as needed to accommodate adding and removing items after the Vector has been created.
  • 바 텀 을 대상 배열 protected Object[] elementData; proctected int element Count 로 초기 화 합 니 다.원소 개수 protected int capacity Increment;증가 개수
        public Vector(int initialCapacity, int capacityIncrement) {
            super();
            if (initialCapacity < 0)
                throw new IllegalArgumentException("Illegal Capacity: "+
                                                   initialCapacity);
            this.elementData = new Object[initialCapacity];
            this.capacityIncrement = capacityIncrement;
        }
    
        public Vector(int initialCapacity) {
            this(initialCapacity, 0);
        }
    
        public Vector() {
            this(10);
        }
    
  • add
    public synchronized boolean add(E e) {
        modCount++;
        ensureCapacityHelper(elementCount + 1);
        elementData[elementCount++] = e;
        return true;
    }
    
    분배 여 부 를 판단 하 는 관건: capacity Increment 0 시, 매번 capacity Increment 개 요 소 를 증가 합 니 다.capacity Increment & lt; = 0 시, 2 배 증폭;
    private void ensureCapacityHelper(int minCapacity) {
        // overflow-conscious code
        if (minCapacity - elementData.length > 0)
            grow(minCapacity);
    }
    
  • remove: 바 텀 배열 의 크기
    private void grow(int minCapacity) {
        // overflow-conscious code
        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);
    }
    
    clear 실현
    public synchronized E remove(int index) {
        modCount++;
        if (index >= elementCount)
            throw new ArrayIndexOutOfBoundsException(index);
        E oldValue = elementData(index);
    
        int numMoved = elementCount - index - 1;
        if (numMoved > 0)
            System.arraycopy(elementData, index+1, elementData, index,
                             numMoved);
        elementData[--elementCount] = null; // Let gc do its work
    
        return oldValue;
    }
    
    바 텀 배열 의 용량
    public synchronized void removeAllElements() {
        modCount++;
        // Let gc do its work
        for (int i = 0; i < elementCount; i++)
            elementData[i] = null;
    
        elementCount = 0;
    }
    
  • 을 진정 으로 감소 하지 않 습 니 다.
    2. 스 레 드 안전
    jdk1.0 Vector ,jdk1.2 ArrayList
    Vector 는 가 변 상 태 를 대상 내부 에 밀봉 하고 대상 잠 금 을 통 해 가 변 상태 에 접근 하 는 모든 코드 를 동기 화하 여 이 대상 에 동시 접근 하지 않도록 합 니 다.
    Array List 를 비교 해 보면 모든 방법 에 키 워드 를 추가 synchronized 한 것 을 발견 할 수 있다.
    public synchronized void trimToSize() {
        modCount++;
        int oldCapacity = elementData.length;
        if (elementCount < oldCapacity) {
            elementData = Arrays.copyOf(elementData, elementCount);
        }
    }
    

    3. Fail - Fast 메커니즘
    Vector 가 돌아 온 Iterator 도 fail - fast 입 니 다.
        public synchronized int size() {
            return elementCount;
        }
    

    Vector 가 Iterator 를 만 든 후, 추가 삭제 작업 을 진행 합 니 다. modCount 변화. - ConcurrentModificationException
    총화
  • Vector 의 문제 1) 너무 많은 동기 화, 모든 방법 은 synchronized 가 있 습 니 다.2) 복합 작업 으로 안전 하지 않 으 므 로 추가 잠 금 이 필요 합 니 다.
    public synchronized Iterator iterator() {
      return new Itr();
    }
    private class Itr implements Iterator {
        int cursor;       // index of next element to return
        int lastRet = -1; // index of last element returned; -1 if no such
        int expectedModCount = modCount;
    
        public boolean hasNext() {
            // Racy but within spec, since modifications are checked
            // within or after synchronization in next/previous
            return cursor != elementCount;
        }
        public E next() {
            synchronized (Vector.this) {
                checkForComodification();
                int i = cursor;
                if (i >= elementCount)
                    throw new NoSuchElementException();
                cursor = i + 1;
                return elementData(lastRet = i);
            }
        }
    }
    
  • Vector vs ArrayList
  • 어 레이 리스트 증폭 방식 은 1.5 배 였 다.Vector 확장 방식 은 매번 몇 개 씩 추가 하거나 기본적으로 2 배 확장 할 수 있 습 니 다.
  • 벡터 스 레 드 안전 ArrayList 스 레 드 안전 하지 않 음
  • Vector 는 jdk 1.0 버 전 으로 추천 하지 않 습 니 다.스 레 드 보안 이 필요 하지 않 을 때 ArrayList 를 선택 하 는 것 을 추천 합 니 다.스 레 드 보안 이 필요 할 때 List list = Collections. synchronizedList (new ArrayList (...);Collections. synchronized List 는 삭제 하고 검사 하 는 방법 은 모두 synchronized 가 있 지만;하지만 좋 은 점 이 있다.(1) Vector 동기 화 방법 에 자 물 쇠 를 잠 근 것 은 this 대상 으로 잠 긴 대상 을 제어 할 수 없습니다.SynchronizedList 의 동기 화 는 synchronized 코드 블록 이 mutex 대상 에 자 물 쇠 를 추가 하 는 것 을 사용 합 니 다. 이 mutex 대상 은 구조 함 수 를 통 해 전 달 될 수 있 습 니 다. 즉, 우 리 는 잠 금 대상 을 지정 할 수 있 습 니 다.(2) 교체 에 대해 자 물 쇠 를 늘 려 야 합 니 다. Iterator. reove () 의 작은 자 물 쇠 는 필요 하지 않 고 추가 비용 이 필요 합 니 다.synchronizedList. iterator () 는 동기 화 된 키 가 없 으 며 스스로 자 물 쇠 를 늘 렸 습 니 다. Iterator. remove () 는 자물쇠 가 없습니다.
    if(!vector.contains(e)){
      vector.add(e);
    }
    


  • @ 드 림 웍 스 2018.3.7

    좋은 웹페이지 즐겨찾기