Bu yazıda, oldukça geniş ve kapsamlı bir konu olan Collections konusunda giriş yapacak, Collection Interface’ini detaylı bir şekilde ele alıp, hiyerarşik olarak onun altında bulunan List, Queue ve Set’i ve bunlara bağlı olarak ArrayList, LinkedList, Vector, PriorityQueue, Deque, HashSet ve LinkedHashSet hakkında konuşacağız.
Collection Nedir
Collection, farklı türdeki dataları toplu bir şeklide tutmak ve onlar üzerinde çeşitli işlemler gerçekleştirmek için oluşturulmuş bir framework’tur. Bu framework içerisinde, farklı karakteristik özelliklere sahip, farklı yapılar yer almaktadır.
Collection’lar çok sayıda veriyi bir arada tutmaya imkan vermelerinin yanı sıra, onları manipüle etmeye ve çeşitli amaçlarla çeşitli şekillerde kullanmaya da izin verir. Sununlan metodlar sayesinde bu yapılar üzerinde ekleme, çıkarma, sıralama gibi pek çok işlem yapılabilir.
Aşağıdaki görselde de görebileceğiniz üzere Collection aslında bir interface’dir. Bu interface’e bağlı üç farklı interface ve ve yine onların altında daha farklı class ve interface’ler bulunmaktadır.
Tablo’da da görülebileceği üzere, Collections interface’ine bağlı, üç temel interface vardır. Bunlar, List, Queue ve Set interface’leridır. Bu interface’ler sahip oldukları farklı karakteristik özellikler ile birbirlerinden ayrılmaktadırlar.
Collection Metodları
Collection interface’inde, çoklu yapılarla ilgili çeşitli işlemler yapmamıza olanak sağlayan çok sayıda metod bulunmaktadır. Bu metodlar, alt sınıflar tarafından da miras alınmıştır. Bu metodlardan bazıları şunlardır;
add(Object) | Collection’a yeni bir obje eklemek için kullanılır. |
addAll(Collection c) | Bir Collection’daki verileri, toplu bir şekilde farklı bir Collection’a eklemek için kullanılır. |
clear() | Bir collection’daki tüm elemanları siler. |
contains(Object o) | Verilen elemanın, collection’da olup olmadığını kontrol eder. Varsa true, yoksa false return ederi. |
containsAll(Collection c) | Bir collection’un diğerinde olup olmadığını kontol etmek için kullanılır. Varsa, true yoksa false return eder. |
equals(Object o) | İki collection’un birbirine eşit olup olmadığını kontrol eder. |
size() | Bir collection’daki eleman sayısını int olarak return eder. |
isEmpty() | Eğer collection’da hiç eleman yoksa true return eder. |
remove(Object o) | Verilen objeyi collection’dan siler. Eğer iki tane varsa yalnızca ilkini siler. |
removeAll(Collection c) | Toplu silme işlemi yapmak için kullanılır. |
toArray() | Collection’u Array olarak return eder. |
List Interface
Yukarıdaki tabloda görülebileceği üzere Collection’a bağlı interface’lerden ilki List interface’dir. Bu interface, aynı türde çok sayıda veriyi bir arada tutmak için kullanılır. List’in en karakteristik özelliği, tekrarlı verileri saklayabilmesidir. List interface’inde çok sayıda metod bulunmaktadır. Bu interface’e implement edilmiş ArrayList, LinkedList ve Vector gibi class’lar mevcuttur.
ArrayList
ArrayList’ler, bize dinamik bir yapı sunar. Array’lere nazaran daha yavaş olsalar, orada sunulmayan pek çok imkanı sunarlar. Örneğin ArrayList’te bir eleman eklediğinizde, otomatik olarak genişler sildiğinizde ise otomatik olarak daralırlar. ArrayList’ler dahili bir dizi yapısına sahiptir. Index gerektiren işlemeler yapmak için kullanılır. ArrayList’e bir eleman eklendiğinde veya silindiğinde içerisindeki tüm elemanların index’i değişir. Bu da onu yavaş yapan en önemli etkenlerden biridir.
ArrayList<String> ornekArrayList = new ArrayList<>();
LinkedList
LinkedList’ler, her biri iki bölümden oluşan node isimli yapılardan oluşur. Node şeklinde isimlendirdiğimiz bu yapıların bir tarafında data, diğer tarafında ise bir sonrakinin adresine işaret eden bir pointer bulunur. LinkedList’ler, Türkçe ismiyle Bağlı Liste’ler, bir zincirin halkaları gibidir. Bir halka çıkarıldığında, ondan önceki ile ondan sonraki otomatik olarak birbirine bağlanır. LinkedList’lerde index yapısı bulunmadığı için ve dolayısı ile, eleman ekleyip çıkarırken, her defasında yeni bir indexleme işlemi yapılmadığı için ArraylList’lere göre daha hızlıdır.
LinkedList<String> ornekLinkedkist1 = new LinkedList<>();
Vector
ArrayList ile neredeyse her açıdan aynı özellikler taşır. İkisi arasındaki en büyük fark Vector’un senkronize bir yapıya sahip olmasıdır. ArrayList’ler ise senkronize değillerdir. Yani birden fazla iş blokunu aynı anda değiştiremezler. Vector’ler aynı zamanda, Collection interface’inde yer almayan çok sayıda farklı metod içerir.
Vector<String> ornekVector = new Vector<>();
Queue Interface
Collection interface’inin altında yer alan bir diğer interface Queue’dur. Queue, firs-in-first-out (FIFO) yani ilk giren ilk çıkar odaklı bir yapıya sahiptir. Bu, gerçek hayattaki sıra mantığı ile aynıdır. Örnek vermek gerekirse, bankadaki işlemler, fiş alış sırasına göre ilerler. Sıra fişini ilk alanın işlemi önce yapılır. Queue, bu yapısı sebebiyle, işlenmek üzere olan elemanları tutmak için kullanılan sıralı bir liste olarak tanımlanabilir. Queue, ilk elemanı ilgilendiren pek çok metoda sahiptir. Queue’nun PriorityQueue, Deque, ve ArrayDeque gibi varyasyonları mevcuttur.
Queue<String> q1 = new PriorityQueue();
Queue<String> q2 = new ArrayDeque();
Deque Interface
Double-ended queue kelimelerinin kısaltması olan Deque, listenin başı ve sonu yani her iki tarafıyla da ilgili detaylı işlemler yapmamıza imkan veren bir yapıya sahiptir.
Deque d = new ArrayDeque();
Set Interface
Set’ler, aynı türdeki verileri sırasız bir şekilde listelemek için kullanılan yapılardır. Set’leri diğerlerinden ayıran en önemli özellikleri, verileri tekrarsız bir şekilde depolamalarıdır. Bu sebeple, tekrarsız bir veri kullanacaksak veya tekrarlı verilerden kaçınmak istiyorsak, Set’leri kullanabiliriz. Set’ler HashSet, TreeSet ve LinkedSet gibi farklı bölümlere ayrılmaktadır.
HashSet
Set Inteface’ine bağlı bu yapıya eklediğiniz elemanlar, tekrarsız olacak şekilde hashcode’larına göre eklenir. Sıralama önemsiz olduğu için diğer list yapılarına göre çok daha hızlıdır. HashSet’ler null eleman kabul eder.
HashSet<String> ornek = new HashSet<String>();
LinkedHashSet
LinkedHashSet, HashSet ile oldukça benzer bir yapıya sahiptir. Tek farkı, elemanları ekleniş sırasına göre dizmesidir. LinkedHashSet, HashSet’e nazaran daha yavaş çalışır.
LinkedHashSet<String> lhs = new LinkedHashSet<String>();
SortedSet Interface
SortedSet Interface, Set interface ile hemen hemen aynıdır. Tek fark, SortedSet’in, elemanları alfebetik olarak veya küçükten büyüğe şeklinde sıralamak için ek metodlar içermesidir.
SortedSet<String> ornek = new TreeSet();
TreeSet
TreeSet tekrarsız elemanları “alfabetik” veya “küçükten büyüğe”(Natural Order) dizer. TreeSet, diğer set’lere göre çok daha yavaştır ve null eleman kabul etmez. SortedSet bir interface, TreeSet ise bir class’tır.
TreeSet<String> set=new TreeSet<String>();
Collection’lar hakkında özet bilgileri en uygun şekilde aktarmaya çalıştık. Bu yazıda yer alan Collection türleri ile ilgili detaylı bilgiler sonraki yazılarda ayrı ayrı ele alınacaktır.
emeginize saglik. map arayüzü yazinizi da bekliyorum hocam 🙂
Teşekkür ederim. En yakın zamanda inş.
Hocam harika hazirlamissiniz çok teşekkür ederim Allah razı olsun. Emeğinize sağlık…
Degerli yorumunuz icin tesekkur ederim leyla hanim.