Programing

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

lottogame 2020. 10. 2. 21:23
반응형

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


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

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

그리고 객체를 수동으로 동기화하고 싶지 않고 기본 배열의 새 복사본을 만들 필요없이 스레드로부터 안전한 컬렉션을 사용하고 싶다면 ( CopyOnWriteArrayList그렇게) 사용하는 것이 Vector좋습니까?

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


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

일반적으로 전체 작업 시퀀스 를 동기화하려고 합니다. 개별 작업을 동기화하는 것은 덜 안전하지만 ( Vector예를 들어 를 반복하는 경우 다른 사람이 동시에 컬렉션을 변경하지 않도록 잠금을 해제해야 ConcurrentModificationException하므로 반복 스레드에서 a가 발생 함 ) 속도가 느립니다 ( 한 번이면 충분할 때 왜 반복해서 자물쇠를 꺼내십시오)?

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

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

Stack등가물에 관해서 Deque/ ArrayDeque시작 하겠습니다 .


벡터는 1.0의 일부였으며 원래 구현에는 두 가지 단점이있었습니다.

1. 이름 지정 : 벡터는 실제로 배열로 액세스 할 수있는 목록 일 뿐이므로 호출되어야합니다 ArrayList(이는를위한 Java 1.2 컬렉션 대체 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에 많은 코드가 연결되어 다른 List 구현으로 쉽게 대체 할 수 없습니다.


동기화 된java.util.Collection Collection / List 메서드를 사용하여 스레드로부터 안전하지 않은 컬렉션에서 스레드로부터 안전한 컬렉션을 가져올 수 있습니다.


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

하지만 그것보다 훨씬 더 많은 것을 물려받습니다. java.util.Stack extends java.util.Vector객체 지향 설계의 실수 라는 사실 . 순수 주의자들은 전통적으로 스택과 관련된 작업 (즉, push, pop, peek, size)을 넘어서는 많은 방법을 제공합니다. 그것은 할 수도 있습니다 search, elementAt, setElementAt, remove, 그리고 다른 많은 랜덤 액세스 작업. 기본적으로 .NET Framework의 비 스택 작업을 사용하지 않는 것은 사용자의 몫입니다 Stack.

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

참고 URL : https://stackoverflow.com/questions/1386275/why-is-java-vector-and-stack-class-considered-obsolete-or-deprecated

반응형