>  기사  >  Java  >  Java에서 Vector와 ArrayList의 차이점

Java에서 Vector와 ArrayList의 차이점

高洛峰
高洛峰원래의
2016-11-16 13:13:311276검색

우선 두 카테고리 모두 List 인터페이스를 구현하고 List 인터페이스에는 ArrayList, Vector 및 LinkedList라는 세 가지 구현 클래스가 있음을 확인하세요. 리스트는 여러 요소를 저장하는 데 사용되며, 요소의 순서를 유지할 수 있고, 요소의 중복을 허용합니다. 세 가지 특정 구현 클래스 간의 관련 차이점은 다음과 같습니다.

ArrayList는 가장 일반적으로 사용되는 List 구현 클래스로 배열을 통해 내부적으로 구현되므로 요소에 대한 빠른 무작위 액세스가 가능합니다. 어레이의 단점은 각 요소 사이에 간격이 있을 수 없다는 점이며, 어레이 크기가 만족되지 않을 경우 저장 용량을 늘려야 하며, 기존 어레이의 데이터를 새로운 저장 공간에 복사해야 합니다. ArrayList 중간에 요소를 삽입하거나 삭제하는 경우 배열을 복사하고 이동해야 하므로 상대적으로 비용이 많이 듭니다. 따라서 무작위 검색 및 순회에는 적합하지만 삽입 및 삭제에는 적합하지 않습니다.

ArrayList와 마찬가지로 Vector도 배열을 통해 구현됩니다. 차이점은 스레드 동기화를 지원한다는 것입니다. 즉, 한 번에 하나의 스레드만 Vector에 쓸 수 있어 여러 스레드가 동시에 쓰기 때문에 발생하는 불일치를 방지할 수 있습니다. 하지만 동기화 구현에는 비용이 많이 들기 때문에 이에 액세스하는 것이 ArrayList에 액세스하는 것보다 느립니다.

LinkedList는 Linked List 구조를 사용하여 데이터를 저장하는데 이는 데이터의 동적 삽입 및 삭제에 매우 적합하며 임의 액세스 및 순회 속도가 상대적으로 느립니다. 또한 List 인터페이스에 정의되지 않은 메소드도 제공하는데, 이는 특히 리스트의 헤드 및 테일 요소를 조작하는 데 사용되며 스택, 큐, 양방향 큐로 사용할 수 있습니다.

Java 소스 코드를 살펴보면 배열의 크기가 충분하지 않은 경우 배열을 다시 만든 다음 해당 요소를 새 배열에 복사해야 함을 발견했습니다. ArrayList와 Vector는 다릅니다.

ArrayList:

public boolean add(E e) {
 
    ensureCapacity(size + 1);  // 增加元素,判断是否能够容纳。不能的话就要新建数组
  
    elementData[size++] = e;
 
    return true;
 
}
 
 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);
 
    }
 
}

Vector:

private void ensureCapacityHelper(int minCapacity) {
 
    int oldCapacity = elementData.length;
 
    if (minCapacity > oldCapacity) {
 
        Object[] oldData = elementData;
 
        int newCapacity = (capacityIncrement > 0) ?
 
       (oldCapacity + capacityIncrement) : (oldCapacity * 2);
 
        if (newCapacity < minCapacity) {
 
       newCapacity = minCapacity;
 
        }
 
         elementData = Arrays.copyOf(elementData, newCapacity);
 
    }
 
}

ArrayList와 Vector의 차이점은 다음과 같습니다.

ArrayList의 기본값은 when입니다. 메모리가 부족합니다. 50% + 1로 확장하면 벡터는 기본적으로 1번으로 확장됩니다.

Vector는 indexOf(obj, start) 인터페이스를 제공하지만 ArrayList는 제공하지 않습니다.

Vector는 스레드로부터 안전하지만 스레드 안전에는 더 큰 시스템 오버헤드가 필요하므로 대부분의 경우 Vector는 사용되지 않습니다.


성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.