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
Collectionarayü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.
ArrayListindeksli erişimde hızlıdır; baştan/ortadan çok sık ekleme/silme yapıyorsanLinkedListdüşünülebilir. Pratikte çoğu zamanArrayListdoğ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 olabilir | List (ArrayList) |
| Tekrarsız, hızlı üyelik testi | Set (HashSet) |
| Tekrarsız + sıralı | TreeSet |
| Anahtar → değer | Map (HashMap) |
| Anahtarları sıralı istiyorum | TreeMap |
| Ekleme sırası korunsun | Linked... 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ılabilir1// 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}Ornek2
çalıştırılabilir1// 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}Ornek3
çalıştırılabilir1// 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}