Tarih :14 Aralık 2019

Java Collections – ArrayList Nedir?

ArrayList, Collections Framework’unun bir parçasıdır ve java.util paketinde bulunur. Java’da bize dinamik diziler sağlar. Standart dizilerden daha yavaş olabilse de, bu yapı, bir dizi üzerinde birçok manipülasyonun gerekli olduğu programlarda yardımcı olur.

ArrayList, AbstractList soyut sınıfından miras alır(alt sınıfıdır) ve List arayüzünü(interface) uygular.

ArrayList belirli bir boyutla başlatılabilir, ancak nesneler eklenirse koleksiyon(collection) büyür veya nesneler çıkarılırsa koleksiyon(collection) küçülür. Özetle boyutu standart dizilerin aksine dinamiktir, boyutu artabilir veya azalabilir.

resim kaynak : dzone.com

ArrayList, int, double, char vb. gibi primitif(ilkel) türdeki veriler için kullanılamaz. Bu tür durumlarda sarmalayıcı sınıfları kullanılır. Java’daki her ilkel tür için, sarmalayıcı sınıfı olarak adlandırılan yerleşik bir nesne tipi vardır. Örneğin int için sarmalayıcı sınıfı Integer; double için Double sınıfı, char için Char sınıfı..

Her bir sarmalayıcı sınıfı, özel değerler (tür için minimum ve maksimum değerler gibi) ve türler arasında dönüştürme için kullanılabilecek metotlar içerir.

Sarmalayıcı sınıflarını başlatabilir ve ilkel değerler içeren nesneler oluşturabilirsiniz. Başka bir deyişle, bir nesneye ilkel bir değer ekleyebilir, bu da bir nesne türü gerektiren bir yöntemi çağırmak istiyorsanız kullanışlıdır.

Bu yöntemler, yapılandırıcılar (parseInt ve parseDouble) ile aynı dönüştürme yöntemlerini kullanır. Aynı şeyi yapmanın iki yolu olduğunda, muhtemelen birini seçmek ve tutarlı bir şekilde ona bağlı kalmak en iyisidir. Bu durumda, valueOf kullanmak yerine, yapılandırıcılar tercih edilebilir, çünkü yeni sarmalayıcı nesneler oluşturduğunuzdan daha açık olmasını sağlıyor.

ArrayList farklı sınıflardan nesne saklayabilir.

ArrayList bir sınıf olduğu için bu sınıfa ait metotları nesne üzerinde kullanabiliriz. Örneğin add() metodu ile ArrayList’e elemanlar ekleyebiliriz.

ArrayList, dizi(array)lerden farklı olarak bellekte sabit yer ayırma yerine, saklanmak istenen veri uzunluğunda esneklik sağlar. Dolayısıyla ArrayList add() metodu ile eleman eklemeye devam edebiliriz.

Yukarıdaki örnekte farklı sınıflara ait nesneler saklansa da, pratikte aynı sınıfa ait nesneleri bir ArrayList içinde saklayıp, ArrayList elemanı üzerinden ait olduğu sınıfın metotlarını çağırmak isteriz. Bunu ArrayList’in Generic sınıf olması bize bu özelliği sunar.

ArrayList – Generics

Generics Nedir?

Generics içerisinde tüm referans veri tiplerini tutan ayrıca hangi referans tipini tutacağına oluştururken karar verebileceğimiz ve üzerinde aynı işlemleri işlemleri yapmamızı sağlayan bir yapıdır. ArrayList de bir Generic sınıftır.

Bir başka ifadeyle Generic’ler tasarlandığımız interface, class, metod yada parametrelerin (argümanların) belirli bir tip için değil bir şablon yapısına uyan her tip için çalışmasını sağlayan bir yapıdır. Kaynak

Bu kavramı başka nesneye yönelik programlama dillerinde de karşımıza çıkar(C#).

Neden Kullanılır ?

Java’da jeneriklerin getirdiği birinci avantaj, oluşabilecek tip uyumsuzluklarının derleme (compile) esnasında fark edilerek düzeltilebilmesini sağlamaktır. Kaynak

İkinci avantajı, tip dönüşümüne (casting’e) gerek kalmamasıdır. Kaynak

Üçüncü avantajı, aynı anda farklı tiplerle çalışabilen kod yazılmasını sağlayarak kod tekrarını engellemesidir. Kaynak

Aşağıdaki Generic olmadan dönüştürme (casting) ihtiyacina bir örnek verilmiştir. Burada ArrayList içindeki farklı türden nesnelere erişip, bu nesnelerin, ait oldukları sınıflara özgü metotlarını kullanmak istediğimizde derleme zamanı hatası (compile time error) verecektir.

Çünkü bu nesneler Object sınıfına ait nesne olarak değerlendirilmektedir ve bu süper sınıfta Konut sınıfına özgü fiyatHesapla() veya String sınıfına özgü length() metotları yoktur.

Ancak açık dönüşüm(casting) ile bu nesnelerin parantez içinde belirttiğimiz sınıfa(arayüze) ait olduğunun garantisini derleyiciye verirsek bu metotları çağırabiliriz. Eğer eriştiğimiz nesneler, açık dönüşüm(casting) ile belirttiğimiz sınıflara ait değilse, derlemeyi geçsek de çalışma zamanında(runtime) hatayla karşılacağız(runtime error).

Çözüm için ise Generic kullanırız.

Generic  yapısında <> arasında parametre olarak saklanacak veri tipi belirtilir. Aşağıdaki örnekte bu kez iki farklı ArrayList tanımlıyoruz. Görüldüğü gibi ArrayList’in istediğimiz elemanına üzerinden <> arasında belirtilen sınıfa(arayüze) ait bir referans verebiliriz ve kendi sınıfına özgü metodunu çağırabiliriz.

ArrayList Metodları

get() metodu

ArrayList’de birçok farklı metot vardır. Elemanlara erişmek için dizi(array)lerden farklı olarak yine metot kullanırız. Bunun için get() metodunu kullanırız. Aşağıdaki tanımladığımız ArrayList’in elemanlarını yazdırmak için get() metodu kullanılmaktadır.

Özetle dizilerde bir elemana erişmek için dizi[indis] ifadesini kullanırken, ArrayList’lerde elemana erişmek için liste.get(indis) (burada ArrayList değişkeninin adı liste olsun) biçiminde metot kullanılır.

set() metodu

ArrayList elemanlarını değiştirmek için set(indis, değer) biçiminde set metodunu kullanırız. Aşağıdaki örnekte 1 indisine sahip elemanı, set() metodunu kullanarak 21 değerini atadıktan sonra yeniden yazdırıyoruz.

size() metodu

Dizilerde bir elemanın uzunluğunu bulmak için .length değerini kullanırken, ArrayList’lerde listenin boyutunu bulmak için
size() metodunu kullanırız.

Alternatif olarak foreach döngüsünü de kullanabiliriz.

remove() metodu

ArrayList’lerde listenin bir elemanını silmek için kullanılan metottur. Parametre olarak silinmek istenen elemanın indisi kullanılır.

clear() metodu

ArrayList’in içeriğini temizlemek için clear() metodunu kullanırız.

Generics ile ilgili farklı örnekler için tıklayın.

Bir cevap yazın

E-posta hesabınız yayımlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir