Skip to main content

🧩 Java List remove() Metodu Nasıl Kullanılır? (ArrayList, LinkedList ve Alternatifler)

Bu Rehberde Ne Öğreneceksiniz?
Bu rehber, Java List remove() metodunun farklı kullanımlarını (indeks, değer ve koşullu silme) detaylıca açıklar.
ArrayList, LinkedList ve CopyOnWriteArrayList arasındaki performans farklarını; ayrıca IndexOutOfBoundsException, UnsupportedOperationException ve ConcurrentModificationException gibi sık karşılaşılan hataları nasıl önleyeceğinizi öğreneceksiniz.
Ayrıca removeIf() ile koşullu silme ve JMH ile performans ölçüm örnekleri de yer alır.


🔍 Giriş

Java’da remove() metodu, List yapısından bir veya daha fazla elemanı silmek için kullanılır.
Ancak bu metot iki şekilde aşırı yüklenmiştir (overloaded):

MetotParametreAçıklamaDönen Değer
remove(int index)İndeksBelirtilen indeksteki elemanı siler.Silinen eleman
remove(Object o)NesneBelirtilen nesnenin ilk eşleşmesini siler.true veya false

ArrayList hızlı erişim sunarken, LinkedList sık ekleme-silme işlemlerinde daha verimlidir.


1️⃣ remove(int index) — İndeksle Eleman Silme

import java.util.*;

public class RemoveByIndexExample {
public static void main(String[] args) {
List<String> list = new ArrayList<>(List.of("A", "B", "C", "D"));
String removed = list.remove(1);
System.out.println(list);
System.out.println("Silinen eleman: " + removed);
}
}

🧠 Bu örnekte index 1 (yani "B") silinir ve liste [A, C, D] olarak güncellenir.

⚠️ IndexOutOfBoundsException

Geçersiz indeks (örneğin 10) verilirse hata oluşur:


List<String> list = new ArrayList<>(List.of("A"));
list.remove(10); // Hata!

✅ Çözüm:


if (i >= 0 && i < list.size()) list.remove(i);

2️⃣ remove(Object o) — Değerle Eleman Silme


import java.util.*;

public class RemoveByValueExample {
public static void main(String[] args) {
List<String> list = new ArrayList<>(List.of("A", "B", "C", "B"));
list.remove("B");
System.out.println(list);
}
}

🧠 Bu metot, yalnızca ilk eşleşen değeri siler. Eğer eleman yoksa liste değişmez ve false döner.


3️⃣ removeIf() — Koşullu Silme (Java 8+)


list.removeIf(e -> e.startsWith("temp_"));

🧩 Bu yöntem, bir koşula göre elemanları toplu olarak siler. removeIf() genellikle manuel döngülerden daha hızlıdır, çünkü JVM tarafından optimize edilir.


4️⃣ Değişmez (Immutable) Listelerde Silme Hatası

Bazı listeler (List.of(), Arrays.asList()) değiştirilemezdir ve remove() çağırıldığında UnsupportedOperationException fırlatır.


List<String> immutableList = List.of("A", "B");
immutableList.remove("A"); // ❌ Hata

✅ Çözüm:


List<String> mutable = new ArrayList<>(immutableList);
mutable.remove("A"); // ✔️ Çalışır

🧩 Özet Tablo

DurumHatalı KodÇözüm
Arrays.asList()Arrays.asList("A", "B").add("C");new ArrayList<>(Arrays.asList("A", "B"))
List.of() (Java 9+)List.of("X", "Y").add("Z");new ArrayList<>(List.of("X", "Y"))

5️⃣ remove() Kullanırken Sık Yapılan Hatalar

🚫 ConcurrentModificationException For-each içinde silme yapmak hataya yol açar:


for (String item : list) {
list.remove(item); // ❌
}

✅ Çözüm: Iterator kullanın:


Iterator<String> it = list.iterator();
while (it.hasNext()) {
if (it.next().equals("B")) it.remove();
}

⚙️ remove() Performansı List Türlerine Göre

Liste Türüremove(int)remove(Object)Açıklama
ArrayListO(n)O(n)Eleman kaydırma maliyeti yüksek
LinkedListO(n) (bulma) + O(1) (silme)O(n)Orta-büyük veri setlerinde avantajlı
CopyOnWriteArrayListO(n)O(n)Thread-safe ama her silmede kopyalama yapar

💡 Kural:

Hızlı erişim istiyorsan → ArrayList

Sık silme/ekleme varsa → LinkedList

Thread-safe, az değişken ortamlar → CopyOnWriteArrayList


🧮 remove() vs removeIf() Karşılaştırması

MetotAçıklamaDönerAtabileceği Hata
remove(int)Belirtilen indeksteki elemanı siler.Silinen elemanIndexOutOfBoundsException
remove(Object)İlk eşleşen elemanı siler.true / falseYok
removeIf(Predicate)Koşula uyan tüm elemanları siler.true / falseUnsupportedOperationException

📊 Benchmark Karşılaştırması (Özet)

MetotArrayListLinkedListAçıklama
remove(0)Yavaş (O(n))Hızlı (O(1))İlk eleman silme
remove(size/2)OrtaOrtaOrtadan silme
removeIf()Genelde daha hızlıAynıŞartlı toplu silme

❓ Sıkça Sorulan Sorular (SSS)

  1. remove(int) ve remove(Object) farkı nedir?

remove(int) indeksle, remove(Object) değere göre siler.

  1. Listeyi tamamen nasıl temizlerim?

list.clear(); komutu tüm elemanları kaldırır.

  1. Silme işlemi sırasında hata almamak için ne yapmalıyım?

Iterator kullanın veya removeIf() tercih edin.

  1. Immutable listelerde neden remove çalışmaz?

Çünkü bu listeler sabit boyutludur ve değiştirilemez.

  1. Multithread ortamlarda hangi listeyi kullanmalıyım?

CopyOnWriteArrayList veya Collections.synchronizedList() tercih edin.


🧠 Sonuç

Java’da remove() metodu, basit bir silme fonksiyonu gibi görünse de, liste türüne ve kullanım amacına göre performansı ciddi şekilde değişir. Doğru metodu seçmek hem verimlilik hem hata yönetimi açısından kritik öneme sahiptir.