14- Java Collections Framework

### Java Koleksiyonları ve Generics Kullanımı


Java'nın koleksiyon sınıfları ve generics kullanımı, veri yapılarıyla çalışma ve tür güvenliğini sağlama konularında önemli bir rol oynar. Aşağıda listeler, setler, haritalar ve diğer koleksiyon sınıfları, generics kullanımı, ayrıca `Comparator` ve `Comparable` arayüzlerinin nasıl kullanıldığı ile ilgili ders notları bulunmaktadır.


---


### Koleksiyon Sınıfları


Java'da koleksiyonlar, `java.util` paketinde bulunur ve verilerin düzenlenmesi ve yönetilmesi için çeşitli veri yapıları sunar. Temel koleksiyonler listeler, setler ve haritalardır.


#### Listeler


Listeler, sıralı bir veri koleksiyonudur ve elemanları indeksler ile erişilebilir. `List` arayüzü, bu tür koleksiyonları temsil eder.


1. **`ArrayList`**: Dinamik boyutlu bir dizi olarak implement edilir ve elemanlara hızlı erişim sağlar.


```java

import java.util.ArrayList;

import java.util.List;


public class ListExample {

    public static void main(String[] args) {

        List<String> list = new ArrayList<>();

        list.add("Apple");

        list.add("Banana");

        list.add("Cherry");


        for (String fruit : list) {

            System.out.println(fruit);

        }


        System.out.println("İndeks 1'deki meyve: " + list.get(1));

    }

}

```


- **`add(E e)`**: Listeye eleman ekler.

- **`get(int index)`**: Belirli bir indeksteki elemanı alır.


2. **`LinkedList`**: Çift yönlü bağlı liste olarak implement edilir ve eleman ekleme/çıkarma işlemleri için hızlıdır.


```java

import java.util.LinkedList;


public class LinkedListExample {

    public static void main(String[] args) {

        LinkedList<String> list = new LinkedList<>();

        list.add("Apple");

        list.add("Banana");

        list.add("Cherry");


        list.forEach(System.out::println);

    }

}

```


#### Setler


Setler, benzersiz elemanları saklayan koleksiyonlardır. `Set` arayüzü bu tür koleksiyonları temsil eder.


1. **`HashSet`**: Elemanları hash tablosu ile saklar, sıralama garantisi vermez.


```java

import java.util.HashSet;

import java.util.Set;


public class HashSetExample {

    public static void main(String[] args) {

        Set<String> set = new HashSet<>();

        set.add("Apple");

        set.add("Banana");

        set.add("Cherry");


        set.forEach(System.out::println);

    }

}

```


2. **`TreeSet`**: Elemanları sıralı olarak saklar, sıralama yapar.


```java

import java.util.TreeSet;


public class TreeSetExample {

    public static void main(String[] args) {

        Set<String> set = new TreeSet<>();

        set.add("Apple");

        set.add("Banana");

        set.add("Cherry");


        set.forEach(System.out::println);

    }

}

```


#### Haritalar


Haritalar, anahtar-değer çiftleriyle veri saklar. `Map` arayüzü bu tür koleksiyonları temsil eder.


1. **`HashMap`**: Elemanları hash tablosu ile saklar, sıralama garantisi vermez.


```java

import java.util.HashMap;

import java.util.Map;


public class HashMapExample {

    public static void main(String[] args) {

        Map<String, Integer> map = new HashMap<>();

        map.put("Apple", 1);

        map.put("Banana", 2);

        map.put("Cherry", 3);


        map.forEach((key, value) -> System.out.println(key + ": " + value));

    }

}

```


2. **`TreeMap`**: Anahtarları sıralı olarak saklar, sıralama yapar.


```java

import java.util.TreeMap;


public class TreeMapExample {

    public static void main(String[] args) {

        Map<String, Integer> map = new TreeMap<>();

        map.put("Apple", 1);

        map.put("Banana", 2);

        map.put("Cherry", 3);


        map.forEach((key, value) -> System.out.println(key + ": " + value));

    }

}

```


---


### Generics Kullanımı


Generics, koleksiyonların tür güvenliğini sağlar ve tür hatalarını derleme zamanında yakalar. Koleksiyon sınıflarında kullanılan tür parametrelerini tanımlar.


#### Generics Örneği


```java

import java.util.ArrayList;

import java.util.List;


public class GenericsExample {

    public static void main(String[] args) {

        List<String> list = new ArrayList<>();

        list.add("Apple");

        list.add("Banana");

        // list.add(10); // Derleme hatası


        for (String fruit : list) {

            System.out.println(fruit);

        }

    }

}

```


- **`<T>`**: Tür parametresini temsil eder.

- **`List<String>`**: `String` türünde elemanları olan liste.


---


### Comparator ve Comparable Arayüzleri


Java'da sıralama işlemlerini özelleştirmek için `Comparator` ve `Comparable` arayüzleri kullanılır.


#### `Comparable` Arayüzü


`Comparable` arayüzü, bir sınıfın doğal sıralamasını belirler.


##### Örnek: `Person` Sınıfı


```java

import java.util.Arrays;


class Person implements Comparable<Person> {

    private String name;

    private int age;


    public Person(String name, int age) {

        this.name = name;

        this.age = age;

    }


    @Override

    public int compareTo(Person other) {

        return Integer.compare(this.age, other.age);

    }


    @Override

    public String toString() {

        return name + " (" + age + ")";

    }


    public static void main(String[] args) {

        Person[] people = { new Person("Alice", 30), new Person("Bob", 25), new Person("Charlie", 35) };

        Arrays.sort(people);

        System.out.println(Arrays.toString(people));

    }

}

```


- **`compareTo(T o)`**: İki nesneyi karşılaştırır ve sıralar.


#### `Comparator` Arayüzü


`Comparator` arayüzü, bir sınıfın sıralamasını dışarıdan tanımlar ve daha fazla esneklik sağlar.


##### Örnek: `Person` Sınıfı


```java

import java.util.Arrays;

import java.util.Comparator;


class Person {

    private String name;

    private int age;


    public Person(String name, int age) {

        this.name = name;

        this.age = age;

    }


    @Override

    public String toString() {

        return name + " (" + age + ")";

    }


    public static void main(String[] args) {

        Person[] people = { new Person("Alice", 30), new Person("Bob", 25), new Person("Charlie", 35) };


        // Yaşına göre sıralama

        Arrays.sort(people, Comparator.comparingInt(person -> person.age));

        System.out.println("Yaşına göre sıralama: " + Arrays.toString(people));


        // İsme göre sıralama

        Arrays.sort(people, Comparator.comparing(person -> person.name));

        System.out.println("İsme göre sıralama: " + Arrays.toString(people));

    }

}

```


- **`Comparator.comparing()`**: Karşılaştırma fonksiyonu oluşturur.

- **`compare(T o1, T o2)`**: İki nesneyi karşılaştırır.


---


### Özet


Bu ders notları, Java'daki temel koleksiyon sınıflarını (Listeler, Setler, Haritalar), generics kullanımını, ve `Comparator` ve `Comparable` arayüzlerini kapsamaktadır. Koleksiyonlar, veri yönetimini kolaylaştırır ve generics tür güvenliği sağlar. `Comparator` ve `Comparable` arayüzleri ise nesnelerin sıralama kriterlerini belirlemede kullanılır. Bu bilgiler, Java'da veri yapıları ve sıralama işlemleri ile çalışırken size yardımcı olacaktır.