programing

Java Vector(및 Stack) 클래스가 구식 또는 폐지된 것으로 간주되는 이유는 무엇입니까?

sourcetip 2022. 7. 14. 23:02
반응형

Java Vector(및 Stack) 클래스가 구식 또는 폐지된 것으로 간주되는 이유는 무엇입니까?

Java Vector가 구식 또는 폐지된 레거시 클래스로 간주되는 이유는 무엇입니까?

동시 작업 시에는 유효하지 않습니까?

오브젝트를 수동으로 동기화하지 않고 스레드 세이프 컬렉션을 사용하여 기본 어레이의 새로운 복사본을 만들 필요가 없는 경우(예:CopyOnWriteArrayListdoes)를 사용해도 괜찮습니까?Vector?

어때Stack의 서브클래스입니다.Vector그 대신 무엇을 사용하면 좋을까요?

Vector는, 개개의 조작 마다 동기합니다.그건 네가 하고 싶은 일이 아니야.

일반적으로 작업 시퀀스 전체를 동기화합니다.개개의 조작을 동기화하는 것은, 양쪽 모두의 안전성이 떨어집니다(중간에 반복하는 경우).Vector예를 들어 다른 사람이 컬렉션을 동시에 변경하는 것을 방지하기 위해 잠금을 해제해야 합니다.이 경우,ConcurrentModificationException(반복 스레드에서) 하지만 속도가 느립니다(한 번이면 충분할 텐데 왜 반복적으로 잠금을 뺄까요?)

물론, 필요 없을 때에도 잠글 수 있는 오버헤드도 있습니다.

기본적으로 대부분의 경우 동기화에 매우 결함이 있는 접근법입니다.Brian Henk씨가 지적한 처럼 콜을 사용하여 컬렉션을 꾸밀 수 있습니다.Vector는, 「리사이즈 끝난 어레이」컬렉션의 실장과 「모든 동작의 동기화」비트를 조합하는 것으로, 설계 불량의 또 다른 예입니다.장식 어프로치를 사용하면 문제를 보다 명확하게 분리할 수 있습니다.

A에 대해서Stack등가 - 보고 싶다Deque/ArrayDeque우선은요.

Vector는 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는 목록 인터페이스와 다른 열거 및 요소 검색에 관한 많은 메서드를 가지고 있으며 개발자들(특히 1.2 이전에 Java를 배운 사람들)은 코드 안에 있으면 그것들을 사용하는 경향이 있습니다.열거는 더 빠르지만 반복 중에 컬렉션이 수정되었는지 확인하지 않으며, 이로 인해 문제가 발생할 수 있습니다. 또한 여러 스레드에서 어텐던트 액세스와 함께 동기화를 위해 벡터가 선택될 수 있기 때문에 특히 치명적인 문제가 됩니다.이러한 메서드를 사용하면 많은 코드가 Vector에 결합되므로 다른 List 구현으로 대체하기가 쉽지 않습니다.

synchronized Collection/List 메서드는 에서 사용할 수 있습니다.java.util.Collection스레드 세이프 콜렉션을 얻을 수 있습니다.

java.util.Stack inherits の izationization の of of 의 동기 를 상속하다java.util.Vector이는 보통 정당화되지 않습니다.

하지만 그것보다 훨씬 더 많은 것을 물려받습니다.java.util.Stack extends java.util.Vector오브젝트 지향 설계의 실수입니다.Purists는 또한 스택과 관련된 기존 작업(push, pop, peek, size)을 넘어서는 많은 방법을 제공한다는 점에 주목합니다. 해서 할 search,elementAt,setElementAt,remove기타 많은 랜덤액세스 조작을 실시됩니다.을 사용하지 있습니다.Stack.

이러한 성능 및 OOP 설계상의 이유로 JavaDoc은 자연 대체품으로 권장됩니다.(deque는 스택 이상이지만 적어도 모든 것에 랜덤 액세스를 제공하는 것이 아니라 양끝을 조작하는 데 제한됩니다.)

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

반응형