Java Collections Nedir?

Java Collection FrameWork

Projelerimizin içerisinde bizi çeşitli yüklerden kurtaracak Java Collections, kavramına değineceğim bu içeriğimde Java Collections Nedir, avantajları, dezavantajları gibi collections (koleksiyonlar) kavramını öğrenmemize fayda sağlayacak alt başlıklar ile konuyu detaylandıracağım.

Java Collections kavramı bir framework olmasından kaynaklı geniş ve detaylı bir yapı içerisindedir. Bundan kaynaklı dilimin döndüğünce, öğrenmeye çalışırken aldığım notları sizler ile paylaşmaya hazırım. Hadi başlayalım.💪

Java Collections Nedir?

Eğer diziler konusunda bir bilginiz henüz bulunmuyorsa buradan Java’da diziler konuma göz attıktan sonra bu konuya devam etmenizi öneririm. Bunun nedeni Java collection framework, dizi üzerinde yapılan işlemlere benzer türde hizmet sağladığı için temel başlangıç için ideal olacaktır.

Çoğu zaman programlarımızı geliştirirken tek bir öge yerine ögelerden oluşan diziler tanımlamak isteriz. Bu tanımlamalarda eğer veri tipimiz aynı ise, eleman sayımız belliyse standart bir dizi tanımlaması gerçekleştiriyorduk. Söz konusu değerlerin belirsizliği durumunda ise collection framework içerisinde bulunan interfaceler ve bu interfacelerden oluşan kurgulardan faydalanırız.

Bu oluşumların en temelinde List, Set ve Map olmak üzere üç tip yer almaktadır. Bu kavramlardan Set ve List, Java Collection interface’ini kullanırken Map kavramı ise ayrı bir tür olarak bu yapıdan ayrılır. Bu yapıların bütününü ele aldığımızda ortaya Java Collection Framework çıkmaktadır.

Konumuzu fazla dağıtmadan asıl sorumuz olan “Java Collections Nedir” sorusuna dönecek olursak verileri saklamak, saklanan veriyi çekmek, işlemek ve zaman zaman sakladığımız yerde çeşitli verileri aramak için collections kullanırız. 😵

Aklınızın karışması çok normal, ilk başta araştırdığım zaman resmen beynim birden mavi ekran 🤯 vermeye başladı. Bu sorunu ise collection yapısının içerisinde bulunan elemanları gösteren tabloya baktıktan sonra çok normal olduğunu anladım ve adım adım gitmeye karar vererek çözdüm.

Java Collections Tablosu

Java Collection Framework Tablosu

Tablo üzerinde gördüğünüz gibi Java collection framework yapısı oldukça geniş ve kapsamlı bir yapıda. Bu yüzden kavramı teker teker ele alarak, en çok kullanılan, işimize yarayacak temel bölümleri listeleyerek gitmek daha verimli bir tercih olacaktır. Collection alt başlığında bulunan “Set, List ve Queue” kavramlarını ele alarak ne işe yaradıklarını kısa bir şekilde ele alalım.

  • List Bölümü: Tanımlanan değerleri hafızasında sıralı bir şekilde tutar ve tekrarlanan değer atamaları yapılabilir.
  • Set Bölümü: List bölümünün aksine kopya ya da tekrarlanan herhangi bir atama barındırmaz.
  • Queue Bölümü: Kuyruk anlamına gelmektedir, ilk atanan değer her zaman ilk olarak çıkar. Bu yapısı ile birlikte FIFO(first in-first out) kavramı ile birlikte anılır.

Dikkat ettiyseniz tablo üzerinde olduğu gibi Collection ve Map kısmını ayırarak ele aldım. Temel olarak aynı mantıkta çalışsalar bile yapı olarak farklılık gösteriyorlar. Bu farklılığı anlayabilmek adına map kavramını kısa bir madde ile tanımlayabilirim.

  • Map Bölümü: Tanımlanan değerlerin kendisine özel bir anahtar ile eşleştiren interface bölümüdür. Tanımlanan değerler key ve value olarak hafızada tutulur. Set bölümünde olduğu gibi tekrarlanabilir, kopya bir anahtar tanımlanması yapılmaz.

Bu maddeler ile Java Collections kavramı hakkında taşlar yerine oturmaya başlamıştır. En azından kavramın ne kadar derin ve büyük olduğu konusunda hem fikir olmuşuzdur diye düşünüyorum 🤔.

Teorik bilgiler her zaman sıkıcı gelmiştir, biliyorum sizde sıkılıyorsunuz ama eğer bu işi başarmak, Java’yı yenmek istiyorsak bu kavramı öğrenmemiz gerekiyor. Çünkü sağladığı avantajlar projelerimiz için paha biçilemez bir yapıda olabilir. Bu avantajları ise aşağıdaki başlıktan inceleyebilirsiniz.

Java Collections Avantajları

  • Belki de bu kavramı öğrenmeme vesile olan en temel avantajı, veri ekledikçe veya çıkardıkça, collection yapısının uzunluğunu otomatik olarak ayarlaması ve bizim için oldukça büyük bir esneklik sağlaması.
  • Listeleme, sıralama gibi çeşitli algoritmaları oturup sıfırdan yazmamıza gerek bırakmadan collections içerisinde bulunan algoritmaları kullanmamıza imkan sağlar.
  • Oluşturduğumuz uygulamaya sağlayacağı esneklik ve performans arttırıcılığı özelliği ile uğraşmamız gereken sıkıntıları otomatik olarak çözer.
  • Verileri bir araya toplayarak işlem yapmamızı kolaylaştırır.

Bunun gibi bir çok madde internet ortamında, kitaplarda veya ders içeriklerinde sürekli paylaşılmakta ama atladığımız bir şey var o da her güzel şeyin bir kusuru muhakkak olduğu gerçeği. Bu gerçeği araştırırken en çok dikkatimi çeken iki madde oldu bunları da aşağıdaki başlık üzerinde sizlerle paylaştım.

Java Collections Dezavantajları

  • Programımızın derlenme esnasında, oluşturduğumuz koleksiyon yapılarının veri tiplerinin denetiminin gerçekleştirilmemesi.
  • Koleksiyon yapılarımızı oluştururken atayacağımız veri tipinin doğru bir şekilde seçilmesi gerekmektedir.

Gördüğünüz gibi bize başlangıç için pek sıkıntı yaratmayacak maddelerde olsa bu tür sıkıntıları olduğunu bilmemiz gerekiyor. Tabi, teorik bilgiler ile başlayıp, teorik bilgiler ile bitirmek istemediğimden dolayı konu içeriğini biraz devam konularının rollerinden çalarak ve küçük bir spoiler olması adına bir sonraki projem için kullandığım random lisans anahtarı oluşturucusunun prototipini burada birlikte oluşturalım.

Oluşturacağım lisans anahtarı örneğini yaparken uyguladığım aşamalar şu şekildedir:
#1 Öncelikle örneği oluştururken Collection başlığı altında, List kısmında bulunan ArrayList kavramını kullanmaya karar verdim. Bu işlem esnasında Non-Generic bir tanımlama gerçekleştirme kararı aldım (Generic kavramını anlatacağımız konumuzda değineceğiz bu kelimeye).
#2 İşlemi nasıl gerçekleştireceğime karar verdikten sonra CreateCode isminde bir sınıf tanımlaması gerçekleştirerek içerisine Random sınıfını ve ArrayList kavramını kullanmak için gerekli yapıları import ederek tanımlama işlemini gerçekleştirdim.
#3 Tanımlamaları gerçekleştirdikten sonra geriye String veri tipinde bir değer döndüren newCode isminde bir metot tanımlamasını yaptım.
#4 Metot içerisinde Random sınıfını kullanarak elde ettiğim değerleri Ascii tablosuna göre karakterlere dönüştürerek oluşturduğum ArrayList üzerine atamasını gerçekleştirecek if-else kontrol yapısı inşa ettim.

#5 İnşa ettiğim bu if-else kontrol yapısı içerisinde lisans anahtarının kaçıncı indisi olduğunu, dizi içerisinde bulunup bulunmadığını kontrol ettirerek eğer belirlediğim koşullar çerçevesine uyuyorsa diziye eklenmesini, uymuyorsa yeni bir değer üretildikten sonra eklenmesini isteyen bir sistem oluşturdum.
#6 Atama işlemlerim bittikten sonra basit bir foreach tanımlaması yaparak oluşturduğum lisenceCode ismindeki değişkenime dizi elemanlarımı ve belirli aralıklarda “” atamasını yapmak için döngü içerisinde if-else kontrol yapısı yazdım.

package com.company;

import java.util.ArrayList;
import java.util.Random;

public class CreateCode {
    Random random = new Random(); // Random değerlere ulaşmak için gerekli işlem.
    ArrayList lisenceKey = new ArrayList(); // Non-Generic --> Sonraki konularda generic kavramını işleyeceğiz.
    // Değişkenler:
    String lisenceCode;
    int randomValue;
    public String newCode(){
        lisenceCode=""; // Her işlem başladığında değişkenin temizlenmesini istiyorum.
        for(int i=0;i<16;i++){
            if(i==0 || i==4 || i==8 || i==12){ // Oluşturulan anahtarın her zaman ilk harflerinin bir metin olmasını istediğimden sorgulama yaptırıyorum.
            randomValue = random.nextInt(26)+65;
            if(lisenceKey.contains((char)randomValue) == true) // ArrayList üzerinde atanan değerin olup olmadığını kontrol ediyor.
                randomValue = random.nextInt(20)+71;
            if(lisenceKey.contains((char)randomValue)==true) // Contains bir Collection metodudur.
                randomValue = random.nextInt(25)+66;
            lisenceKey.add((char)randomValue);
            }
            else{
                randomValue = random.nextInt(25);
                if(randomValue < 10){
                    if(lisenceKey.contains(randomValue) ==  true)
                        randomValue = random.nextInt(10);
                    lisenceKey.add(randomValue);
                }
                else if(randomValue>10 && randomValue<35){
                    randomValue = random.nextInt(15)+76;
                    if(lisenceKey.contains((char)randomValue)==true)
                        randomValue = random.nextInt(26)+65;
                    lisenceKey.add((char)randomValue);
                }
                else {
                    randomValue = random.nextInt(20)+71;
                    if(lisenceKey.contains((char)randomValue)==true){
                        randomValue = random.nextInt(10);
                        lisenceKey.add(randomValue);
                    }
                    else
                        lisenceKey.add((char)randomValue);
                }
            }
        }
        int sp=0;
        for(var a : lisenceKey){
            lisenceCode += a;
            if(sp==3 || sp==7 || sp==11)
                lisenceCode += " - ";
            sp++;
        }
        lisenceKey.clear(); // Değişkene atama gerçekleştirdikten sonra diziyi temizliyorum bir sonraki oluşturma için.
        return lisenceCode;
    }
}

#7 İşlem sonunda, yeni bir kod oluşturulması için lisenceKey ismindeki ArrayList elemanlarını temizlettim ve değeri kullanıcıya Main sınıfında yazdığım kod ile gösterttim.

package com.company;

public class Main {
    public static void main(String[] args) {
        CreateCode createCode = new CreateCode();
        String ayrac = "---------------";
        System.out.println(ayrac + "\n<Oluşturulan Lisans Anahtarları>\n" + ayrac);
        for (int i = 0; i < 5; i++) {
            System.out.println("-> Oluşturulan " + (i + 1) + ". Lisans Anahtarı: " + createCode.newCode() + "\n" + ayrac);
        }
    }
}

Kod Çıktısı:

Java Collections Lisans Anahtarı Örneği

Java Collections Nedir sorusuna cevap aradığımız bu içeriğimizin sonuna geldik. Bir sonraki Java Collection Framework konu işleyişlerimiz hakkında bir fikriniz varsa ya da koleksiyon konusu ile alakalı aklınıza takılan bir soru işareti var ise aşağıda bulunan yorum yap kısmından benimle iletişime geçebilirsiniz.

Yazı gezinmesi

Exit mobile version