Java Vector (및 Stack) 클래스가 더 이상 사용되지 않거나 더 이상 사용되지 않는 것으로 간주되는 이유는 무엇입니까?


677

Java Vector가 더 이상 사용되지 않거나 사용되지 않는 레거시 클래스로 간주되는 이유는 무엇입니까?

동시성으로 작업 할 때 사용이 유효하지 않습니까?

그리고 수동으로 객체를 동기화하고 싶지 않고 기본 배열의 새로운 사본을 만들 필요없이 스레드 안전 컬렉션을 사용하려면 사용하는 CopyOnWriteArrayList것이 좋습니다 Vector.

어때 Stack의 서브 클래스입니다, Vector내가 대신 그것을 사용해야 무엇?


더 이상 사용되지 않지만 더 이상 사용되지 않습니다.
Lorne의 후작

답변:


655

Vector각 개별 작업에서 동기화합니다. 그것은 거의 당신이하고 싶은 일이 아닙니다.

일반적으로 전체 작업 순서 를 동기화하려고 합니다. 개별 작업 동기화는 덜 안전합니다 ( Vector예를 들어, 반복 반복하는 경우 다른 사람이 동시에 컬렉션을 변경 ConcurrentModificationException하여 반복 스레드에서 발생할 수 없도록 잠금을 해제해야 함 ). 한 번으로 충분할 때 왜 반복적으로 잠금을 해제합니까?

물론 필요하지 않은 경우에도 잠금 오버 헤드가 있습니다.

기본적으로 대부분의 상황에서 동기화에 대한 매우 잘못된 접근 방식입니다. 로 씨 브라이언 헹크는 지적, 당신은 전화를 사용하여 컬렉션을 장식 할 수와 같은 Collections.synchronizedList-는 사실 Vector을 결합 모두 "모든 작업을 동기화"비트와 "크기가 조정 된 배열"컬렉션을 구현 가난한 디자인의 또 다른 예이다; 데코레이션 접근법은 우려를 더 명확하게 분리합니다.

A에 대한로서 Stack동등한 - 내가보고 싶은데 Deque/ ArrayDeque로 시작합니다.


108
"일반적으로 전체 작업 순서를 동기화하려고합니다." - 그것이 요점이다! 감사!
fjsj

7
java Deprecated Vector의 어떤 버전에서 (현재 Java7을 사용했지만) Deprecated로 보지 않습니까? 안녕히 가십시오 멋진 설명 ... + 1
Samir Mangroliya

17
@Samir : 공식적으로 사용되지 않습니다. 일반적으로 ArrayList가 선호됩니다.
Jon Skeet

26
@Samir : 아니요, 미래를 예측하지는 않겠습니다.
Jon Skeet

5
단순히 gr8. 벡터는 레거시 클래스를 더 이상 사용하지 않습니다. 더 이상 사용되지 않는 레거시와 레거시 사이에는 차이가 있어야합니다. 네, stackoverflow.com/questions/2873254/…를
Prashant Shilimkar

82

벡터는 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는 매우 짧거나 눈에 띄지 않는 이름이므로 vector가 다른 곳 (예 : STL)에 사용되는 이유 일 수 있습니다.
dhardy

6
@dhardy 기본 구현으로 배열을 나열합니다. 있다 ArrayList, LinkedList인터페이스를 구현하는 모든있는 등, List당신이 사용하려는 그렇다면, List실제로 기본이되는 구현하면 그냥 걸릴 수 있습니다 무엇인지 알고하지 않고 방법을 List동일이의 구현을 위해 적용 등의 방법을 매개 변수로 Map등등. 한편 C ++에는 std::arrayC 스타일 정적 길이 배열을 대체하는 템플릿 기반 의 클래스가 있습니다.
JAB

41

Vector 사용에 대해 이미 언급 한 답변 외에도 Vector에는 List 인터페이스와 다른 열거 및 요소 검색과 관련된 여러 가지 방법이 있으며 개발자 (특히 1.2 이전에 Java를 배운 사람)는 사용하는 경향이 있습니다. 암호. 열거는 빠르지 만 반복 중에 컬렉션이 수정되었는지 확인하지 않아 문제가 발생할 수 있으며 여러 스레드에서 수행자가 액세스 할 때 Vector가 동기화를 위해 선택 될 수 있다는 점을 고려할 때 특히 심각한 문제가됩니다. 이러한 메서드를 사용하면 많은 코드가 Vector에 연결되므로 다른 List 구현으로 쉽게 교체 할 수 없습니다.


14

threadCollection 이 아닌 컬렉션에서 스레드 안전 컬렉션을 가져 오려면 synchronizedCollection / List 메서드를 사용할 수 있습니다 java.util.Collection.


2
왜 이것이 벡터보다 낫습니까?
fjsj

8
Jon이 언급했듯이 Vector는 잘 수행되지 않으며이 방법을 사용하면 동기화를 수행 할 좋은 아이디어를 선택할 수 있습니다. 완전히 디자인 문제입니다. 동기화되지 않은 액세스를 기본값으로 설정해야하므로 Vector를 통한 ArrayList를 사용해야합니다.
Brian Henk

이 질문에 어떻게 대답합니까?
Lorne의 후작

8

java.util.Stack 의 동기화 오버 헤드를 상속 java.util.Vector . 일반적으로 정당화되지 않습니다.

그래도 그 이상을 상속받습니다. 그것이 java.util.Stack extends java.util.Vector객체 지향 디자인에서 실수 라는 사실 . 순수 주의자들은 또한 스택과 관련하여 전통적으로 동작 (즉, 밀기, 팝, 엿보기, 크기)을 넘어서는 많은 방법을 제공한다는 점에 주목할 것입니다. 그것은 할 수도 있습니다 search, elementAt, setElementAt, remove, 그리고 다른 많은 랜덤 액세스 작업. 스택이 아닌 작업을 사용하지 않는 것은 기본적으로 사용자의 책임입니다.Stack .

이러한 성능 및 OOP 설계상의 이유로 JavaDocjava.util.StackArrayDeque 은 자연 대체품으로 권장 됩니다. (데크는 스택 이상이지만 적어도 모든 것에 무작위로 액세스하는 것이 아니라 두 끝을 조작하는 것으로 제한됩니다.)

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.