Collection Framework

Collection Framework

Makaleyi okumadan önce eğer bilmiyorsanız diziler hakkında biraz araştırma yapmanızı öneririm.

Bu yapı da aynı diziler gibi objelerin belli bir düzen ile saklanmasını ve dizilerden çok daha kolay bir şekilde üzerinde ekle, sil, güncelle gibi işlevleri yapabildiği ve bunların yanında programın güvenirliliğini sağlayan, işi kolaylaştıran yapılardır.

Çeşitli algoritma yapıları ile performansı da arttırmaktadır. Diziler de eleman sayısı ve hangi tipte veri saklayacağı belli ise bunu kolaylıkla yapabilmekteydik ancak bu değerler net belli değilse işte o zaman işler karışık bir hale geliyordu.

Veri ekledikçe dizilerden farklı olarak uzunlukları kendiliğinden artmaktadır. Çok sayıda içerdikleri methodlar ile yazılımcıya kolaylık sağlamaktadırlar.

Collection framework’te interfacelerden oluşan bir hiyerarşik bir yapı vardır.

En üstte Iterable interface bulunmaktadır. Biz bu makalede Collection interface altında bulunan List, Queue, Set kavramları ve Collection yapısından farklı olan Map kavramlarını inceleyeceğiz.

List

Tekrarlı veri girişine izin verir. Verileri ekleme sırasına göre tutar. İstediğimiz index’e veri eklememize izin verir.

  • ArrayList

Collectionlar içerisinde en çok kullanılan class’tır. Hayatımızdaki herhangi bir listeye benzemektedir.

ArrayList<String> persons = new ArrayList<>();
persons.add("Ufuk");
persons.add("Onur");
persons.add("Yıldız");
persons.add("Yasin");

persons.add("Ufuk");                  // Aynı veriyi tekrar ekleyebiliriz.

persons.add(4,"Kemal");               // İstediğimiz indexe ekleyebiliriz.

persons.addAll(list)                  // Herhangibir listeyide ekleyebiliriz.

persons.remove(3);                    // Belirtilen indexdeki veriyi silebiliriz.

String selectPerson = persons.get(3); // Belirtilen indexdeki veriyi okuyabiliriz.

persons.forEach(s -> System.out.print(s + " "));

//Ekran çıktısı -> Ufuk Onur Yıldız Kemal Ufuk
  • LinkedArrayList

ArrayList’e çok benzer bir yapıdır. Aralarında CRUD işlemlerine göre bazı farklar bulunmaktadır. Arama işlemlerinde LinkedList O(n) iken ArrayList’te O(1)’dir. Silme işlemlerinde ise ArrayList O(n) iken LinkedList O(1)’dir. Ekleme işlemleri de aynı sonuçları verir. Ekleme ve silme işlemleri sık yapılacaksa LinkedList kullanmak daha avantajlıdır. Arama işlemleri sık yapılacak ise de ArrayList daha avantajlıdır. Bunun nedeni Array list adından anlaşılacağı üzere array tanımlaması yaparak işlemlerini yapar. Biz bir ekleme yaparkende array’in boyutunu değiştirme durumu olduğundan daha maliyetlidir. Linked list ise yeni bir veriyi son veriye bağlayarak işlemi yapar.

LinkedList<String> fruits = new LinkedList<>();
fruits.add("Elma");
fruits.add("Armut");
fruits.add("Karpuz");
fruits.add("Mandalina");

fruits.add("Elma");                   // Aynı veriyi tekrar ekleyebiliriz.

fruits.add(4,"Portakal");             // İstediğimiz indexe ekleyebiliriz.

persons.addAll(list)                  // Herhangibir listeyide ekleyebiliriz.

fruits.remove(3);                     // Belirtilen indexdeki veriyi silebiliriz.

String selectFruit = fruits.get(3);   // Belirtilen indexdeki veriyi okuyabiliriz.

fruits.forEach(s -> System.out.print(s + " "));

//Ekran çıktısı -> Elma Armut Karpuz Portakal Elma
  • Vector

Vector, nadiren kullanılan bir classtır. Sychronized bir collection’dır ve varsayılan kapasitesi 10’dur. 11. element eklenirken kapasitesini 20 yapar. 21. elementi eklerken 40 yapar. Varsayılan kapasite ve artış değerlerini kullanıcı belirleyebilir.

Queue

Kuyruk yapısıdır. Günlük hayatımızdaki herhangi bir yerde girdiğimiz bir sırayı örnek verebiliriz. İlk giren İlk çıkar mantığı vardır.(First In First Out)

Set

Diğerlerinden farklı olarak aynı elemandan bir tane daha eklenmez ve birden fazla null eleman kabul etmez. Eğer iki obje birbirine eşitse ekleme işlemini yapamayız. Set’den türetilmiş diğer yapılara bakalım.

  • HashSet

HashSet’te veriler hashlenmiş olarak tutulmaktadır bundan dolayı verilerin ekleme sırası garanti edilmez. Hızlı erişim sağlar. Non-synchronized’dır bundan dolayı aynı data üzerinde birden fazla thread işlem yaparsa problem çıkabilmektedir. Manuel bir çözüm olarak synchronized erişim sağlamalıyız.

HashSet<String> persons = new HashSet<>();
persons.add("Ufuk");
persons.add("Yıldız");
persons.add("Onur");
persons.add("Beyza");              //Aynı veriyi eklemeye çalışsakta cıktıya baktığımızda eklenmiyor.
persons.add("Beyza");

persons.forEach(s -> System.out.print(s+" "));

//Ekran Çıktısı -> Yıldız Onur Beyza Ufuk
  • LinkedHashSet

HashSet’ten tek farkı verileri eklenme sırasına göre eklemesidir. Aynı veriden bir tane daha eklediğimizde ilk eklenen veri bundan etkilenmez.

LinkedHashSet<String> persons = new LinkedHashSet<>();
persons.add("Ufuk");
persons.add("Yıldız");
persons.add("Onur");
persons.add("Beyza");           //Aynı veriyi eklemeye çalışsakta cıktıya baktığımızda eklenmiyor.
persons.add("Beyza");           //Ekleme sırasına göre ekleme yapar.

persons.forEach(s -> System.out.print(s+" "));

//Ekran Çıktısı -> Ufuk Yıldız Onur Beyza
  • TreeSet

Diğerlerinden farklı olarak veriler artan sıraya göre eklenmektedir. Ascending order olarak tutulmaktadır. Null değer kabul etmez NullPointerException fırlatır.

TreeSet<String> persons = new TreeSet<>();
persons.add("Ufuk");
persons.add("Yıldız");
persons.add("Onur");
persons.add("Beyza");             //Aynı veriyi eklemeye çalışsakta cıktıya baktığımızda eklenmiyor.
persons.add("Beyza");             //Eklenen verileri artan sıraya göre eklemektedir.

persons.forEach(s -> System.out.print(s+" "));

// Ekran Çıktısı -> Beyza Onur Ufuk Yıldız

Map

Map, collection sınıfına dahil değildir ancak benzer özellikler taşımaktadır. Maplerde Key-Value şeklinde veriler tutulmaktadır. Value tekrar edebilir ama key tekrar edilemez. Tüm valuelara kendisi ile eşlenmiş key ile set edilebilir veya çağrılabilir.

  • HashMap

Sıralamayı garanti etmez. Null key ve null value eklenebilir. Hızlı erişim sağlar.

HashMap<String,String> persons = new HashMap<>();
persons.put("5585898465","Ufuk");
persons.put("5587455555","Yıldız");
persons.put("1234558799","Onur");           //Çıktı sırası ile ekleme sırası aynı değil.
persons.put("8996315485","Beyza");
persons.put("8996315478","Ali");

String secondary = persons.get(2);

persons.remove("8996315478");

persons.forEach((key, s) -> System.out.print(" " + key + "->" + s ));

//  5585898465->Ufuk 1234558799->Onur 5587455555->Yıldız 8996315485->Beyza
  • TreeMap

Verileri artan(ascending) sıraya göre eklemektedir.

TreeMap<Integer,String> mouths = new TreeMap<>();
mouths.put(4,"April");
mouths.put(2,"February");
mouths.put(1,"January");
mouths.put(3,"March");            //Key değerine göre sıralanmış olarak eklenir.
                            
String secondary = mouths.get(2);
mouths.remove(4);

mouths.forEach((key, s) -> System.out.print(" " + key + "->" + s ));
// Ekran Çıktısı -> 1->January 2->February 3->March
  • HashTable

HashMap ile benzerdir ancak bazı farklar bulunmaktadır. HashTable sychronized’tır bundan dolayı performansı düşüktür. HashMap’te null değer alırken HashTable alamaz.

Codest Blog

Codest Blog yazılım hakkında her konuda bilgi sağlayan bir blog sitesidir. Bilgi paylaştıkça güzeldir felsefesi ile hareket ederek, yazılımcıların en cok karşılaştığı konuları sizlere aktarmayı hedefliyoruz. Keyifli okumalar 🙂