# List interface (Arayüzü)
Collection Interface'ini implemente eden List Interface'i Java 5 ile jenerik (generic) olmuÅtur. Veriler, geliÅ sırasına göre (ordered) tutulur.
List'lerin her elemanı bellekte kendine özgü bir alan tutar. List üzerinde veri ekleme ve bu verilere eriÅme indis(index) denilen integer sayılar üzerinden yapılır. BaÅlangıç indisi sıfırdır.
List Interface'inden kalıtım alan sınıflarda, tekrarlı (duplicate) veya null deÄerli elemanlar tutulabilir.
Dizilerin kullanıldıÄı her yerde List'ler kullanılabilirler ayrıca birbirlerine dönüÅtürülebilirler. Veri iÅlemeye yarayan metotlarından dolayı List'ler, programcılar, bu yapıları daha çok tercih ederler.
Bu interface'te implemente edilen metotlar;
| Metot imzaları | Açıklama |
| ------------------------------------ | :----------------------------------------------------------- |
| get(int index) | Verilen indisteki nesneyi getirir. |
| add(Object element) | Listeye eleman eklemeyi saÄlar. EÄer, indisle birlikte nesne verilirse, ilgili indisin gösterdiÄi noktaya elemanı ekler. Aynı indiste baÅka bir nesne varsa onun üzerine yazar. |
| indexOf(Object) | Verilen bir nesnenin listede hangi indiste tutulduÄunu bulur. |
| remove(int index) | Verilen indisteki elemanı siler. |
| set(int index, Object element) | Verilen indisteki elemanı baÅka bir eleman ile deÄiÅtirir. |
| subList(int fromIndex, int toIndex) | Verilen indisler arasındaki elemanlardan oluÅan yeni bir liste oluÅturur. |
## List interfaceâin alt sınıfları
\- ArrayList
\- LinkedList
\- Vector
\- Stack
NOT: Vector ve Stack sınıfları, legacy (miras) sınıflardır. Java 5'ten önceki versiyonlarında var olup, artık daha iyi alternatifleri olan sınıflardır. Hala bu sınıfları kullanan projeler olabileceÄi için tamamen kaldırılamazlar.
### ArrayList Sınıfı
List Interfaceâden türemiÅ alt sınıf olan ArrayList, liste halindeki verileri dinamik diziler(array) kullanarak saklar. Default boyutu 10âdur.

Bu dizilere yeni eleman eklendikçe eÄer boyutu yetmiyorsa, çalıÅma zamanında, arka tarafta var olan dizinin boyutunun 2 katı olan yeni dizi tanımlanır. Eski dizideki elemanlar indis deÄerleri korunarak yeni diziye aktarılırlar. Esnek fakat maliyetli bir collectionâdır.
Veri saklamak ve veriye eriÅimin yoÄun olduÄu durumlar için ArrayList tercih edilir.
ArrayListâler tanımlanırken <>(diamond) operatörleri arasına içerisinde tutulacak deÄerlerin tipi yazılmalıdır.
Araya ekleme veya silme iÅlemleri yapılması durumunda kaydırma iÅlemleri yapılması gerekir. Bu durum performansı düÅürür.
ArrayList sınıfı thread-safe deÄildir. Bir ArrayListâe aynı anda birden fazla thread eriÅebilir. Bu durum veri bütünlüÄünü bozar.
Sınıf imzası;
```java
public class ArrayList extends AbstractList implements List, RandomAccess, Cloneable, Serializable
```
| Constructor | Açıklama |
| ------------------------------------ | :----------------------------------------------------------- |
| ArrayList() | BoÅ bir ArrayList oluÅturmak için kullanılır. |
| ArrayList(Collection extends E> c) | C Collection'ının öÄeleriyle baÅlatılan bir ArrayList oluÅturmak için kullanılır. |
| ArrayList(int capacity) | Belirtilen baÅlangıç kapasitesine sahip bir ArrayList oluÅturmak için kullanılır. |
```java
//String tipinde elemanları tutan ArrayList initialize
List nameList = new ArrayList();
//İndis 0'dan baÅlayarak elemanları sırayla yerleÅtirir.
nameList.add("Gamze");
nameList.add("Elif");
nameList.add("Mustafa");
nameList.add("Umut");
nameList.add("Umut");
//ArrayList null deÄerli eleman tutabilir.
nameList.add(null);
//Tüm listeyi ekrana yazdırır.
printAll(nameList);
//size() metodu, Collection Interface'inden gelen bir mirastır.
System.out.println("Size of list: " + nameList.size());
// get ile listeden eleman okuması yapılır. Okunan eleman listeden çıkartılmaz.
System.out.println("Element of 1 index: " + nameList.get(1));
System.out.println("Element of 2 index: " + nameList.get(2));
// Liste baÅından taramaya baÅlarayarak ilk geçen noktadaki Umut bilgisinin indis deÄerini verir.
System.out.println("Index of 'Umut': " + nameList.indexOf("Umut"));
// Liste sonundan taramaya baÅlayarak son geçen noktadaki Umut bilgisinin indis deÄerini verir.
System.out.println("Index of 'Umut': " + nameList.lastIndexOf("Umut"));
//add() fonksiyonuna ilk verilen argüman indis, sonraki elemandır.
//Verilen indise gidip verilen elemanı koyar.
//Verilen indiste daha önceden tanımlanmıŠdeÄer varsa, fonksiyondaki elemanı o indise koyar ve geri kalan elemanları kaydırır.
nameList.add(3, "Zeynep");
//set() fonksiyonuna ilk verilen argüman indis, sonraki elemandır.
//Verilen indise gidip verilen elemanı koyar.
//Verilen indis, liste boyutunun dıÅında olmamalıdır.
nameList.set(1, "Naz");
// contains ile liste içinde aradıÄımız eleman var mı yok mu belirtir.
// varsa true, yoksa false döner
System.out.println(nameList.contains("Elif"));
System.out.println(nameList.contains("Mustafa"));
// remove fonksiyonu ile listeden belirttiÄimiz indisteki deÄer silinir.
// silinen deÄer fonksiyondan bize geri döndürülür.
String firstElement = nameList.remove(0);
System.out.println(firstElement + " is removed from list!");
List newNameList = new ArrayList();
newNameList.add("Batuhan");
newNameList.add("Kemal");
// bir listeyi tümüyle bir diÄer listeye eklemek için "addAll" fonksiyonu kullanılır.
nameList.addAll(newNameList);
// listeden alt bir liste oluÅturmak için "sublist" fonksiyonunu kullanırız.
//BaÅlangıç ve bitiÅ indisleri verilir.
//BaÅlangıç indisindeki eleman dahil, bitiÅ indisindeki eleman hariç yeni bir liste oluÅturulur.
List subList = nameList.subList(4, 6);
System.out.println("Sublist from name list");
printAll(subList);
// toArray fonksiyonu parametresiz çaÄırırsanız Object tipinde bir dizi döner.
Object[] objectArray = nameList.toArray();
// toArray fonksiyonuna hangi tipte bir dizi oluÅturmak istiyorsak,
// o tipten bir nesne üretip parametre olarak göndeririz.
// String tipinden bir dizi almak istediÄimiz için "new String[0]" Åeklinde bir nesne üretip, "toArray" fonksiyonuna gönderdik.
String[] stringArray = nameList.toArray(new String[0]);
// listedeki tüm elemanları temizler. yani tümünü listeden siler.
nameList.clear();
```
### LinkedList Sınıfı
Ãift yönlü baÄlı liste algoritmasının Java implementasyonudur. Her eleman önceki ve sonraki elemanını iÅaret edecek Åekilde iki yönlü bir iliÅki kurulmuÅtur. Listenin ben baÅına hem sonuna eleman eklenip çıkarılabilir, bu iÅlemler için metotlar mevcuttur. LinkedListâte eleman silme veya araya eleman ekleme durumlarında kaydırma iÅlemi yapılmaz.

Bu listeye gönderilen veriler, arka planda özel bir obje ile sarılır (wrap) edilir. Bu objeler birbirini gösterecek Åekilde referanslar objelere konur, böylece birbirlerine baÄlanırlar.
Kullanılacak veri grubunu bir listeye koymamız ve bu gruba veri ekleme iÅlemi sürekli yapılacaksa, LinkedList kullanılması önerilir.
LinkedList sınıfı, ArrayList gibi thread-safe deÄildir. Bu List türünde de veri bütünlüÄünü sorunu vardır.
LinkedList, hem List interface'inden hem Queue (Kuyruk) interface'inden miras alan bir sınıftır.
Sınıf imzası;
```java
public class LinkedList extends AbstractSequentialList implements List, Deque, Cloneable, Serializable
```
| Constructor | Açıklama |
| ------------------------------------- | :----------------------------------------------------------- |
| LinkedList() | BoÅ bir LinkedList oluÅturmak için kullanılır. |
| LinkedList(Collection extends E> c) | Koleksiyonun yineleyicisi tarafından döndürülen sırayla belirtilen koleksiyonun öÄelerini içeren bir liste oluÅturmak için kullanılır. |
```java
List nameList = new LinkedList();
nameList.add("Hale");
nameList.add("Jale");
nameList.add("Lale");
nameList.add("Ahmet");
nameList.add("Mehmet");
nameList.add("Kemal");
// get ile listeden eleman okuması yapılır. Okunan eleman listeden çıkartılmaz.
System.out.println("Element of 2 index: " + nameList.get(2));
// Liste baÅına eleman ekler
nameList.addFirst("Naz");
// Liste sonuna eleman ekler
nameList.addLast("Ãmit");
```
ArrayList'te implemente edilen metotların çoÄu LinkedList için de geçerlidir.