### 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.