-
Sadrazamv4
instagram:sadrazam.spy Tg:Sadrazamv4
🚀 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! ☕✨
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