ArrayList Kullanımı
Giriş
Diziler güzeldir, hızlıdır, bellekte verimlidir. Ama bir sorunları var: boyutları sabit. Bir kere new int[5] dedin mi, o dizi ömrü boyunca 5 elemanlıktır. 6. eleman eklemek istersen? Yeni dizi oluştur, eskileri kopyala, yenisini ekle... Çok zahmetli.
İşte ArrayList tam bu sorunu çözer. ArrayList dinamik boyutlu bir listedir. Eleman eklediğinde büyür, çıkardığında küçülür. Sen boyutuyla uğraşmazsın, Java halleder.
ArrayList Nedir?
ArrayList'i bir akordeon dosya gibi düşün. Normal dizi sabit boyutlu bir kutu — 5 gözlüyse 5 gözlü. Ama akordeon dosya esner: yeni dosya geldiğinde büyür, dosya çıkardığında küçülür.
Teknik olarak ArrayList, arka planda bir dizi kullanır. Dizi dolduğunda, daha büyük bir dizi oluşturup elemanları kopyalar. Ama bunu otomatik yapar, senin haberin bile olmaz.
ArrayList Oluşturma
import java.util.ArrayList;
ArrayList<String> isimler = new ArrayList<String>();
// veya kısaca (Java 7+):
ArrayList<String> isimler2 = new ArrayList<>();<String> kısmı bu listenin String tutacağını belirtir. Buna generic tip denir. Yanlış tip eklemeye çalışırsan derleme hatası alırsın.
ArrayList<Integer> sayilar = new ArrayList<>();
ArrayList<Double> fiyatlar = new ArrayList<>();
ArrayList<Boolean> bayraklar = new ArrayList<>();⚠️ Dikkat: ArrayList'te primitive tipler (int, double, boolean) direkt kullanılamaz. Sarmalayıcı (wrapper) sınıflarını kullanmalısın: Integer, Double, Boolean. Java auto-boxing ile dönüşümü otomatik yapar, ama farkında olman lazım.
ArrayList<int> yanlis = new ArrayList<>(); // DERLEME HATASI!
ArrayList<Integer> dogru = new ArrayList<>(); // doğruTemel Metotlar
add() — Eleman Ekleme
ArrayList<String> meyveler = new ArrayList<>();
meyveler.add("Elma"); // sona ekler
meyveler.add("Armut");
meyveler.add("Portakal");
System.out.println(meyveler); // [Elma, Armut, Portakal]
// Belirli indekse ekleme
meyveler.add(1, "Muz"); // 1. indekse Muz'u ekle, diğerleri kayar
System.out.println(meyveler); // [Elma, Muz, Armut, Portakal]add(eleman) sona ekler. add(indeks, eleman) belirtilen indekse ekler ve sonraki elemanları bir kaydırır.
get() — Eleman Okuma
ArrayList<String> meyveler = new ArrayList<>();
meyveler.add("Elma");
meyveler.add("Armut");
meyveler.add("Portakal");
String ilk = meyveler.get(0); // "Elma"
String son = meyveler.get(2); // "Portakal"
System.out.println(ilk); // ElmaTıpkı dizi[0] gibi, ama köşeli parantez yerine get(0) kullanıyorsun.
set() — Eleman Güncelleme
meyveler.set(1, "Kiraz"); // 1. indeksteki "Armut"u "Kiraz" yap
System.out.println(meyveler); // [Elma, Kiraz, Portakal]set() mevcut bir elemanı değiştirir. Yeni eleman eklemez.
remove() — Eleman Silme
ArrayList<String> meyveler = new ArrayList<>();
meyveler.add("Elma");
meyveler.add("Armut");
meyveler.add("Portakal");
// İndeksle silme
meyveler.remove(1); // 1. indeksteki "Armut" silindi
System.out.println(meyveler); // [Elma, Portakal]
// Değerle silme
meyveler.remove("Elma"); // "Elma" bulunup silindi
System.out.println(meyveler); // [Portakal]Integer listesinde dikkat:
ArrayList<Integer> sayilar = new ArrayList<>();
sayilar.add(10);
sayilar.add(20);
sayilar.add(30);
sayilar.remove(1); // İNDEKSLE siler → 20 gider
sayilar.remove(Integer.valueOf(10)); // DEĞERLE siler → 10 giderremove(1) yazınca Java bunu "1. indeksteki elemanı sil" diye anlar, "1 değerini sil" diye değil. Değerle silmek istersen Integer.valueOf() kullan.
size() — Eleman Sayısı
ArrayList<String> meyveler = new ArrayList<>();
meyveler.add("Elma");
meyveler.add("Armut");
System.out.println(meyveler.size()); // 2Dizilerde length, ArrayList'te size(). Dikkat: size() bir metot (parantezli), length bir field (parantezsiz).
contains() — Eleman Var mı?
ArrayList<String> meyveler = new ArrayList<>();
meyveler.add("Elma");
meyveler.add("Armut");
System.out.println(meyveler.contains("Elma")); // true
System.out.println(meyveler.contains("Portakal")); // falseindexOf() — Elemanın İndeksi
int indeks = meyveler.indexOf("Armut"); // 1
int yok = meyveler.indexOf("Portakal"); // -1 (bulunamadı)isEmpty() ve clear()
ArrayList<String> liste = new ArrayList<>();
System.out.println(liste.isEmpty()); // true
liste.add("test");
System.out.println(liste.isEmpty()); // false
liste.clear(); // tüm elemanları sil
System.out.println(liste.isEmpty()); // true
System.out.println(liste.size()); // 0ArrayList Üzerinde Gezinme
for Döngüsü
ArrayList<String> isimler = new ArrayList<>();
isimler.add("Ali");
isimler.add("Ayse");
isimler.add("Mehmet");
for (int i = 0; i < isimler.size(); i++) {
System.out.println(i + ": " + isimler.get(i));
}for-each Döngüsü
for (String isim : isimler) {
System.out.println(isim);
}for-each daha temiz ve okunabilir. Ama döngü içinde eleman silmeye çalışırsan ConcurrentModificationException alırsın!
// YANLIŞ — ConcurrentModificationException fırlatır!
for (String isim : isimler) {
if (isim.equals("Ali")) {
isimler.remove(isim); // döngü sırasında silme YASAK
}
}⚠️ Dikkat: for-each döngüsü içinde add() veya remove() çağırma. Eleman silmek istiyorsan Iterator veya geriye doğru döngü kullan:
// Güvenli silme — geriye doğru döngü
for (int i = isimler.size() - 1; i >= 0; i--) {
if (isimler.get(i).equals("Ali")) {
isimler.remove(i);
}
}Generic Tipler
ArrayList'in en güçlü özelliklerinden biri generic tip desteği. <> içinde hangi tür elemanlar tutacağını belirtiyorsun.
ArrayList<String> stringler = new ArrayList<>(); // sadece String
ArrayList<Integer> intler = new ArrayList<>(); // sadece Integer
ArrayList<Double> doubler = new ArrayList<>(); // sadece DoubleGeneric sayesinde yanlış tip eklersen derleme zamanında hata alırsın:
ArrayList<String> isimler = new ArrayList<>();
isimler.add("Ali");
isimler.add(42); // DERLEME HATASI! String listesine int eklenemezWrapper Tipleri
Primitive → Wrapper dönüşüm tablosu:
| Primitive | Wrapper |
|---|---|
int | Integer |
double | Double |
boolean | Boolean |
char | Character |
long | Long |
float | Float |
Auto-boxing ve Unboxing
Java, primitive ve wrapper arasında otomatik dönüşüm yapar:
ArrayList<Integer> sayilar = new ArrayList<>();
sayilar.add(42); // auto-boxing: int → Integer
int deger = sayilar.get(0); // auto-unboxing: Integer → intArka planda 42 otomatik olarak Integer.valueOf(42)'ye dönüşüyor. Ve get() ile aldığında Integer otomatik olarak int'e dönüşüyor. Pratik!
ArrayList'i Başlangıç Değerleriyle Oluşturma
// Yol 1: Arrays.asList ile
ArrayList<String> meyveler = new ArrayList<>(Arrays.asList("Elma", "Armut", "Portakal"));
// Yol 2: List.of ile (Java 9+) — List.of immutable döner, ArrayList'e sarmalıyoruz
ArrayList<String> meyveler2 = new ArrayList<>(List.of("Elma", "Armut", "Portakal"));
// Yol 3: Tek tek add
ArrayList<String> meyveler3 = new ArrayList<>();
meyveler3.add("Elma");
meyveler3.add("Armut");
meyveler3.add("Portakal");Pratik Örnekler
Örnek 1: Öğrenci Listesi
import java.util.ArrayList;
public class OgrenciListesi {
public static void main(String[] args) {
ArrayList<String> ogrenciler = new ArrayList<>();
// Öğrenci ekleme
ogrenciler.add("Ali");
ogrenciler.add("Ayse");
ogrenciler.add("Mehmet");
ogrenciler.add("Zeynep");
// Listeyi yazdır
System.out.println("Tüm öğrenciler: " + ogrenciler);
// Öğrenci ara
String aranan = "Mehmet";
if (ogrenciler.contains(aranan)) {
System.out.println(aranan + " listede, indeks: " + ogrenciler.indexOf(aranan));
}
// Öğrenci çıkar
ogrenciler.remove("Ayse");
System.out.println("Ayse çıktıktan sonra: " + ogrenciler);
// Toplam öğrenci
System.out.println("Toplam: " + ogrenciler.size() + " öğrenci");
}
}Örnek 2: Sayı Filtreleme
ArrayList<Integer> sayilar = new ArrayList<>(Arrays.asList(15, 8, 23, 4, 42, 16, 7, 30));
ArrayList<Integer> ciftler = new ArrayList<>();
ArrayList<Integer> tekler = new ArrayList<>();
for (int sayi : sayilar) {
if (sayi % 2 == 0) {
ciftler.add(sayi);
} else {
tekler.add(sayi);
}
}
System.out.println("Çiftler: " + ciftler); // [8, 4, 42, 16, 30]
System.out.println("Tekler: " + tekler); // [15, 23, 7]Örnek 3: Tekrar Edenleri Bulma
ArrayList<String> kelimeler = new ArrayList<>(
Arrays.asList("elma", "armut", "elma", "portakal", "armut", "elma")
);
ArrayList<String> tekrarlar = new ArrayList<>();
for (String kelime : kelimeler) {
if (!tekrarlar.contains(kelime)) {
int sayac = 0;
for (String k : kelimeler) {
if (k.equals(kelime)) sayac++;
}
if (sayac > 1) {
tekrarlar.add(kelime);
}
}
}
System.out.println("Tekrar edenler: " + tekrarlar); // [elma, armut]ArrayList Sıralama
import java.util.Collections;
ArrayList<Integer> sayilar = new ArrayList<>(Arrays.asList(64, 25, 12, 22, 11));
// Küçükten büyüğe
Collections.sort(sayilar);
System.out.println(sayilar); // [11, 12, 22, 25, 64]
// Büyükten küçüğe
Collections.sort(sayilar, Collections.reverseOrder());
System.out.println(sayilar); // [64, 25, 22, 12, 11]Dizilerde Arrays.sort() kullandık, ArrayList'te Collections.sort() kullanıyoruz.
💡 İpucu: Java 8+ ile doğrudan sayilar.sort(null) veya sayilar.sort(Collections.reverseOrder()) da yazabilirsin. Daha kısa.
ArrayList vs Array — Hızlı Karşılaştırma
| Özellik | Array | ArrayList |
|---|---|---|
| Boyut | Sabit | Dinamik |
| Sözdizimi | dizi[i] | liste.get(i) |
| Tip | Primitive + Referans | Sadece Referans (Wrapper) |
| Boyut bilgisi | dizi.length | liste.size() |
| Eleman ekleme | Manuel (yeni dizi gerekir) | add() |
| Eleman silme | Manuel (kaydırma gerekir) | remove() |
| Performans | Daha hızlı | Biraz daha yavaş |
Bu konuyu bir sonraki derste çok daha detaylı işleyeceğiz.
Yaygın Hatalar
Hata 1: Primitive tip kullanmak
ArrayList<int> liste = new ArrayList<>(); // HATA!
ArrayList<Integer> liste = new ArrayList<>(); // doğruHata 2: for-each içinde silmek
for (String s : liste) {
liste.remove(s); // ConcurrentModificationException!
}Hata 3: Var olmayan indekse erişmek
ArrayList<String> liste = new ArrayList<>();
liste.add("tek eleman");
liste.get(5); // IndexOutOfBoundsException!Hata 4: Integer listede remove karışıklığı
ArrayList<Integer> nums = new ArrayList<>(Arrays.asList(10, 20, 30));
nums.remove(1); // indeks 1'deki elemanı siler (20)
nums.remove(Integer.valueOf(10)); // değer 10'u silerÖzet
ArrayList dinamik boyutlu listedir — eleman ekledikçe büyür, sildikçe küçülür
Generic tip (
<String>,<Integer>) ile tür güvenliği sağlarTemel metotlar:
add(),get(),set(),remove(),contains(),size(),isEmpty(),clear()Primitive tipler direkt kullanılamaz, wrapper sınıflar gerekir (
int→Integer)for-each döngüsü içinde eleman ekleme/silme yapma →
ConcurrentModificationExceptionSıralama için
Collections.sort()kullanılır
AI Asistan
Sorularını yanıtlamaya hazır