Ders İçeriği
Java Koleksiyonlar Çerçevesi (Java Collections Framework - JCF), Java programlama dilinde veri gruplarını depolamak ve işlemek için kullanılan bir dizi sınıf ve arayüzden oluşur. Bu çerçeve, veri yapılarını (listeler, kümeler, haritalar vb.) standartlaştırarak geliştiricilere güçlü ve esnek araçlar sunar. JCF, kodun yeniden kullanılabilirliğini artırır, geliştirme süresini kısaltır ve performans açısından optimize edilmiş algoritmalar sağlar.
Koleksiyonlar Çerçevesi'nin Temel Arayüzleri
JCF, hiyerarşik bir yapıya sahiptir ve temel olarak üç ana arayüz etrafında döner:
CollectionArayüzü: Bir grup nesneyi temsil eden en temel arayüzdür.List,SetveQueuearayüzleri bu arayüzden türemiştir.ListArayüzü: Elemanların sıralı bir şekilde depolandığı ve indeks numaralarıyla erişilebildiği koleksiyonları tanımlar. Tekrar eden elemanlara izin verir.- Uygulayan Sınıflar:
ArrayList,LinkedList,Vector.
- Uygulayan Sınıflar:
SetArayüzü: Tekrar eden elemanlara izin vermeyen koleksiyonları tanımlar. Elemanların belirli bir sırası garanti edilmez (bazı uygulamalar hariç).- Uygulayan Sınıflar:
HashSet,LinkedHashSet,TreeSet.
- Uygulayan Sınıflar:
QueueArayüzü: Elemanların belirli bir sıraya göre (genellikle FIFO - İlk Giren İlk Çıkar) işlendiği koleksiyonları tanımlar.- Uygulayan Sınıflar:
PriorityQueue,ArrayDeque.
- Uygulayan Sınıflar:
MapArayüzü: Anahtar-değer çiftlerini depolayan koleksiyonları tanımlar. Her anahtar benzersiz olmalıdır, ancak değerler tekrar edebilir.Maparayüzü,Collectionarayüzünden türememiştir, ancak JCF'nin önemli bir parçasıdır.- Uygulayan Sınıflar:
HashMap,LinkedHashMap,TreeMap,Hashtable.
- Uygulayan Sınıflar:
Yaygın Kullanılan Koleksiyon Sınıfları
List Uygulamaları
ArrayList: Dinamik boyutlu bir dizidir. Elemanlara indeks numarasıyla hızlı erişim sağlar. Eleman ekleme ve silme işlemleri, listenin sonuna doğru yapıldığında hızlıdır, ancak ortasına yapıldığında maliyetli olabilir.
import java.util.ArrayList;
import java.util.List;
public class ArrayListOrnek {
public static void main(String[] args) {
List<String> isimler = new ArrayList<>();
isimler.add("Ahmet");
isimler.add("Ayşe");
isimler.add("Mehmet");
isimler.add(1, "Zeynep"); // 1. indekse Zeynep ekle
System.out.println(isimler); // [Ahmet, Zeynep, Ayşe, Mehmet]
System.out.println(isimler.get(0)); // Ahmet
isimler.remove("Ayşe");
System.out.println(isimler); // [Ahmet, Zeynep, Mehmet]
}
}LinkedList: Çift yönlü bağlı liste yapısını kullanır. Eleman ekleme ve silme işlemleri hızlıdır, ancak indeks numarasıyla erişim (rastgele erişim) yavaştır.
import java.util.LinkedList;
import java.util.List;
public class LinkedListOrnek {
public static void main(String[] args) {
List<String> sehirler = new LinkedList<>();
sehirler.add("Ankara");
sehirler.add("İstanbul");
sehirler.addFirst("İzmir"); // Başa ekle
System.out.println(sehirler); // [İzmir, Ankara, İstanbul]
System.out.println(sehirler.getLast()); // İstanbul
}
}Set Uygulamaları
HashSet: Elemanları hash tablosu kullanarak depolar. Elemanların sırası garanti edilmez ve null eleman içerebilir. En hızlıSetuygulamasıdır.
import java.util.HashSet;
import java.util.Set;
public class HashSetOrnek {
public static void main(String[] args) {
Set<String> renkler = new HashSet<>();
renkler.add("Kırmızı");
renkler.add("Mavi");
renkler.add("Yeşil");
renkler.add("Kırmızı"); // Tekrar eden eleman eklenmez
System.out.println(renkler); // [Yeşil, Kırmızı, Mavi] (Sıra değişebilir)
System.out.println(renkler.contains("Mavi")); // true
}
}TreeSet: Elemanları doğal sıralamalarına göre veya bir Comparator kullanarak sıralı bir şekilde depolar. Performansı HashSet'ten daha düşüktür, ancak sıralı erişim sağlar.
import java.util.TreeSet;
import java.util.Set;
public class TreeSetOrnek {
public static void main(String[] args) {
Set<Integer> sayilar = new TreeSet<>();
sayilar.add(5);
sayilar.add(2);
sayilar.add(8);
sayilar.add(2); // Tekrar eden eleman eklenmez
System.out.println(sayilar); // [2, 5, 8] (Sıralı)
}
}Map Uygulamaları
HashMap: Anahtar-değer çiftlerini hash tablosu kullanarak depolar. Anahtarlar benzersiz olmalıdır. Elemanların sırası garanti edilmez. En hızlıMapuygulamasıdır.
import java.util.HashMap;
import java.util.Map;
public class HashMapOrnek {
public static void main(String[] args) {
Map<String, String> baskentler = new HashMap<>();
baskentler.put("Türkiye", "Ankara");
baskentler.put("Fransa", "Paris");
baskentler.put("Almanya", "Berlin");
baskentler.put("Türkiye", "İstanbul"); // Anahtar tekrar ettiği için değeri günceller
System.out.println(baskentler); // {Fransa=Paris, Türkiye=İstanbul, Almanya=Berlin}
System.out.println(baskentler.get("Fransa")); // Paris
System.out.println(baskentler.containsKey("İtalya")); // false
System.out.println(baskentler.keySet()); // [Fransa, Türkiye, Almanya]
System.out.println(baskentler.values()); // [Paris, İstanbul, Berlin]
}
}TreeMap: Anahtar-değer çiftlerini anahtarların doğal sıralamasına göre veya bir Comparator kullanarak sıralı bir şekilde depolar. Performansı HashMap'ten daha düşüktür, ancak sıralı erişim sağlar.
import java.util.TreeMap;
import java.util.Map;
public class TreeMapOrnek {
public static void main(String[] args) {
Map<String, Integer> ogrenciNotlari = new TreeMap<>();
ogrenciNotlari.put("Ayşe", 85);
ogrenciNotlari.put("Ahmet", 90);
ogrenciNotlari.put("Zeynep", 78);
System.out.println(ogrenciNotlari); // {Ahmet=90, Ayşe=85, Zeynep=78} (Anahtarlar sıralı)
}
}Koleksiyonlar Üzerinde Gezinme (Iterating)
Koleksiyonlardaki elemanlar üzerinde gezinmek için çeşitli yöntemler bulunur:
Geliştirilmiş For Döngüsü (Enhanced For Loop): En basit ve yaygın yöntemdir.
List<String> meyveler = new ArrayList<>();
meyveler.add("Elma");
meyveler.add("Armut");
for (String meyve : meyveler) {
System.out.println(meyve);
}Iterator Arayüzü: Koleksiyonlar üzerinde güvenli bir şekilde gezinmek ve elemanları silmek için kullanılır.
import java.util.Iterator;
List<String> sebzeler = new ArrayList<>();
sebzeler.add("Domates");
sebzeler.add("Salatalık");
Iterator<String> iterator = sebzeler.iterator();
while (iterator.hasNext()) {
String sebze = iterator.next();
System.out.println(sebze);
if (sebze.equals("Domates")) {
iterator.remove(); // Güvenli silme
}
}
System.out.println(sebzeler); // [Salatalık]Java Koleksiyonlar Çerçevesi, veri yönetimi ve manipülasyonu için güçlü ve esnek bir temel sağlar. Doğru koleksiyon sınıfını seçmek, uygulamanızın performansını ve verimliliğini önemli ölçüde etkileyebilir. Bir sonraki derste İstisna Yönetimi konusunu inceleyeceğiz.