Yazılım geliştirme süreçlerinde verileri mantıksal bir sıra halinde tutmak ve bu verilere dinamik olarak müdahale etmek en temel ihtiyaçlardan biridir. Java programlama dilinde standart diziler (arrays) belirli bir boyuta sahip olacak şekilde tanımlanır ve programın çalışma anında bu boyut değiştirilemez. Veri kümesinin büyüklüğünün önceden kestirilemediği senaryolarda bu sabit yapı ciddi bir kısıtlama yaratır. İşte bu noktada Java Collections Framework içinde yer alan ArrayList sınıfı devreye girer.
ArrayList Nedir ve Neden Kullanılır?
ArrayList, java.util paketinde bulunan ve List arayüzünü (interface) uygulayan dinamik bir dizi sınıfıdır. Geleneksel diziler gibi elemanları indeks mantığıyla (0’dan başlayarak) sıralı olarak tutar; ancak en önemli farkı, eleman eklendikçe veya silindikçe boyutunun arka planda otomatik olarak genişleyip daralabilmesidir.
Standart diziler ile ArrayList arasındaki temel farklar şu şekildedir:
- Standart diziler sabit boyutludur,
ArrayListise dinamik olarak büyür ve küçülür. - Standart diziler hem ilkel veri tiplerini (int, char vb.) hem de nesneleri tutabilir;
ArrayListise yalnızca nesne referanslarını tutabilir. ArrayList, eleman arama, sıralama, ekleme ve silme işlemlerini kolaylaştıran yerleşik metotlara sahiptir.- Standart diziler daha az bellek tüketir ve hafif hız avantajı sunarken,
ArrayListsunduğu esneklik ile geliştirme sürecini kolaylaştırır.
ArrayList Tanımlama ve Başlatma
Bir ArrayList tanımlarken Generic (Jenerik) yapısı kullanılır. Bu yapı, listenin hangi veri türünde nesneler saklayacağını belirlemenizi sağlar. İlkel veri tipleri doğrudan kullanılamadığı için onların sarmalayıcı sınıfları (Wrapper Classes) olan Integer, Double, Boolean gibi tipler tercih edilmelidir.
import java.util.ArrayList;
public class Main {
public static void main(String[] args) {
// String türünde eleman tutan bir ArrayList tanımı
ArrayList<String> sehirler = new ArrayList<>();
// Integer (sayısal) türde eleman tutan bir ArrayList tanımı
ArrayList<Integer> sayilar = new ArrayList<>();
}
}
Yukarıdaki kod bloğunda import java.util.ArrayList; ifadesi ile ilgili sınıf projeye dahil edilmiştir. Tanımlama satırında sağ taraftaki elmas operatörünün <> içerisi boş bırakılabilir; derleyici sol taraftaki tür bilgisinden bunu otomatik olarak çıkarır.
Temel ArrayList Metotları
ArrayList sınıfı, veri manipülasyonu için zengin bir metot kümesi sunar. En sık başvurulan metotlar ve işlevleri aşağıda yer almaktadır.
Eleman Ekleme: add()
Listeye yeni bir veri eklemek için add() metodu kullanılır. Bu metot çağrıldığında yeni eleman listenin sonuna eklenir. Eğer istenen belirli bir indekse ekleme yapılmak istenirse, metot aşırı yüklenmiş haliyle add(indeks, eleman) şeklinde çağrılır.
Elemana Erişme: get()
Belirli bir indisteki veriyi okumak için get() metodu kullanılır. İndeks değerinin liste sınırları içinde olması zorunludur; aksi halde IndexOutOfBoundsException hatası alınır.
Elemanı Güncelleme: set()
Mevcut bir indisteki değeri yenisiyle değiştirmek için set(indeks, yeniEleman) metodu kullanılır. Bu işlem dizinin boyutunu değiştirmez.
Eleman Silme: remove()
Bir elemanı silmek için iki alternatif bulunur. remove(int indeks) belirtilen indisteki veriyi kaldırır ve ardındaki elemanları sola kaydırır. remove(Object o) ise parametre olarak verilen nesnenin listedeki ilk eşleşmesini siler.
Boyut ve Durum Kontrolleri: size(), contains(), isEmpty(), clear()
size(): Listenin anlık eleman sayısını döndürür.contains(Object o): Belirtilen elemanın listede var olup olmadığını boolean olarak döner.isEmpty(): Listenin boş olup olmadığını kontrol eder.clear(): Listedeki tüm elemanları temizleyerek listeyi boş hale getirir.
Uygulamalı örnek:
import java.util.ArrayList;
public class MetotOrnekleri {
public static void main(String[] args) {
ArrayList<String> diller = new ArrayList<>();
// Eleman ekleme
diller.add("Java");
diller.add("Python");
diller.add("C++");
diller.add(1, "Go"); // 1. indekse Go eklenir, diğerleri kaydırılır
// Elemana erişme
System.out.println("0. indisteki dil: " + diller.get(0));
// Eleman güncelleme
diller.set(2, "Rust"); // Python yerine Rust yazıldı
// Eleman silme
diller.remove("C++"); // Değere göre silme
diller.remove(0); // İndekse göre silme (Java silindi)
// Boyut ve kontrol
System.out.println("Liste boyutu: " + diller.size());
System.out.println("Go var mı: " + diller.contains("Go"));
// Listeyi yazdırma
System.out.println("Kalan diller: " + diller);
}
}
Bu kod çalıştırıldığında çıktıda sırasıyla güncellenmiş değerler ve kalan liste elemanları yazdırılır. System.out.println doğrudan liste nesnesine verildiğinde ArrayList‘in yerleşik toString() metodu devreye girerek elemanları köşeli parantez içinde listeler.
ArrayList Üzerinde Gezinme Yöntemleri
Listeler üzerindeki verileri tek tek işlemek için çeşitli döngü mekanizmaları kullanılır. İhtiyaca göre standart for döngüsü, gelişmiş for (for-each) döngüsü veya Iterator tercih edilebilir.
import java.util.ArrayList;
import java.util.Iterator;
public class DonguOrnekleri {
public static void main(String[] args) {
ArrayList<String> portlar = new ArrayList<>();
portlar.add("80 - HTTP");
portlar.add("443 - HTTPS");
portlar.add("22 - SSH");
// 1. Gelişmiş For-Each Döngüsü (En yaygın ve okunaklı yol)
for (String port : portlar) {
System.out.println("Port: " + port);
}
// 2. Standart For Döngüsü (İndeks bilgisi gerektiğinde)
for (int i = 0; i < portlar.size(); i++) {
System.out.println(i + ". port: " + portlar.get(i));
}
// 3. Iterator ile Gezinme (Döngü anında güvenli silme işlemi için)
Iterator<String> iterator = portlar.iterator();
while (iterator.hasNext()) {
String p = iterator.next();
if (p.contains("22")) {
iterator.remove(); // ConcurrentModificationException almadan silme yapar
}
}
}
}
Döngü esnasında liste üzerinden eleman silmek isteniyorsa, doğrudan portlar.remove() çağırmak ConcurrentModificationException hatasına yol açar. Bu gibi durumlarda Iterator nesnesinin remove() metodunu kullanmak güvenli yöntemdir.
Performans ve Bellek Yönetimi
ArrayList, dahili olarak standart bir dizi (Object[] elementData) barındırır. Varsayılan başlangıç kapasitesi genellikle 10’dur. Bu kapasite dolduğunda, Java arka planda mevcut dizinin yaklaşık yüzde 50 daha büyük bir kopyasını oluşturur ve tüm elemanları yeni diziye aktarır.
- İndeks ile okuma (
get) ve son indekse yazma (add) işlemleri doğrudan bellek adreslemesi sayesinde O(1) zaman karmaşıklığına sahiptir. - Araya eleman ekleme veya aradan eleman silme durumunda sağdaki tüm elemanların kaydırılması gerektiğinden bu işlemler O(n) zaman alır.
- Büyük hacimli veri eklemeleri yapılacağı biliniyorsa, dizinin sürekli yeniden boyutlandırılmasının getireceği bellek kopyalama maliyetini önlemek için başlangıç kapasitesi belirtilmelidir:
new ArrayList<>(100000). ArrayListiş parçacığı (thread) güvenli değildir. Çok iş parçacıklı (multithreaded) ortamlarda eşzamanlı değişiklik gerekiyorsaCopyOnWriteArrayListveyaCollections.synchronizedList()alternatifleri değerlendirilmelidir.
Özet ve Sonraki Adımlar
java.util.ArrayList, esnek yapısı ve zengin metot desteği ile Java’da en çok başvurulan koleksiyon türlerinden biridir. İndeks bazlı erişimlerin yoğun olduğu ve veri boyutunun değişkenlik gösterdiği projelerde ideal bir çözümdür.
Bir sonraki adımda, elemanların arasına sıkça ekleme/çıkarma yapılan durumlar için daha optimize olan LinkedList yapısını ve koleksiyonlar arasındaki temel performans farklarını inceleyebilirsiniz.


Kommentare
Noch keine Kommentare. Schreiben Sie den ersten.