이전에는 길이가 알려지지 않았을 때 비 설명 객체에 Vector를 사용하는 것이 좋을 것이라고 생각했습니다. 내가 아는 한 스레드로부터도 안전하다고 생각했습니다.java.util.Vector - 대안
Vector
은 더 이상 사용하지 않아야하며, 대안은 무엇입니까?
이전에는 길이가 알려지지 않았을 때 비 설명 객체에 Vector를 사용하는 것이 좋을 것이라고 생각했습니다. 내가 아는 한 스레드로부터도 안전하다고 생각했습니다.java.util.Vector - 대안
Vector
은 더 이상 사용하지 않아야하며, 대안은 무엇입니까?
Vector
대신 ArrayList
을 사용해야합니다. Vector
은 내부 동기화를 사용했으나 실제 일관성을 유지하는 데는 거의 적합하지 않으며 실제로 필요하지 않을 경우 실행 속도가 느려집니다.
this stackoverflow question도 참조하십시오.
"실제 일관성을 위해 충분하지 않습니다"라는 좋은 지적이 있습니다. 콜렉션이 여러 스레드에서 볼 수있는 경우,'java.util.concurrent'의 적절한 콜렉션을 사용하고 있어야합니다. 그리고 다중 스레드에 접근 할 수 없다면, 'ArrayList'는 더 싸다. 컬렉션이 여러 스레드에서 사용되는 "회색 영역 제거": 본질적으로 스레드로부터 안전하지 않은 컬렉션을 만들 수 없습니다. 그것의 클라이언트가 그것을 사용하는 방법은 항상 요인이다. – erickson
요즘, Vector가 개선되었는지 또는 ArrayList를 사용해야하는지 알고 있습니까? –
@AquariusPower 계약에서는 동기화를 사용해야하므로 실제로는 향상시킬 수 없습니다. 즉, 현대의 JVM은 때때로 동기화로서 동기화를 제거 할 수 있지만 일반적으로 ArrayList를 사용하는 것이 낫습니다. –
ArrayList
이 이제는 더 나은 클래스입니다. Vector
은 이제 레거시로 간주되며 스레드 안전성이라는 성능 오버 헤드가 추가되었습니다.
대신 ArrayList
을 사용할 수 있습니다.
동기화 된 버전을해야 할 경우, 같은 수행 할 수 있습니다 당신이 List
구현을 필요로하지만, 스레드 안전을 필요로하지 않을 때
ArrayList arrayList = new ArrayList();
List synchList = Collections.synchronizedList(arrayList);
사용 ArrayList
을, 그리고 당신은 List
구현을 필요로 할 때 CopyOnWriteArrayList
를 사용하는 스레드로부터 안전합니다.
Vector
은 Java 1.0의 레거시 컬렉션 클래스입니다. Java 1.2 (오래 전!)에 ArrayList
및 HashMap
과 같은 새 컬렉션 클래스가 포함되어 Vector
및 Hashtable
레거시 클래스를 대체하기 위해 만들어진 Collections Framework이 추가되었습니다.
앞서 말했듯이 레거시 수집 클래스에는 동기화가 내장되어있어 많은 응용 프로그램에서 불필요합니다. 동기화에는 성능상의 오버 헤드가 있으므로 필요하지 않은 경우 동기화를 사용하면 안됩니다.
일부 경우 (프로그램이 멀티 스레드이고 여러 스레드가 동일한 데이터에 액세스하는 경우) 컬렉션을 동기화해야하는 경우가 있습니다. 어떤 사람들은 다음 이전 Vector
또는 Hashtable
클래스를 사용하는 것이지만, 더 좋은 방법은 예를 들어 ArrayList
와 동기화 래퍼를 사용하는 것입니다
// Your standard, unsynchronized list
List<String> data = new ArrayList<String>();
// Use this to put it into a synchronization wrapper
List<String> syncedData = Collections.synchronizedList(data);
자세한 내용은 Collections.synchronizedList()
(다른 방법)의 API 문서를 참조하십시오.
스레드 안전 목록이 필요한 경우 CopyOnWriteArrayList는 Collections.synchronizedList (data) –
@ Dónal보다 더 나은 성능을 제공합니다 (실제로는 그렇지 않습니다). –
@StefanReich 제발 –
'벡터'가 사용되지 않는 것은 궁금합니다. 나는 일대일 교체가 없기 때문에 그렇게하지 않았다고 생각합니다. – skaffman
Hashtable에 대해서도 마찬가지입니다. 대신 HashMap을 사용하십시오. –
@skaffman'CopyOnWriteArrayList'는 스레드 세이프'List' 구현 인 한 일대일 대체품입니다. 대부분의 사용법에서'CopyOnWriteArrayList'는'Vector'보다 더 나은 성능을 제공해야합니다. –