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
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) ' diradd(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ı anaadd(E element)
diziyi yeniden boyutlandırılabilir ve kopyalanmalıdır beri O(1) amortize edilmiş, ama O(n) en kötü durumadd(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.
Diğer seçenekler üzerinde seyahat ve T...
İsteği ne zaman kullanılır.Yanıt üzeri...
Sanal yıkıcılar ne zaman kullanılır?...
Nasıl Android üzerinde internet erişim...
'DateTime, zaman Damgası, Zaman v...