Anasayfa / JAVA / Java’da ArrayList ve LinkedList Nedir? Aralarındaki Farklar Nelerdir?

Java’da ArrayList ve LinkedList Nedir? Aralarındaki Farklar Nelerdir?

Daha önceki derslerimizde Java’da birden çok veriyi aynı isim altında tutmak için dizileri (arrays) kullanmayı öğrenmiştik. Ancak standart dizilerin yazılım dünyasında büyük bir kısıtlaması vardır: Boyutları sabittir. Yani 100 elemanlı bir dizi oluşturduğunuzda, 101. elemanı eklemek isterseniz programınız hata verir. Gerçek dünya uygulamalarında (örneğin bir e-ticaret sitesindeki sepetiniz veya bir mesajlaşma uygulamasındaki mesajlarınız) veri sayısı sürekli olarak değişir.

İşte tam bu noktada, Java’nın Collections Framework (Koleksiyonlar Çatısı) adı verilen muazzam sistemi devreye girer. Koleksiyonlar, boyutları dinamik olarak değişebilen ve verileri depolamak için gelişmiş algoritmalar sunan hazır yapılardır. Bu yazımızda, Java’nın en çok kullanılan iki dinamik liste yapısını; ArrayList ve LinkedList kavramlarını inceleyecek, hangisini ne zaman kullanmanız gerektiğini örneklerle öğreneceğiz.


1. Java’da ArrayList Nedir? (Dinamik Diziler)

ArrayList, temelinde standart bir diziyi barındıran ancak kapasitesi dolduğunda boyutunu otomatik olarak artırabilen bir “dinamik dizi” sınıfıdır. Siz bir ArrayList içine eleman ekledikçe, eğer arka plandaki standart dizi dolarsa, Java otomatik olarak daha büyük yeni bir dizi yaratır ve eski verileri bu yeni diziye gizlice kopyalar.

ArrayList Kullanımı İçin Önemli Kurallar:

  1. Sadece Nesneleri (Objects) Tutar: ArrayList’in içine int, double, boolean gibi ilkel (primitive) veri tiplerini doğrudan koyamazsınız. Bunun yerine, Java’nın “Sarmalayıcı” (Wrapper) sınıfları olan Integer, Double, Boolean gibi nesne tiplerini kullanmalısınız. Java’nın “autoboxing” özelliği sayesinde siz sadece sayı yazsanız bile o arka planda otomatik olarak nesneye çevrilir.
  2. Generics Kullanımı: Listenizin içine yanlış türde veri girilmesini önlemek (Tip Güvenliği – Type Safety) için Java 5.0 ile gelen “Generics” (Parametreli Türler) yapısı kullanılır. Yani listenizi <String> veya <Integer> gibi işaretlerle tanımlayarak sadece o tipte veri almasını sağlarsınız.

Basit Bir ArrayList Örneği:

import java.util.ArrayList; // ArrayList kullanmak için kütüphaneyi dahil ediyoruz.

public class ArrayListOrnegi {
    public static void main(String[] args) {

        // Sadece String (Metin) nesneleri tutabilen bir ArrayList oluşturuyoruz.
        ArrayList<String> sepet = new ArrayList<String>();

        // add() metodu ile listeye eleman ekleme
        sepet.add("Telefon");
        sepet.add("Bilgisayar");
        sepet.add("Kulaklık");

        // Araya eleman ekleme (1. indekse Tablet ekler, diğerlerini sağa kaydırır)
        sepet.add(1, "Tablet");

        // size() metodu ile listenin boyutunu öğrenme
        System.out.println("Sepette " + sepet.size() + " ürün var.");

        // get() metodu ile rastgele bir elemana (indekse) ulaşma
        System.out.println("2. İndeksteki ürün: " + sepet.get(2)); // Çıktı: Bilgisayar

        // remove() metodu ile listeden eleman silme
        sepet.remove("Kulaklık"); // İsimle silme
        sepet.remove(0);          // İndeks ile silme (Telefon silinir)

        // Listeyi ekrana yazdırma
        System.out.println("Sepetin son hali: " + sepet);
    }
}

Yukarıdaki örnekte görebileceğiniz üzere, eleman eklemek, aradan çıkarmak ve listeyi boyutlandırmak ArrayList ile son derece esnek ve basittir.


2. Java’da LinkedList Nedir? (Bağlı Listeler)

LinkedList, elemanlarını bellekte ardışık (yan yana) bloklar halinde tutmak yerine, her bir elemanın bellekte rastgele bir yerde durduğu ve birbirlerine işaretçiler (pointers/links) ile bağlandığı bir veri yapısıdır.

Bunu bir hazine avı oyununa benzetebilirsiniz. İlk ipucunu (ilk düğüm – node) bulduğunuzda, o ipucunun üzerinde sadece kendi değeri değil, “bir sonraki ipucunun nerede olduğu” bilgisi de yazılıdır. Java’daki LinkedList yapısı çift yönlü bağlı liste (doubly linked list) olarak tasarlanmıştır. Yani her kutu (düğüm), hem bir sonraki elemanın hem de bir önceki elemanın adresini bilir.

LinkedList, Java’nın hem List arayüzünü hem de Deque ve Queue (Kuyruk) arayüzlerini uygular (implement eder). Bu sayede, listenin doğrudan en başına veya en sonuna veri eklemek/çıkarmak için harika ve özel metotlara sahiptir.

Basit Bir LinkedList Örneği:

import java.util.LinkedList;

public class LinkedListOrnegi {
    public static void main(String[] args) {

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

        istasyonlar.add("Ankara");
        istasyonlar.add("Eskişehir");

        // Listenin en başına eleman ekleme (addFirst)
        istasyonlar.addFirst("Sivas");

        // Listenin en sonuna eleman ekleme (addLast)
        istasyonlar.addLast("İstanbul");

        System.out.println("Güzergah: " + istasyonlar);
        // Çıktı: [Sivas, Ankara, Eskişehir, İstanbul]

        // Listenin başındaki ve sonundaki elemanı okuma (get)
        System.out.println("İlk Durak: " + istasyonlar.getFirst()); // Sivas
        System.out.println("Son Durak: " + istasyonlar.getLast());  // İstanbul

        // Listenin başından ve sonundan eleman silme
        istasyonlar.removeFirst();
        istasyonlar.removeLast();

        System.out.println("Kalan Güzergah: " + istasyonlar);
        // Çıktı: [Ankara, Eskişehir]
    }
}


3. ArrayList ve LinkedList Arasındaki Temel Farklar

Yeni başlayan programcıların aklına her zaman şu soru gelir: “İkisi de aynı işi yapıyor ve List arayüzünü kullanıyor, o zaman neden iki farklı liste sınıfımız var?”.

Yanıt: Performans ve Algoritma Verimliliği. Her ikisinin de güçlü ve zayıf olduğu yönler birbirinden farklıdır.

  1. Rastgele Erişim (Random Access – Veri Okuma):
    • ArrayList: Arka planda standart dizi kullandığı için 500. sıradaki elemana ulaşmak istediğinizde doğrudan o adrese atlayabilir (list.get(500)). Bu işlem inanılmaz derecede hızlıdır ($O(1)$ sabit zaman).
    • LinkedList: Düğümler dağınık tutulduğu için 500. elemanı bulmak istediğinde 1. elemandan başlar ve teker teker adresleri takip ederek (1’den 2’ye, 2’den 3’e…) 500’e kadar saymak zorundadır. Bu işlem listede çok fazla eleman varsa oldukça yavaştır ($O(n)$ doğrusal zaman).
  2. Araya Eleman Ekleme ve Silme (Insertion & Deletion):
    • ArrayList: Eğer 10.000 elemanlı bir listenin en başına veya ortasına bir eleman eklerseniz (veya oradan bir eleman silerseniz), ArrayList’in geri kalan binlerce elemanı fiziki olarak birer sıra kaydırması gerekir. Bu çok büyük bir zaman kaybı ve yavaşlık yaratır.
    • LinkedList: Araya bir eleman eklemek veya silmek, bağlı listede mükemmel çalışır. Çünkü diğer elemanları kaydırmaya gerek yoktur; sadece araya eklenecek yeni kutunun adres işaretçilerini (okları) bağlamak yeterlidir. İşlem süresi sabit zamanlıdır ($O(1)$).

4. Hangisini Ne Zaman Seçmelisiniz?

Kodlarınızı yazarken doğru veri yapısını (Data Structure) seçmek, uygulamanızın hızı ve kalitesi için belirleyici bir faktördür.

  • Şu Senaryolarda ArrayList Kullanın: Eğer uygulamanızda listeye verileri genelde en sondan ekliyorsanız ve listenin içindeki verileri indeks numaralarıyla sık sık okumanız (arama veya sorgulama yapmanız) gerekiyorsa kesinlikle ArrayList seçmelisiniz. Çoğu genel amaçlı programlamada %90 oranında ArrayList tercih edilir.
  • Şu Senaryolarda LinkedList Kullanın: Eğer uygulamanız çok fazla “okuma” işlemi yapmıyorsa, ancak listenin en başına, ortasına veya en sonuna sürekli yeni veri eklenip çıkarılıyorsa (örneğin bir müzik çaların sıradaki şarkılar listesi, geri-al (undo) işlemleri, veya işlem kuyrukları mantığı) LinkedList tartışılmaz derecede yüksek bir performans gösterecektir.

Özetle; Java Koleksiyonlar dünyasında tek bir “en iyi” yoktur, “ihtiyacınıza en uygun” olan vardır. Hem ArrayList hem de LinkedList dinamik listeler yaratmanızı sağlar, ancak verilerle arka planda nasıl oynadıkları büyük farklılıklar gösterir. Kendi uygulamalarınızda bu iki sınıfı da kodlayarak hız farklarını ve sundukları farklı metotları bizzat test edebilirsiniz!

Etiketlendi:

Cevap bırakın

E-posta adresiniz yayınlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir

DERSLER