답변:
Vector
각 개별 작업에서 동기화합니다. 그것은 거의 당신이하고 싶은 일이 아닙니다.
일반적으로 전체 작업 순서 를 동기화하려고 합니다. 개별 작업 동기화는 덜 안전합니다 ( Vector
예를 들어, 반복 반복하는 경우 다른 사람이 동시에 컬렉션을 변경 ConcurrentModificationException
하여 반복 스레드에서 발생할 수 없도록 잠금을 해제해야 함 ). 한 번으로 충분할 때 왜 반복적으로 잠금을 해제합니까?
물론 필요하지 않은 경우에도 잠금 오버 헤드가 있습니다.
기본적으로 대부분의 상황에서 동기화에 대한 매우 잘못된 접근 방식입니다. 로 씨 브라이언 헹크는 지적, 당신은 전화를 사용하여 컬렉션을 장식 할 수와 같은 Collections.synchronizedList
-는 사실 Vector
을 결합 모두 "모든 작업을 동기화"비트와 "크기가 조정 된 배열"컬렉션을 구현 가난한 디자인의 또 다른 예이다; 데코레이션 접근법은 우려를 더 명확하게 분리합니다.
A에 대한로서 Stack
동등한 - 내가보고 싶은데 Deque
/ ArrayDeque
로 시작합니다.
벡터는 1.0의 일부였습니다. 원래 구현에는 두 가지 단점이있었습니다.
1. 이름 지정 : 벡터는 실제로 배열로 액세스 할 수있는 목록이므로 호출되어야 ArrayList
합니다 (Java 1.2 Collections의 대체 항목 Vector
).
2. 동시성 : 의 모든 get()
, set()
방법은synchronized
당신이 잘 동기화 제어 그레인 않았을 수 있습니다.
ArrayList
와 사이에는 큰 차이가 Vector
없지만 사용해야합니다 ArrayList
.
API 문서에서.
Java 2 플랫폼 v1.2부터이 클래스는 List 인터페이스를 구현하도록 개량되어 Java Collections Framework의 멤버가되었습니다. 새로운 컬렉션 구현과 달리 Vector는 동기화됩니다.
ArrayList
, LinkedList
인터페이스를 구현하는 모든있는 등, List
당신이 사용하려는 그렇다면, List
실제로 기본이되는 구현하면 그냥 걸릴 수 있습니다 무엇인지 알고하지 않고 방법을 List
동일이의 구현을 위해 적용 등의 방법을 매개 변수로 Map
등등. 한편 C ++에는 std::array
C 스타일 정적 길이 배열을 대체하는 템플릿 기반 의 클래스가 있습니다.
Vector 사용에 대해 이미 언급 한 답변 외에도 Vector에는 List 인터페이스와 다른 열거 및 요소 검색과 관련된 여러 가지 방법이 있으며 개발자 (특히 1.2 이전에 Java를 배운 사람)는 사용하는 경향이 있습니다. 암호. 열거는 빠르지 만 반복 중에 컬렉션이 수정되었는지 확인하지 않아 문제가 발생할 수 있으며 여러 스레드에서 수행자가 액세스 할 때 Vector가 동기화를 위해 선택 될 수 있다는 점을 고려할 때 특히 심각한 문제가됩니다. 이러한 메서드를 사용하면 많은 코드가 Vector에 연결되므로 다른 List 구현으로 쉽게 교체 할 수 없습니다.
threadCollection 이 아닌 컬렉션에서 스레드 안전 컬렉션을 가져 오려면 synchronizedCollection / List 메서드를 사용할 수 있습니다 java.util.Collection
.
java.util.Stack
의 동기화 오버 헤드를 상속 java.util.Vector
. 일반적으로 정당화되지 않습니다.
그래도 그 이상을 상속받습니다. 그것이 java.util.Stack extends java.util.Vector
객체 지향 디자인에서 실수 라는 사실 . 순수 주의자들은 또한 스택과 관련하여 전통적으로 동작 (즉, 밀기, 팝, 엿보기, 크기)을 넘어서는 많은 방법을 제공한다는 점에 주목할 것입니다. 그것은 할 수도 있습니다 search
, elementAt
, setElementAt
, remove
, 그리고 다른 많은 랜덤 액세스 작업. 스택이 아닌 작업을 사용하지 않는 것은 기본적으로 사용자의 책임입니다.Stack
.
이러한 성능 및 OOP 설계상의 이유로 JavaDocjava.util.Stack
ArrayDeque
은 자연 대체품으로 권장 됩니다. (데크는 스택 이상이지만 적어도 모든 것에 무작위로 액세스하는 것이 아니라 두 끝을 조작하는 것으로 제한됩니다.)