2009-11-24 27 views
26

Önceden bir Uzunluğun bilinmediği durumlarda, bir Vektör'in descript olmayan nesneler için kullanılması iyi olduğunu düşünürdüm. Bildiğim kadarıyla, iş parçacığı için güvenli olduğunu düşünmüştüm.java.util.Vektör - alternatifler

Vector'un artık kullanılmaması gereken nedir ve alternatif nedir?

+1

'Vector''in kullanımdan kaldırılmadığını merak ediyor. Sanırım bire bir değiştirme olmadığı için bunu yapmadılar. – skaffman

+0

Bunun Hashtable için de geçerli olduğunu unutmayın - bunun yerine HashMap kullanın. –

+0

@skaffman 'CopyOnWriteArrayList', bir thread'list' List' uygulaması olduğu sürece birebir yerine bir ya da daha az yer değiştirir. Çoğu kullanım için, 'CopyOnWriteArrayList', 'Vector' –

cevap

35

Vector yerine ArrayList kullanmalısınız. Vector dahili senkronizasyon için kullanılır, ancak gerçek tutarlılık için nadiren yeterlidir ve gerçekten gerekli olmadığında yürütmeyi yavaşlatır. Ayrıca, this stackoverflow question numaralı telefona bakın. Şu anda kullanmak daha iyi bir sınıf olan

+11

'dan daha iyi bir performans sunmalıdır Nadiren "gerçek tutarlılık için yeterince iyi" hakkında iyi bir nokta. Bir koleksiyon birden çok iş parçacığı tarafından görülebilirse, muhtemelen 'java.util.concurrent' adlı uygun koleksiyonu kullanmanız (ve iyice anlamanız gerekir) gerekir. Ve eğer birden fazla iş parçacığı için erişilebilir değilse, bir 'ArrayList' daha ucuzdur. Bir koleksiyonun birden fazla iş parçacığı tarafından kullanıldığı "gri alanlar" ın ortadan kaldırılması: koleksiyonları kendiliğinden dişli olarak güvenli hale getiremezsiniz; Müşterilerinin bunu nasıl kullandığı her zaman bir faktördür. Günümüzde – erickson

+0

, Vector geliştirildi mi, yoksa ArrayList ile yapmalı mıyız? –

+1

@AquariusPower Sözleşme, senkronizasyonu kullanması gerektiğini belirtir, bu nedenle gerçekten geliştirilemez. Yani, modern bir JVM bazen senkronizasyonu bir optimizasyon olarak kaldırabilecektir, ancak genel olarak ArrayList'i kullanmak daha iyidir. –

7

ArrayList artık kullanılabilir. Vector artık Legacy olarak kabul edilir ve Thread-Safe olmanın ek performans yüküne sahiptir.

14

Bunun yerine bir ArrayList kullanabilirsiniz.

bir senkronize sürümü gerekiyorsa, böyle bir şey yapabilirsiniz: Bir List uygulaması gerek ama iplik güvenlik gerekmediğinde

ArrayList arrayList = new ArrayList(); 

List synchList = Collections.synchronizedList(arrayList); 
7

Kullanım ArrayList ve bir List uygulaması gerektiğinde CopyOnWriteArrayList kullandığını iş parçacığı güvenlidir.

5

Vector, Java 1.0'dan eski bir koleksiyon sınıftır. Java 1.2'de (uzun zaman önce!), Vector ve Hashtable eski sınıflarının yerini alması amaçlanan ArrayList ve HashMap gibi yeni koleksiyon sınıflarını içeren Collections Framework eklenmiştir.

Daha önce de söylediğim gibi, eski koleksiyon sınıfları birçok uygulama için gereksiz olan yerleşik bir senkronizasyona sahipti. Senkronizasyonun bir performans yükü vardır, bu yüzden gerekli değilse onu kullanmamalısınız.

Bazı durumlarda (programınız çok iş parçacıklı olduğunda ve birden fazla iş parçacığı aynı verilere eriştiğinde) koleksiyonlarınızı senkronize etmeniz gerekir. Bazı insanlar daha sonra eski Vector veya Hashtable sınıfları kullanmak istiyorsunuz, ancak daha iyi bir yolu örneğin ArrayList bir ile bir senkronizasyon sarmalayıcı kullanmaktır:

// 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); 

fazla bilgi için Collections.synchronizedList() (ve diğer yöntemler) API belgelerine bakın.

+6

İş parçacığı güvenli bir Listeye ihtiyacınız varsa, CopyOnWriteArrayList daha fazla performans sunar (çoğu durumda), Collections.synchronizedList (veri) –

+0

@ Dónal Bu gerçekten doğru değil. –

+0

@StefanReich lütfen ayrıntılandırın –

İlgili konular