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.Stack
java.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
은 자연스러운 대체품입니다. (데크는 스택 그 이상이지만 적어도 모든 것에 무작위로 액세스하는 것이 아니라 두 끝을 조작하는 것으로 제한됩니다.)
'Programing' 카테고리의 다른 글
bash에서 문자열이 어떤 값으로 시작하는지 어떻게 확인할 수 있습니까? (0) | 2020.10.02 |
---|---|
DateTime 대 DateTimeOffset (0) | 2020.10.02 |
R에서 "="와 "<-"할당 연산자의 차이점은 무엇입니까? (0) | 2020.10.02 |
"병합하기 전에 변경 사항을 커밋하거나 숨길 수 있습니다"라고 말하는 git을 어떻게 해결합니까? (0) | 2020.10.02 |
MetadataException : 지정된 메타 데이터 리소스를로드 할 수 없습니다. (0) | 2020.10.02 |