Önceki yazımızda koleksiyonlara temel bir giriş yapıp, yaygın olan metodları incelemiştik. Şimdi Java Koleksiyonlarından ilki olan List interfacesini inceleyeceğiz. Bir list interface, yinelenen öğeler içeren sıralı bir koleksiyon oluşturmak istediğimizde kullanılır. List bir diziye çok benzer ve int index ile öğeler eklenebilir ve ya çıkarılabilir. Bir dizinin aksine, listeler oluşturulduktan sonra boyut olarak değişebilir. Tüm list implementasyonlarının ortak noktası sıralanmaları ve kopyalanmalara izin vermesidir. List implementasyonlarından ArrayList ve LinkedListi karşılaştıracağız:
List İmplementasyonlarının Karşılaştırılması
Bir ArrayList, yeniden boyutlandırılabilir bir dizi gibidir. Öğeler eklendiğinde, ArrayList otomatik olarak büyür. Bir ögeyi eklemek veya kaldırmak, bir ögeye erişmekten daha yavaştır. ArrayListten veri okurken kullanmak ArrayListi iyi bir seçim yapar.
LinkedList özeldir; çünkü hem List hem de Quene interfacesini implement eder. Bir List’in tüm metodlarını kullanabilir. Ayrıca listenin başına veya sonuna eklemeyi veya çıkarmayı kolaylaştırmak için ek metodları da vardır.Bir LinkedListin ana faydaları, listenin başlangıcına ve sonuna hızlıca erişebilmeniz, ekleyebilmeniz ve listeyi silebilmenizdir. ArrayList veya LinkedListlere özel bir kaç factory metod bulunmaktadır. Bu metodlar sayesinde List türünde Koleksiyonlar oluşturulabilir:
Arrays.asList(varargs) : Bir diziyi List’e aktarmak için kullanılır. Eleman ekleme veya silme yapılamaz, abak değiştirilebilir.
List.of(varargs) : İmmutable(değişmez) bir list olarak döndürür. Eleman ekleme, çıkarma, değiştirme yapılamaz. Java 9 ile gelmiştir.
List.copyOf(collection): Orjinal collection’ın kopyasını içeren immutable bir list oluşturur. Java 9 ile gelmiştir.
String[] dizi = new String[]{"a","b","c"}; List<String> asList = Arrays.asList(dizi); //[a,b,c] List<String> of = List.of(dizi); //[a,b,c] List<String> copy = List.copyOf(asList); //[a,b,c] dizi[0] = "g"; System.out.println(asList); //[g,b,c] System.out.println(of); //[a,b,c] System.out.println(copy); //[a,b,c] asList.set(0, "h"); System.out.println(Arrays.toString(dizi)); //[h,b,c] copy.add("k"); //UnsupportedOperationException
İlk yazıda belirtilen koleksiyon metotları dışında, indexlerle çalışmak için ek bazı yöntemler vardır. Bu metodlar ve imzaları aşağıdaki gibidir:
boolean add(E element) : Sona yeni bir öğe ekler. Tüm kolleksiyonlarda kullanılır.
void add(int index, E element): Öğeyi dizine ekler ve indexten sonraki elemanları sonuna taşır.
E get(int index): indexteki elemanı döndürür.
E remove(int index): indexteki elemanı kaldırır ve geri kalanını öne doğru hareket ettirir.
void replaceAll(UnaryOperator<E> op) : Listedeki her bir öğeyi, operator sonucuyla değiştirir.
E set( int index, E e): indexteki elemanı değiştirir. index, listin uzunluğundan büyükse; IndexOutOfBoundsException hatası fırlatır.
List<String> list = new ArrayList<>(); list.add("A"); //A list.add(0,"B"); //B,A list.set(1, "K"); //B,K System.out.println(list.get(0)); //B list.remove("B"); //K list.remove(0); // list.set(0, "X"); //IndexOutOfBoundsException
replaceAll() metodunun örneği aşağıdaki gibidir:
List<Integer> numbers = Arrays.asList(2,2,5); numbers.replaceAll(x->x*2); System.out.println(numbers); //4,4,10