🚀 BAŞTAN SONA JAVA DİLİ BÖLÜM-13: Collections Framework, ArrayList ve LinkedList 📦

Konu Özeti

Java Collections Framework'ün dinamik veri yapılarına giriş yapılıyor. List arayüzü, ArrayList ve LinkedList sınıfları detaylandırılıyor. ArrayList'in dinamik dizi yapısıyla eleman ekleme, okuma, güncelleme ve silme işlemleri örnekleniyor. LinkedList'in çift yönlü bağlı liste yapısı ve başa/sona hızlı erişim avantajı gösteriliyor. İki yapının performans karmaşıklıkları karşılaştırılıyor ve kullanım senaryolarına göre seçim öneriliyor.

🚀 BAŞTAN SONA JAVA DİLİ BÖLÜM-13: Collections Framework, ArrayList ve LinkedList 📦

Selamlar! Serimizin 13. bölümüne hoş geldiniz.

Önceki bölümde sabit boyutlu Standart Dizileri (Arrays) ve `Arrays` yardımcı sınıfını incelemiştik. Bu bölümde ise eleman ekledikçe boyutu dinamik olarak büyüyüp küçülebilen verileri yönetmemizi sağlayan **Java Collections Framework** yapısına giriş yapıyoruz. **`List` Arayüzünü**, **`ArrayList`** ve **`LinkedList`** sınıflarını tüm detaylarıyla işleyeceğiz.

---

📌 1. Java Collections Framework Nedir? 🗺️

Standart Java dizilerinin (Arrays) en büyük kısıtlaması, boyutlarının başlangıçta sabitlenmesi ve sonradan değiştirilememesidir.

**Collections Framework**; nesne gruplarını dinamik, esnek ve yüksek performanslı bir şekilde saklamak, aramak, sıralamak ve manipüle etmek için sunulmuş hazır veri yapıları (List, Set, Queue, Map) koleksiyonudur.

### `List` Arayüzünün Temel Özellikleri:
• Elemanların **eklenme sırasını (insertion order)** korur.
• Tekrarlayan (duplicate) eleman eklenmesine izin verir.
• Elemanlara indeks numarası (0, 1, 2...) üzerinden erişilebilir.

---

🧱 2. Dinamik Dizi: `ArrayList` 🚀

`ArrayList`, arka planda dinamik bir dizi (resizable array) barındıran en popüler Koleksiyon sınıfıdır. Dizi dolduğunda boyutunu otomatik olarak %50 oranında artırır.

⚠️ **Kritik Kural:** Koleksiyonlar yalnızca **Referans Tipler (Wrapper Classes)** ile çalışır! İlkel tipler (`int`, `double`, `boolean`) yerine onların sarmalayıcı sınıfları (`Integer`, `Double`, `Boolean`) kullanılmalıdır.

### `ArrayList` Kullanım Örneği:

import java.util.ArrayList;
import java.util.List;

public class Main {
public static void main(String[] args) {
// List arayüzü referansı ile ArrayList nesnesi oluşturma (Polymorphism)
List<String> programlamaDilleri = new ArrayList<>();

// 1. Eleman Ekleme (`add`)
programlamaDilleri.add("Java");
programlamaDilleri.add("Python");
programlamaDilleri.add("C++");
programlamaDilleri.add("JavaScript");

// Belirli bir indekse eleman ekleme:
programlamaDilleri.add(1, "Rust"); // 1. indekse Rust ekler, diğerlerini kaydırır

System.out.println("Tüm Liste: " + programlamaDilleri);

// 2. Eleman Okuma (`get`)
System.out.println("0. İndeksteki Dil: " + programlamaDilleri.get(0));

// 3. Eleman Güncelleme (`set`)
programlamaDilleri.set(2, "C#"); // 2. indeksteki elemanı C# yapar

// 4. Eleman Silme (`remove`)
programlamaDilleri.remove("Python"); // Değere göre silme
programlamaDilleri.remove(0); // İndekse göre silme (Java silindi)

// 5. Boyut ve Eleman Kontrolü (`size`, `contains`)
System.out.println("Liste Boyutu: " + programlamaDilleri.size());
System.out.println("Rust listede var mı?: " + programlamaDilleri.contains("Rust"));

// 6. Liste Üzerinde Gezinme (For-Each)
System.out.println("--- Güncel Liste ---");
for (String dil : programlamaDilleri) {
System.out.println("-> " + dil);
}
}
}

---

🔗 3. Çift Yönlü Bağlı Liste: `LinkedList` ⛓️

`LinkedList`, arka planda bir dizi yerine her bir elemanın kendinden önceki ve sonraki düğümün (Node) adresini tuttuğu **Çift Yönlü Bağlı Liste (Doubly Linked List)** yapısını kullanır.

`LinkedList` sınıfı hem `List` hem de `Deque` (Double Ended Queue) arayüzlerini uyguladığı için listenin başına ve sonuna eleman ekleme/çıkarma işlemlerinde son derece hızlıdır.

import java.util.LinkedList;

public class Main {
public static void main(String[] args) {
LinkedList<String> kuyruk = new LinkedList<>();

kuyruk.add("Ahmet");
kuyruk.add("Mehmet");

// Başa ve Sona Hızlı Eleman Ekleme
kuyruk.addFirst("Ayşe"); // Başa ekler
kuyruk.addLast("Fatma"); // Sona ekler

System.out.println("LinkedList: " + kuyruk);

// Baştan ve Sondan Eleman Çıkarma
System.out.println("İlk Eleman Çıkarıldı: " + kuyruk.removeFirst());
System.out.println("Son Eleman Çıkarıldı: " + kuyruk.removeLast());

System.out.println("Kalan Liste: " + kuyruk);
}
}

---

⚖️ 4. `ArrayList` vs `LinkedList` Karşılaştırması 📊

| İşlem / Durum | `ArrayList` | `LinkedList` |
| :--- | :--- | :--- |
| **Arka Plan Yapısı** | Dinamik Dizi (Resizable Array) | Çift Yönlü Bağlı Liste (Nodes) |
| **Elemana Rastgele Erişim (`get(i)`)** | ⚡ **Çok Hızlı - $O(1)$** (Doğrudan adrese gider) | 🐢 **Yavaş - $O(n)$** (Düğümleri sırayla gezer) |
| **Aradan / Baştan Eleman Ekleme-Silme** | 🐢 **Yavaş - $O(n)$** (Elemanların kaydırılması gerekir) | ⚡ **Çok Hızlı - $O(1)$** (Sadece düğüm bağları güncellenir) |
| **Bellek Tüketimi** | 💚 Daha Az Bellek Harcar | 🔴 Daha Çok Bellek Harcar (Düğüm adres göstericileri yüzünden) |

> **Hangisini Seçmelisiniz?**
> • Sık sık rastgele verilere erişip okuma yapacaksanız: **`ArrayList`** (Vakaların %90'ında ilk tercihtir).
> • Veri kümesinin ortasına veya başına sürekli ekleme/çıkarma yapacaksanız: **`LinkedList`**.

---

📝 Bölüm Özeti ve Gelecek Bölüm 🔮

Bu bölümde Collections Framework yapısını, `ArrayList` ve `LinkedList` sınıflarının kullanımını ve aralarındaki performans karmaşıklıklarını öğrendik.

👉 **Bölüm 14'te Bizi Ne Bekliyor?**
• Benzersiz Eleman Saklama: **`Set` Arayüzü** 🛑
• **`HashSet`** (Hızlı ve Sırasız)
• **`LinkedHashSet`** (Eklenme Sıralı)
• **`TreeSet`** (Doğal Sıralı / Sorted)
• `hashCode()`
ve `equals()` Metotlarının Mantığı

Sorularınızı konu altından iletebilirsiniz. Bir sonraki bölümde görüşmek üzere! ☕✨

🔒 Bu içeriği görmek için giriş yapın

 
Yanıt yazmak için giriş yapmalısınız
Forum özelliklerini kullanmak ve Level 2 üyelik satın almak için hesabınıza giriş yapın.
135,050Konular
3,297,703Mesajlar
326,233Kullanıcılar
membiSon Üye
Üst Alt