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

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

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

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

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



답변

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는 동기화됩니다.


답변

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.StackArrayDeque 은 자연 대체품으로 권장 됩니다. (데크는 스택 이상이지만 적어도 모든 것에 무작위로 액세스하는 것이 아니라 두 끝을 조작하는 것으로 제한됩니다.)


답변