SORU
27 Kasım 2008, PERŞEMBE


ArrayList üzerinde LinkedList ne zaman kullanılır?

Her zaman kullanmak için sadece tek istediğim:

List<String> names = new ArrayList<String>();

Tür adı olarak arabirim kullanıyorumtaşınabilirlikne zaman ki , soruyorum bu gibi sorular kodumu tamir edebilirim.

LinkedList ArrayList ve tersi kullanılmalıdır?

CEVAP
27 Kasım 2008, PERŞEMBE


TL;DRArrayDeque ArrayList tercih edilirçokdaha durumlarda kullanın, LinkedList Daha. Emin-değil; sadece ArrayList ile başlar.


LinkedList ve ArrayList Liste iki farklı uygulamaları arayüzü. LinkedList iki kat bağlantılı liste ile uygular. ArrayList dinamik diziyi yeniden boyutlandırma gerçekleştirir.

Standart bağlı liste ve dizi işlemleri gibi çeşitli yöntemler farklı algoritmik çalışma zamanları olacak.

LinkedList<E> için

  • get(int index) (n)
  • add(E element) O(1) ' dir
  • add(int index, E element) (n)
  • remove(int index) (n)
  • Iterator.remove() (1) <--- ana parası LinkedList<E>
  • ListIterator.add(E element) (1) <--- ana parası LinkedList<E>

ArrayList<E> için

  • get(int index) O(1) < - - - ArrayList<E> yararı ana
  • add(E element) diziyi yeniden boyutlandırılabilir ve kopyalanmalıdır beri O(1) amortize edilmiş, ama O(n) en kötü durum
  • add(int index, E element) O(n - dizin) itfa edilmiş, ama O(n) en kötü durum (yukarıda)
  • remove(int index) O(n - dizin) (yani çıkarılması son O(1))
  • Iterator.remove() O(n - dizin)
  • ListIterator.add(E element) O(n - dizin)

LinkedList<E> sürekli-zaman ekleme veya çıkarma için izin verirkullanımına kullanmaama öğeler erişim tek sıralı. Diğer bir deyişle, listede ileri geri yürüyebilir, ama listede bir pozisyon bulmak zaman listenin büyüklüğü ile orantılı alır.

ArrayList<E> diğer taraftan, sürekli zaman içinde herhangi bir öğe kapmak çok hızlı rastgele okuma erişimi sağlar. Ama ya sonunda ama her yerden ekleme ve çıkarma üzerinde ikinci elemanları değişen, ya da bir açılış yapmak için ya da boşluğu doldurmak gerektirir. Ayrıca, eğer eklemek daha fazla öğe daha kapasitesinin temel dizi, yeni dizi (1.5 kat) tahsis edilen, eski dizi kopyalanır yeni bir tane eklemek için bir ArrayList O(n), en kötü durum ama sabit bir ortalama.

Bu yüzden yapmak istediğiniz işlemleri bağlı olarak, uygulamaları buna göre seçmelisiniz. Liste iki tür üzerinden yineleme hemen hemen aynı derecede ucuz. (ArrayList içinde dolaşmak teknik olarak daha hızlı, ama gerçekten performans-hassas bir şey yapmadıktan sonra, her iki sabitleri onlar bu konuda endişelenmenize gerek yok.)

LinkedList kullanarak ana faydaları ne zaman yeniden kullanımı ekleme ve öğeleri kaldırmak için mevcut kullanımına ortaya çıkar. Bu işlemlerden sonra O yapılır(1) yerel olarak tek liste değiştirerek olabilir. Dizi listesinde, dizinin geri kalanı gerekirtaşındı(yani kopyaladım). Diğer tarafta, arayan bir LinkedList anlamı aşağıdaki bağlantıları O(n), oysa bir ArrayList istenen pozisyon olabilir matematiksel olarak hesaplanmış ve ulaşılan O(1).

Eğer büyük bir liste varsa, ayrıca, bellek kullanımı da farklı olduğunu unutmayın. Bir LinkedList her öğenin önceki ve sonraki öğeleri işaretçiler da saklı olduğundan daha fazla yük vardır. ArrayLists bu yükü yok. Ancak, ArrayLists kapasitesi için ayrılan kadar bellek elemanları aslında eklenmiş olsun.

Bir ArrayList varsayılan başlangıç kapasitesi oldukça küçük (Java 1.4 - 1.7 10). Ama temel uygulama bir dizi olduğundan, dizinin öğeleri bir sürü eklerseniz boyutlandırılmış olmalıdır. Öğeleri bir sürü eklemek için gidiyoruz biliyorum boyutlandırma yüksek maliyet önlemek için, yüksek bir başlangıç kapasitesi ile ArrayList oluşturmak.

Bu fazlalaştıVektörayrıca Liste arabirimini uygular ve hemen hemen aynı Için. Fark Vektör iş parçacığı için güvenli böylece eşitlenmiş olmasıdır. Bu nedenle de ArrayList göre biraz daha yavaş olur. Anladığım kadarıyla, en Java programcıları muhtemelen Eğer gerçekten değer açıkça zaten senkronize beri ArrayList lehine Vektör kaçının.

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • Dom Esposito

    Dom Esposito

    26 Mayıs 2011
  • katherine gomez

    katherine go

    1 Aralık 2011
  • sdasmarchives

    sdasmarchive

    2 HAZİRAN 2010