ArrayList ve Vector arasındaki farklar nelerdir?


352

ArrayList ve Vector arasındaki iki veri yapısı arasındaki farklar nelerdir ve her birini nerede kullanmalısınız?


5
Burada tam kopya görmüyorum.
Jeff Atwood

2
Vector v = new Vector(3, 2);
Java'da

Asla kullanmayın Vector, kullanmayın ArrayListveya LinkedListveyaArrayDeque

Yanıtlar:


365

farklılıklar

  • Vektörler senkronize edilir, ArrayLists değildir.
  • Veri Büyüme Yöntemleri

Vektörleri kullanmak için özel bir gereksinim yoksa ArrayLists kullanın.

Senkronizasyon

Birden fazla iş parçacığı aynı anda bir ArrayList'e erişiyorsa, listeyi yapısal olarak veya yalnızca bir öğeyi değiştiren kod bloğunu harici olarak senkronize etmeliyiz. Yapısal değişiklik, öğelerin listeden eklenmesi veya silinmesi anlamına gelir. Mevcut bir elemanın değerinin ayarlanması yapısal bir değişiklik değildir.

Collections.synchronizedList listeye yanlışlıkla senkronize olmayan erişimin önüne geçmek için normalde listenin oluşturulduğu sırada kullanılır.

Referans

Veri büyümesi

Dahili olarak, hem ArrayList hem de Vector, bir Array kullanarak içeriklerini tutar. Bir öğe bir ArrayList veya Vector öğesine eklendiğinde, nesnenin odadan çıkması durumunda dahili dizisini genişletmesi gerekir. ArrayList, dizi boyutunu yüzde 50 oranında artırırken, Vector varsayılan olarak dizisinin boyutunu iki katına çıkarır.

Referans


7
@Rei Tam olarak ne dedi: Birden fazla konu ( docs.oracle.com/javase/tutorial/essential/concurrency/… )
Özyinelemeli

Bir ArrayList'ten çok iş parçacıklı bir şekilde OKUMA ne dersiniz? Konu güvenli mi?
Xunie

@Xunie ArrayList veya diğer koleksiyon sınıflarından okumak asla sorun olmaz. ArrayList veya koleksiyona varolan değerleri eklediğinizde veya kaldırdığınızda veya değiştirdiğinizde sorun ortaya çıkar.
sainath reddy

85

Belgelerin dediği gibi, a Vectorve a ArrayListneredeyse eşdeğerdir. Fark Vector, a'ya erişimin senkronize edilmişken, a'ya erişimin senkronize ArrayListolmamasıdır. Bunun anlamı, Vectorbir seferde yalnızca bir iş parçacığının yöntemleri çağırabilmesidir ve kilidi edinmede hafif bir ek yük vardır; an kullanırsanız ArrayList, durum böyle değil. Genel olarak ArrayList; tek iş parçacıklı durumda daha iyi bir seçimdir ve çok iş parçacıklı durumda kilitleme üzerinde daha iyi kontrol elde edersiniz. Eşzamanlı okumalara izin vermek ister misiniz? İnce. On yazlık bir toplu iş için bir eşitleme yapmak ister misiniz? O da iyi. Sonunda biraz daha fazla bakım gerektiriyor, ancak muhtemelen ne istiyorsun. Ayrıca, bir ArrayList'iniz varsa,Collections.synchronizedListişlevi senkronize bir liste oluşturmak, böylece size eşdeğer bir elde Vector.


53

VectorBir olan kırık olduğu sınıf değil o "senkronize" olma ve rağmen ÅŸan sadece öğrenciler ve diğer deneyimsiz programcılar tarafından kullanılır.

ArrayList profesyoneller ve deneyimli programcılar tarafından kullanılan go-to List uygulamasıdır.

İş parçacığı Güvenli Liste uygulaması isteyen profesyoneller a CopyOnWriteArrayList.


10
senkronize edilmiş ancak threadsafe değil? bu ne demek? [ben yeni
başlıyorum

13
@Dineshkumar iş parçacığı güvenli Vectorolması amaçlanmıştır , ancak aslında iş parçacığı güvenli değil * yapan bir tasarım kusuru vardır, Temelde itiraz bir sınıftır. Bazı nedenlerden dolayı, üniversiteler vs bu haberi duymamış ve hala kullanımını savunmaktadır.
Bohemian

1
@Dineshkumar bu
Bohemian

3
@Dineshkumar üzgünüm - bu iyi bir bağlantı değildi. İşte kesin cevap . Kısacası, senkronizasyonu işe yaramaz.
Bohemian

7
Eğlenceli gerçek: Java1.7 Yığını, Vector sınıfını kullanır.
Tobi

26

ArrayList daha yeni ve% 20-30 daha hızlı.

Açıkça görünen bir şeye ihtiyacınız yoksa Vector,ArrayList


32
Kanıt vererek iddiayı destekleyebilir misiniz 20-30% faster?
kullanıcı

5
@ kullanıcı O zamanlar sadece büyük diziler etrafında clunking gelen kişisel bir deneyim oldu. Üç yıldan uzun bir süredir, tam olarak neden bahsettiğime işaret edemiyorum ama orada çok sayıda kriter var. En büyük atlamaları gördüğünüz yerde diş açmaya
Oli

Büyüme fonksiyonu en büyük etkiyi yaratacağından, Vector / Arraylist'i okuyup yazmanız durumunda% 20-30 sadece eşleşir. Yalnızca bir kez yazan ve daha sonra yalnızca okuma yapan bir karşılaştırma ölçütünüz varsa farklı bir sonuç verir
Tobi

2
Lütfen verilerinize bir kanıt
sunun

Vektör senkronize olduğundan ve arraylist senkronize olmadığından, bunun bir nedeni olabilir, arraylist vektörden daha hızlıdır.
ASK

23

Vector ve ArrayList arasında 2 büyük fark vardır.

  1. Vektör varsayılan olarak senkronize edilir ve ArrayList değildir. Not: arraylist nesnesini Collections.synchronizedList () yöntemine ileterek ArrayList'i de senkronize edebilirsiniz. Senkronize edilmiş araçlar: herhangi bir yan etkisi olmayan çoklu dişlerle kullanılabilir.

  2. ArrayLists, yeni öğe için alan yeterli olmadığında önceki boyutun% 50'si kadar büyür; Vector, yeni gelen öğe için yer olmadığında, önceki boyutun% 100'ü kadar büyür.

Bunun dışında, programlama çabası açısından aralarında bazı pratik farklılıklar vardır:

  1. Öğeyi Vector'den belirli bir konuma almak için elementAt (int index) işlevini kullanırız. Bu işlev adı çok uzundur. ArrayList Bunun yerine elimizdeki almak çok kolay hatırlamak ve kullanım etmektir (int index).
  2. Benzer şekilde, varolan bir öğeyi Vector öğesinde yeni bir öğeyle değiştirmek için , yine çok uzun olan ve programlayıcıyı tekrar tekrar kullanmak için tahriş edebilecek olan setElementAt () yöntemini kullanırız. Bunun yerine ArrayList, kullanımı ve hatırlanması kolay add (int indeksi, nesne) yöntemine sahiptir. Bunun gibi, ArrayList'te daha programcı dostu ve kullanımı kolay fonksiyon isimlerine sahiptirler.

Hangisi ne zaman kullanılır?

  1. Vektörleri tamamen kullanmaktan kaçının. ArrayLists, bir Vector öğesinin yapabileceği her şeyi yapabilir. ArrayLists öğesinden daha fazlası varsayılan olarak senkronize edilmez. İsterseniz, Collections util sınıfını kullanarak istediğiniz zaman senkronize edebilirsiniz.
  2. ArrayList'in hatırlanması ve kullanımı kolay işlev adları vardır.

Not : Arraylist% 100 büyüyor olsa da, başlangıç ​​aşamalarında yeterli bellek ayırdığınızdan emin olmak için bunu ensurecapacity () yöntemiyle önleyebilirsiniz.

Umarım yardımcı olur.


5
ArrayLIst ve Vector için büyüme boyutu hakkında yanlış bilgi (anahtarlamalı), aksi takdirde oldukça iyi bir cevap.
Nenad Bulatovic

Vector'un büyümesi, gerekli docs.oracle.com/javase/7/docs/api/java/util/Vector.html ArrayList sırasında iki katına çıkıyor "Büyüme politikasının ayrıntıları, bir öğe eklemenin ötesinde değil sabit amortisman süresi maliyeti. " docs.oracle.com/javase/7/docs/api/java/util/ArrayList.html
Mohamed El-Nakib

Yöntem adının bu yöntemi kullanmanın veya kullanmamanın ölçütü olabileceğini anlamıyorum.
Surender Kherwa

14

ArrayListve Vectorher ikisi de Liste arabirimini uygular ve ekleme sırasını korur.Ancak ArrayListve Vectorsınıflar arasında birçok fark vardır ...

ArrayList -

  1. ArrayList senkronize edilmedi.
  2. ArrayList öğe sayısı kapasitesinden fazlaysa geçerli dizi boyutunun% 50'sini artırır.
  3. ArrayList eski bir sınıf değil, JDK 1.2'de tanıtıldı.
  4. ArrayList senkronize olmadığı için hızlıdır.
  5. ArrayList elemanları taramak için Iterator arabirimini kullanır.

Stok Fotoğraf -

  1. Vector senkronize edilir.
  2. Vector % 100'lük artışlar, toplam öğe sayısı kapasitesinden fazla ise dizi boyutunu iki katına çıkarır.
  3. Vector eski bir sınıftır.

  4. Vector yani çok iş parçacıklı ortamda senkronize olduğundan yavaştır, mevcut iş parçacığı nesne kilidini serbest bırakana kadar diğer iş parçacıklarını çalıştırılabilir veya çalıştırılamaz durumda tutar.

  5. VectorElemanlar arasında geçiş yapmak için Numaralandırma arayüzünü kullanır. Ancak Iterator'ı da kullanabilir.

Ayrıca Bakınız: https://www.javatpoint.com/difference-between-arraylist-and-vector


10

Temel olarak hem ArrayList hem de Vector, dahili Nesne Dizisi kullanır.

ArrayList: ArrayList sınıfı AbstractList'i genişletir ve List arabirimini ve RandomAccess'i (işaret arabirimi) uygular. ArrayList gerektiğinde büyüyebilen dinamik dizileri destekler. Bize elementler üzerinde ilk iterasyon verir. ArrayList, dahili Object Array kullanır; varsayılan 10 başlangıç ​​boyutuyla oluşturulurlar. Bu boyut aşıldığında, koleksiyon otomatik olarak varsayılan boyutun yarısına çıkar (15).

Vektör: Vektör ArrayList'e benzer, ancak farklar senkronize edilir ve varsayılan başlangıç ​​boyutu 10'dur ve boyutu aşıldığında orijinal boyutun iki katına çıkar, yani yeni boyut 20 olacaktır. Vektör tek sınıftır RandomAccess uygulamak için ArrayList dışında. Vector dört yapıcıdan birinin iki parametre almasını sağlar Vector (int initialCapacity, int capacIncrement) kapasiteIncrement, vektör taştığında kapasitenin artırılacağı miktardır, dolayısıyla yük faktörü üzerinde daha fazla kontrole sahiptir.

Diğer bazı farklılıklar: resim açıklamasını buraya girin


1
LinkedList'e neden ilk ve sonda nesne eklemek yavaş? Her iki diziListesinden ve vektöründen daha hızlı olmamalı mı?
CHANist

@ CHANist Ben de katılıyorum. Başlangıç ​​ve bitişte bir nesne eklemek, ortasına bir nesne eklemekten daha hızlı olmalıdır.
Rahul Rastogi

1
Bu tablonun LinkedList sütununda kullanılan dil çelişkilidir. Bir LinkedList'in başına ve sonuna ekleme, ortadaki öğeleri eklemekten daha hızlıdır, ancak ArrayLists veya Vektörlere ekleyen veya ekleyenlerden daha yavaştır. Bunun nedeni, her ekleme işleminin yerel olmayan başvurularla bellek ayırması gerektirmesi ve önbellek kaçırma olasılığının artmasıdır. LinkedList'teki arama, öğe sayısı ile doğrusal olsa da ve sonuna kadar bir işaretçi saklanmamış olsa da, bellek yalnızca bir öğe için yeniden tahsis edildiği için ekleme işlemi hala daha hızlıdır.
Sophia Gold
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.