Kendini Yeniden Boyutlandıran Bir Liste
Düz bir Java dizisinin uzunluğu sabittir: on yuvaya karar verirseniz sonsuza kadar on yuvanız olur. ArrayList, java.util'in boyutu değişebilen alternatifidir - ekledikçe büyür, sildikçe küçülür ve bir listeyle gerçekten yaptığınız işler için kullanışlı metotlar taşır.
Açılı parantezler içindeki tipe dikkat edin - List<String> - bu, derleyiciye bu listenin String değerleri tuttuğunu söyler. Sağdaki <> ("elmas"), Java'nın aynı tipi tekrar yazmadan çıkarmasını sağlar. Ayrıca java.util.ArrayList'i içe aktardığınıza dikkat edin; varsayılan olarak kullanılabilir değildir.
List Olarak Tanımla, ArrayList Olarak Oluştur
Değişkeni neredeyse her zaman somut ArrayList yerine List arayüzü olarak tanımlanmış görürsünüz:
List<String> names = new ArrayList<>();
Bu bir kural değil, iyi bir alışkanlıktır. List arayüzüne göre kodlamak, kodunuzun geri kalanının hangi liste uygulamasını kullandığınızı önemsemediği anlamına gelir; böylece daha sonra ona dokunmadan farklı bir uygulamayla değiştirebilirsiniz. Günlük kullanımda ikisi aynı şekilde davranır.
Ekleme, Alma ve Değiştirme
add(value)sona ekler.add(index, value)bir konuma ekler ve sonraki elemanları sağa kaydırır.get(index)bir konumdaki elemanı okur (sıfırdan başlar).set(index, value)var olan bir elemanın üzerine yazar.
İndeksler sıfırdan başlar ve aralık dışı bir indekse get çağırmak IndexOutOfBoundsException fırlatır.
Eleman Silme
Liste Integer tuttuğunda klasik bir tuzak vardır. remove(int) "indekse göre sil", remove(Object) ise "değere göre sil" anlamına gelir, dolayısıyla:
List<Integer> nums = new ArrayList<>(List.of(10, 20, 30));
nums.remove(1); // 1. indeksi siler -> 20 değeri
nums.remove(Integer.valueOf(20)); // 20 değerini siler
"Bu indeksi sil" değil de "bu değeri sil" demek istediğinizde değeri Integer.valueOf(...) ile sarın.
Boyut, Contains ve İndeks Aramaları
List.of(...) hızlıca değiştirilemez bir liste oluşturur; onu ArrayList yapıcısına geçirmek, o değerlerle doldurulmuş değiştirilebilir bir kopya verir.
Bir ArrayList Üzerinde Döngü
En temiz döngü gelişmiş for'dur ("for-each"):
İndekse de ihtiyacınız olduğunda, size() ve get(i) ile sayılı bir döngü kullanın:
Bir kural: bir for-each döngüsü listeyi dolaşırken listeye eleman ekleyip çıkarmayın - bu, ConcurrentModificationException fırlatır. Eşleşen öğeleri güvenle silmek için removeIf kullanın:
Sıralama
Collections.sort, bir listeyi yerinde doğal sıralamayla düzenler (dizeler için alfabetik, sayılar için sayısal):
Özel sıralamalar için list.sort(...)'a bir Comparator geçirin - örneğin uzunluğa göre sıralamak için names.sort(Comparator.comparingInt(String::length)).
ArrayList İlkelleri Değil Nesneleri Tutar
ArrayList<int> yazamazsınız. Jenerikler yalnızca nesne tipleriyle çalışır, bu yüzden Integer, Double, Boolean gibi sarmalayıcı sınıfları kullanın:
Java'nın otomatik kutulaması (autoboxing) sizin için int ile Integer arasında dönüşüm yapar, böylece bu doğal okunur - sadece listenin kendisinin Integer nesneleri sakladığını unutmayın.
Sıradaki: HashMap
ArrayList, sıra ve konum sizin için önemliyse doğru araçtır. Bir anahtara göre arama yapmanız gerektiğinde - bir kullanıcı adından bir kullanıcıya, bir ürün kodundan bir fiyata - bir HashMap istersiniz; o da bir sonraki sayfadır.
Sıkça Sorulan Sorular
Java'da bir ArrayList nasıl oluşturulur?
Eleman tipini açılı parantezler içinde belirtip yapıcıyı çağırın: ArrayList<String> names = new ArrayList<>();. Sağdaki <> (elmas), Java'nın tipi çıkarmasını sağlar. Değişkeni genellikle List arayüzü olarak tanımlarsınız: List<String> names = new ArrayList<>();.
Java'da bir dizi ile bir ArrayList arasındaki fark nedir?
Düz bir dizinin uzunluğu, onu oluşturduğunuzda belirlenir ve sabittir; ayrıca int gibi ilkel tipleri tutabilir. Bir ArrayList ise eleman ekleyip çıkardıkça otomatik olarak büyür ve küçülür, yalnızca nesneleri tutar (yani int, Integer olur) ve add, remove, contains, size gibi metotlarla gelir. Sabit boyutlu ilkel veriler için dizi kullanın; boyut değiştiğinde ise ArrayList kullanın.
Bir ArrayList'ten bir eleman nasıl silinir?
Konuma göre silmek için remove(index), eşleşen ilk elemanı silmek için remove(object) çağırın. Integer listelerinde dikkatli olun: list.remove(2) 2. indeksi siler, oysa list.remove(Integer.valueOf(2)) 2 değerini siler. Döngü sırasında silmek için, ConcurrentModificationException'dan kaçınmak amacıyla bir Iterator'ın remove() metodunu veya removeIf(...) kullanın.