Eğitim Portalı/Java/Collections Framework
Java01-java/08-collections

Collections Framework

Dizilerle sabit sayıda veriyi tutmayı öğrendik. Ama gerçek programlarda veri sürekli büyür, küçülür, sıralanır, gruplanır. Collections Framework, Java'nın bu ihtiyaçlar için sunduğu zengin veri yapıları kütüphanesidir…

Collections Framework

Dizilerle sabit sayıda veriyi tutmayı öğrendik. Ama gerçek programlarda veri sürekli büyür, küçülür, sıralanır, gruplanır. Collections Framework, Java'nın bu ihtiyaçlar için sunduğu zengin veri yapıları kütüphanesidir: dinamik listeler, tekrarsız kümeler, anahtar-değer haritaları ve onlarla çalışan hazır algoritmalar. Bir kez öğrenince, neredeyse her programda kullanacaksın.

Genel resim

Koleksiyonlar üç ana aileye ayrılır:

  • List — Sıralı, indeksli, tekrara izin veren dizi benzeri yapı. (ArrayList, LinkedList)
  • Set — Tekrar etmeyen elemanlar kümesi. (HashSet, LinkedHashSet, TreeSet)
  • Map — Anahtar → değer eşlemesi. (HashMap, LinkedHashMap, TreeMap)

Map teknik olarak Collection arayüzünü uygulamaz ama framework'ün ayrılmaz parçasıdır.

List

List, elemanları ekleme sırasına göre tutar, indeksle erişime izin verir ve tekrar eden değerleri kabul eder. En sık kullanılanı ArrayList'tir:

List<String> sehirler = new ArrayList<>();
sehirler.add("İzmir");
sehirler.get(0);
sehirler.remove("İzmir");
sehirler.size();

Sıralamak için Collections.sort(list) (doğal sıra) veya list.sort(Comparator...) (özel sıra) kullanırsın. Comparator.comparing(...) ile bir alana göre kolayca sıralayabilirsin. Örnek 1 (./Ornek1.java) liste işlemlerini ve iki farklı sıralamayı gösterir.

ArrayList indeksli erişimde hızlıdır; baştan/ortadan çok sık ekleme/silme yapıyorsan LinkedList düşünülebilir. Pratikte çoğu zaman ArrayList doğru seçimdir.

Set

Set, tekrar etmeyen elemanlar tutar; aynı elemanı iki kez eklersen ikincisi yok sayılır. Bir listeyi tekilleştirmenin en kolay yolu onu bir Set'e koymaktır:

  • HashSet — en hızlısı, sıra garantisi yok.
  • LinkedHashSet — ekleme sırasını korur.
  • TreeSet — elemanları sıralı tutar.

Map

Map, bir anahtarı bir değere eşler — bir sözlük gibi. Aynı anahtara tekrar put yaparsan değer güncellenir:

Map<String, Integer> stok = new HashMap<>();
stok.put("klavye", 12);
stok.get("klavye");                 // 12
stok.getOrDefault("yok", 0);        // 0
stok.containsKey("klavye");         // true

getOrDefault ve computeIfAbsent, sayma/gruplama işlerinde hayat kurtarır. TreeMap anahtarları sıralı tutar, LinkedHashMap ekleme sırasını korur. Örnek 2 (./Ornek2.java) Set ile tekilleştirmeyi ve Map ile kelime frekansı saymayı gösterir.

Hangisini ne zaman?

İhtiyaçSeçim
Sıralı, indeksli, tekrar olabilirList (ArrayList)
Tekrarsız, hızlı üyelik testiSet (HashSet)
Tekrarsız + sıralıTreeSet
Anahtar → değerMap (HashMap)
Anahtarları sıralı istiyorumTreeMap
Ekleme sırası korunsunLinked... türleri

Hepsini bir araya getirmek

Gerçek problemlerde bu yapıları birlikte kullanırsın. Örnek 3 (./Ornek3.java) bir öğrenci listesini not ortalamasına göre sıralar, ardından Map<String, List<Ogrenci>> ile bölümlere göre gruplayıp her bölümün ortalamasını hesaplar. record, Comparator zinciri ve computeIfAbsent burada bir arada çalışır.

Özet

List, Set ve Map'i; hangi durumda hangisinin uygun olduğunu; ekleme, erişim, sıralama ve gruplama işlemlerini gördük. Bu yapılar günlük programlamanın bel kemiğidir. Sırada, koleksiyonları tip güvenli yapan mekanizma: Generics.

Kod Örnekleri(3)

Ornek1

çalıştırılabilir
Ornek1.java
1// Ornek1: List (ArrayList) — ekleme, erişim, gezinme, sıralama.
2// Çalıştırma: java Ornek1.java
3import java.util.ArrayList;
4import java.util.Collections;
5import java.util.Comparator;
6import java.util.List;
7
8public class Ornek1 {
9
10    public static void main(String[] args) {
11        // List sıralı ve tekrar eden elemana izin veren bir koleksiyondur.
12        List<String> sehirler = new ArrayList<>();
13        sehirler.add("İstanbul");
14        sehirler.add("Ankara");
15        sehirler.add("İzmir");
16        sehirler.add("Ankara"); // tekrar serbest
17
18        System.out.println("Liste: " + sehirler);
19        System.out.println("Eleman sayısı: " + sehirler.size());
20        System.out.println("1. indeks: " + sehirler.get(1));
21        System.out.println("'İzmir' içeriyor mu? " + sehirler.contains("İzmir"));
22
23        sehirler.remove("Ankara"); // ilk eşleşeni siler
24        System.out.println("Bir 'Ankara' silindi: " + sehirler);
25
26        // Sıralama: doğal sıra (alfabetik)
27        Collections.sort(sehirler);
28        System.out.println("Alfabetik: " + sehirler);
29
30        // Comparator ile özel sıralama: uzunluğa göre
31        sehirler.sort(Comparator.comparingInt(String::length));
32        System.out.println("Uzunluğa göre: " + sehirler);
33
34        // for-each ile gezinme
35        System.out.println("\nGezinme:");
36        for (String s : sehirler) {
37            System.out.println("  - " + s + " (" + s.length() + " harf)");
38        }
39
40        // Sayısal liste üzerinde toplam
41        List<Integer> sayilar = List.of(5, 3, 8, 1, 9);
42        int toplam = 0;
43        for (int n : sayilar) toplam += n;
44        System.out.println("\nSayılar " + sayilar + " toplam = " + toplam
45                + ", max = " + Collections.max(sayilar));
46    }
47}
Çıktı yerel JDK 21 ile yakalandı — tarayıcıda JVM çalışmaz.

Ornek2

çalıştırılabilir
Ornek2.java
1// Ornek2: Set ve Map — tekilleştirme ve anahtar-değer eşlemesi.
2// Çalıştırma: java Ornek2.java
3import java.util.HashSet;
4import java.util.Map;
5import java.util.Set;
6import java.util.TreeMap;
7import java.util.HashMap;
8
9public class Ornek2 {
10
11    public static void main(String[] args) {
12        // --- Set: tekrar etmeyen elemanlar ---
13        Set<String> etiketler = new HashSet<>();
14        etiketler.add("java");
15        etiketler.add("spring");
16        etiketler.add("java"); // yok sayılır (zaten var)
17        System.out.println("Set (tekilleştirilmiş): " + etiketler);
18        System.out.println("Eleman sayısı: " + etiketler.size());
19
20        // --- Map: anahtar -> değer eşlemesi ---
21        Map<String, Integer> stok = new HashMap<>();
22        stok.put("klavye", 12);
23        stok.put("mouse", 30);
24        stok.put("monitor", 5);
25        stok.put("klavye", 15); // aynı anahtar -> değeri günceller
26
27        System.out.println("\nStok haritası:");
28        for (Map.Entry<String, Integer> e : stok.entrySet()) {
29            System.out.println("  " + e.getKey() + " -> " + e.getValue());
30        }
31        System.out.println("klavye stoğu: " + stok.get("klavye"));
32        System.out.println("kulaklik var mı? " + stok.containsKey("kulaklik"));
33        System.out.println("kulaklik (yoksa 0): " + stok.getOrDefault("kulaklik", 0));
34
35        // --- Pratik: kelime frekansı (Map + getOrDefault) ---
36        String metin = "kara kara kar kara kar kus";
37        Map<String, Integer> frekans = new TreeMap<>(); // TreeMap: anahtarları sıralı tutar
38        for (String kelime : metin.split(" ")) {
39            frekans.put(kelime, frekans.getOrDefault(kelime, 0) + 1);
40        }
41        System.out.println("\nKelime frekansı (sıralı): " + frekans);
42    }
43}
Çıktı yerel JDK 21 ile yakalandı — tarayıcıda JVM çalışmaz.

Ornek3

çalıştırılabilir
Ornek3.java
1// Ornek3: Gerçekçi senaryo — List + Map ile basit öğrenci yönetimi.
2// Çalıştırma: java Ornek3.java
3import java.util.ArrayList;
4import java.util.Comparator;
5import java.util.LinkedHashMap;
6import java.util.List;
7import java.util.Map;
8
9public class Ornek3 {
10
11    record Ogrenci(String ad, String bolum, double notOrt) {}
12
13    public static void main(String[] args) {
14        List<Ogrenci> ogrenciler = new ArrayList<>(List.of(
15                new Ogrenci("Ada", "Bilgisayar", 3.6),
16                new Ogrenci("Burak", "Elektrik", 2.9),
17                new Ogrenci("Ceren", "Bilgisayar", 3.9),
18                new Ogrenci("Deniz", "Elektrik", 3.2),
19                new Ogrenci("Emir", "Bilgisayar", 2.5)
20        ));
21
22        // Not ortalamasına göre azalan sırada sırala (Comparator zinciri).
23        ogrenciler.sort(Comparator.comparingDouble(Ogrenci::notOrt).reversed());
24        System.out.println("Başarı sırası:");
25        for (Ogrenci o : ogrenciler) {
26            System.out.printf("  %-6s %-12s %.2f%n", o.ad(), o.bolum(), o.notOrt());
27        }
28
29        // Bölüme göre grupla: Map<bölüm, öğrenci listesi>
30        Map<String, List<Ogrenci>> bolumeGore = new LinkedHashMap<>();
31        for (Ogrenci o : ogrenciler) {
32            bolumeGore.computeIfAbsent(o.bolum(), k -> new ArrayList<>()).add(o);
33        }
34
35        System.out.println("\nBölüm bazında ortalama:");
36        for (var giris : bolumeGore.entrySet()) {
37            double ort = giris.getValue().stream().mapToDouble(Ogrenci::notOrt).average().orElse(0);
38            System.out.printf("  %-12s : %.2f  (%d öğrenci)%n",
39                    giris.getKey(), ort, giris.getValue().size());
40        }
41    }
42}
Çıktı yerel JDK 21 ile yakalandı — tarayıcıda JVM çalışmaz.