LinkedList ve ArrayList Karşılaştırması
Doğru liste türünü seçmek için ekleme, silme ve rastgele erişim performanslarını karşılaştırın.
LinkedList ve ArrayList Karşılaştırması, CoddyKit'te ücretsiz bir Java Academy dersidir. Bu, 4 dersinin 3. dersidir. Aşağıdan dersin tamamını ücretsiz okuyabilir, sonra tarayıcıda yerleşik kod editörü ve 7/24 yapay zeka koçu ile uygulamalı olarak pratik yapabilirsin. Bu, Java Academy öğrenme yolunun bir parçasıdır ve ilerlemeniz web ve CoddyKit uygulaması arasında senkronize olur. Java Academy kursu toplamda 4 dersten oluşur.
Temel Soru
Hem ArrayList hem de LinkedList, List arayüzünü uygular; bu nedenle aynı uygulama programlama arayüzünü paylaşırlar. Fark, iç veri yapılarında ve her birinin verimli biçimde gerçekleştirdiği işlemlerde yatar.
ArrayList İç Yapısı
ArrayList, öğeleri bitişik bir dizide saklar. Dizi dolduğunda 1,5 kat daha büyük yeni bir diziyle değiştirilir ve tüm öğeler kopyalanır.
import java.util.ArrayList;
ArrayList<String> list = new ArrayList<>(4); // initial capacity 4
list.add("A"); list.add("B"); list.add("C"); list.add("D");
list.add("E"); // triggers resize: new array of capacity 6
System.out.println(list.get(3)); // O(1) — direct index accessLinkedList İç Yapısına Yeniden Bakış
Her öğe, önceki/sonraki işaretçileri olan kendi Node nesnesinde bulunur. Bitişik bellek yoktur — düğümler öbeğin herhangi bir yerinde olabilir.
import java.util.LinkedList;
LinkedList<String> list = new LinkedList<>();
list.add("A"); list.add("B"); list.add("C");
// get(index) must traverse from head or tail
System.out.println(list.get(1)); // O(n) — traverses 1 step from headRastgele Erişim: ArrayList Kazanır
ArrayList.get(i) O(1)'dir — doğrudan dizi indeksi kullanılır. LinkedList.get(i) O(n)'dir — n/2'ye kadar düğüm dolaşılır.
ArrayList<Integer> al = new ArrayList<>();
LinkedList<Integer> ll = new LinkedList<>();
for (int i = 0; i < 100_000; i++) { al.add(i); ll.add(i); }
// Fast:
System.out.println(al.get(99_999)); // O(1)
// Slow — avoid this pattern with LinkedList:
System.out.println(ll.get(99_999)); // O(n)Başa Ekleme: LinkedList Kazanır
ArrayList'te 0 indeksine ekleme yapmak tüm öğelerin kaydırılmasını gerektirir — O(n). LinkedList yalnızca iki işaretçiyi günceller — O(1).
// ArrayList: O(n) — shifts all elements right
ArrayList<String> al = new ArrayList<>(List.of("B","C","D"));
al.add(0, "A"); // shifts B, C, D
// LinkedList: O(1)
LinkedList<String> ll = new LinkedList<>(List.of("B","C","D"));
ll.addFirst("A"); // updates head pointer onlySona Ekleme: Yaklaşık Olarak Eşit
Hem ArrayList hem de LinkedList, sona amortize O(1) ekleme sunar. ArrayList zaman zaman yeniden boyutlandırma ve kopyalama işlemi başlatır; ancak amortize maliyet yine O(1)'dir. LinkedList yeni bir düğüm ayırır — yeniden boyutlandırma gerekmez.
ArrayList<Integer> al = new ArrayList<>();
LinkedList<Integer> ll = new LinkedList<>();
for (int i = 0; i < 1_000_000; i++) {
al.add(i); // amortized O(1)
ll.add(i); // O(1)
}Bellek Kullanımı
ArrayList: öğe başına yaklaşık 8 bayt (dizide bir başvuru). LinkedList: öğe başına yaklaşık 48 bayt (veri, önceki ve sonraki başvurular ile nesne başlığını içeren Node nesnesi). Büyük veri kümelerinde ArrayList çok daha az bellek kullanır.
Yineleme Performansı
Sıralı yineleme (for-each veya yineleyici) her ikisi için de O(n)'dir. Ancak ArrayList, öğeler bellekte bitişik olduğundan CPU önbelleğinin önceden getirme özelliğinden yararlanır. LinkedList düğümleri öbeğe dağılır ve önbellek kaçırmalarına neden olur.
// Both O(n), but ArrayList is faster in practice due to cache locality
for (String s : arrayList) { process(s); }
for (String s : linkedList) { process(s); } // more cache missesOrtaya Ekleme/Silme
Her ikisi de konumu bulmak için O(n) gerektirir. Konum bulunduğunda ArrayList öğeleri O(n) ile kaydırır; LinkedList ise bağlantıyı O(1) ile kaldırır. Bu nedenle zaten bir yineleyici tutuyorsanız sık yapılan orta bölüm değişikliklerinde LinkedList öne çıkar; aksi durumda ikisi benzerdir.
LinkedList<Integer> ll = new LinkedList<>(List.of(1,2,3,4,5));
ListIterator<Integer> it = ll.listIterator();
while (it.hasNext()) {
int val = it.next();
if (val == 3) it.remove(); // O(1) unlink via iterator
}
System.out.println(ll); // [1, 2, 4, 5]Karar Rehberi
Baskın işleminize göre seçim yapın:
- ArrayList: rastgele erişim, yineleme, sona ekleme — kullanım alanlarının %90'ını kapsar
- LinkedList: sık başa/sona ekleme ve silme, kuyruk/çift uçlu kuyruk/yığın uygulama
- ArrayDeque: yalnızca kuyruk veya yığın gerekiyorsa (LinkedList'ten daha iyidir)
Karşılaştırma Özeti
Performans için zihinsel model:
- get(i): ArrayList O(1), LinkedList O(n)
- add(0,x): ArrayList O(n), LinkedList O(1)
- add(x): Her ikisi de amortize O(1)
- Yineleyiciyle silme: Konum belirlendikten sonra her ikisi de O(1)
- Öğe başına bellek: ArrayList yaklaşık 8B, LinkedList yaklaşık 48B
Hızlı Kontrol
Saniyede milyonlarca kez görevlerin sona eklendiği ve baştan kaldırıldığı bir görev kuyruğu oluşturuyorsunuz. En uygun veri yapısı hangisidir?
Özet: LinkedList ve ArrayList karşılaştırması
Temel çıkarımlar:
- ArrayList, rastgele erişimde (O(1)) ve önbellek dostu yinelemede üstündür
- LinkedList, baş/kuyruk işlemlerinde O(1) performans sunar
- Bellek: ArrayList öğe başına yaklaşık 8B; LinkedList öğe başına yaklaşık 48B kullanır
- Kuyruklar/yığınlar için LinkedList yerine ArrayDeque tercih edin
- Çoğu senaryoda varsayılan olarak ArrayList doğru seçimdir
Sıkça Sorulan Sorular
“LinkedList ve ArrayList Karşılaştırması” dersi ücretsiz mi?
Evet — “LinkedList ve ArrayList Karşılaştırması” dersin tüm metni burada web'de ücretsiz olarak okunabilir. Etkileşimli olarak pratik yapmak (yerleşik kod editörü ve 7/24 yapay zeka koçu) ve Java Academy kursunun geri kalanını açmak için CoddyKit PRO'ya yükselt. Java Academy kursu toplamda 4 dersten oluşur.
“LinkedList ve ArrayList Karşılaştırması” dersinde ne öğreneceğim?
Doğru liste türünü seçmek için ekleme, silme ve rastgele erişim performanslarını karşılaştırın. Java Academy ile uygulamalı kodu tarayıcıda doğrudan çalıştırarak pratik yaparsın ve 7/24 yapay zeka koçu dersi çalışırken sorularını yanıtlar.
Java Academy öğrenmeye başlamak için deneyim gerekli mi?
Önceden deneyim gerekmez. CoddyKit'te Java Academy, başlangıçtan ileri seviyeye kadar yapılandırıldığı için buradan başlayabilir veya başından başlayıp kendi hızında ilerleme yapabilirsin. Bu, 4 dersinin 3. dersidir.
“LinkedList ve ArrayList Karşılaştırması” dersi ne kadar sürer?
Çoğu CoddyKit dersi yaklaşık 5–10 dakika sürer. Her biri kısa ve etkileşimli olduğu için sabit ilerleme yaparsın ve web ile uygulama arasında tam olarak bıraktığın yerden devam edebilirsin.
Bu Java Academy dersinde kod yazıp çalıştırabilir miyim?
Evet. Her Java Academy dersi yerleşik bir kod editörü içerir, bu sayede tarayıcıda gerçek kod yazıp çalıştırabilir ve anlık yapay zeka geri bildirimi alırsın — yerel kurulum gerekli değildir.
Bu kursun tüm dersleri
- LinkedList'in İç Yapısı
- Deque İşlemleri: Yığın ve Kuyruk
- LinkedList ve ArrayList Karşılaştırması
- Sıralı İşleme için PriorityQueue