Java Dersleri 15 – Koleksiyon API (Collection API) Map

Map arayüzü anahtar-değer ikililerini bir arada tutmak için tasarlanmıştır. Matemetikteki fonksiyonların yazılım tarafında karşılığı olan map veri yapıları yazılım mimarisinde sıkça kullanılır. Örneğin yazılımımızda bulunan nesnelere birer kimlik numarası vererek bu numara ile nesne arasında anahtar-değer ilişkisi kurabiliriz. Böylelikle istediğimiz nesneye kimlik numarası aracılığıyla rahatlıkla erişebiliriz. Java Map arayüzü herhangi bir sıralama kısıtı getirmez. Map’e eklenen anahtar-değer ikililerinin eklendiği sırada kalacağı garanti değildir. Map arayüzünü gerçekleyen sınıflar arasında en bilineni HashMap sınıfıdır. HashMap verilen anahtardan hash fonksiyonu yardımıyla bir array indeksi oluşturur. Verilen değer de bu array indeksindeki belleğe yerleştirilir. Hash fonksiyonları çok temel matematiksel işlemler kullandıklarından hızlıdırlar. Dolayısıyla HashMap’de verilere erişim sabit zamanda olur. HashMap performansı için önemli olan iki parametre ilk kapasite ve yük faktörüdür. Varsayılan olarak ilk kapasite 11′dir. Yük faktörü HashMap koleksiyonumuzun herhangi bir anda maksimum doluluk oranını ölçer. Bu değer varsayılan olarak %75 dir. HashMap’de doluluk oranı bu değerin üzerine çıktığında kapasite arttırımına gidilerek değerler tekrar hash’lenir. Şimdi bir örnekle Map veri yapısına eleman eklemeyi ve geri almayı görelim :

package net.orhanbalci.collections;

import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;
import java.util.Set;

public class HashMapExample {

    public static void main(String[] args) {
        Map<Integer,String> m = new HashMap<Integer,String>();

        for (int i = 0; i < 10; i++) {
            m.put(i, String.valueOf(i) + " değer");
        }

        Set<Integer> ks = m.keySet();

        Iterator<Integer> i =  ks.iterator();

        while (i.hasNext()) {
            Integer key = i.next();
            System.out.print(key + " ");
            System.out.println(m.get(key));
        }
    }
}

Örneğimizde 11. satırda yeni bir HashMap nesnesi tanımlıyoruz. Java’nın generics özelliğini (şablon sınıflar) kullanılarak anahtarların veri tipini Integer değerlerin veri tipini ise String olarak belirttik. 14. satırda Map arayüzünün put() metodunu kullanarak HashMap koleksiyonumuza yeni eleman ekliyoruz. 24. satırda ise get() metodu yardımıyla HashMap koleksiyonumuzdan anahtar yardımıyla değerimize ulaşıyoruz.

Yukarıda bahsettiğimiz ilk kapasitenin performansa olan etkisini başka bir örnekte görelim :

        Map<Integer,String> m2 = new HashMap<Integer,String>(10);
        Map<Integer,String> m3 = new HashMap<Integer,String>(100);

        long time1 = System.currentTimeMillis();
        for (int k = 0; k < 10000; k++) {
            m2.put(k, String.valueOf(k) + " değer");
        }
        long time2 = System.currentTimeMillis();
        System.out.println(String.valueOf(time2-time1) + " milisaniye");

        time1 = System.currentTimeMillis();
        for (int k = 0; k < 10000; k++) {
            m3.put(k, String.valueOf(k) + " değer");
        }
        time2 = System.currentTimeMillis();
        System.out.println(String.valueOf(time2-time1) + " milisaniye");

Bu örneğimizde ise iki adet HashMap nesnesi oluşturuken ilk kapasiteyi yapılandırıcı metoda parametre olarak veriyoruz. m2 koleksiyonumuzun ilk kapasitesi 10 iken diğerinin ilk kapasitesi 100 dür. Her iki koleksiyona arka arkaya 10000 anahtar-değer ikilisi ekleyip performansı ölçtüğümüzde ilk kapasitesi 10 olan koleksiyona ekleme işlemi 46-47 milisaniye sürerken ilk kapasitesi 100 olan koleksiyona ekleme işlemi 19-20 milisaniye sürmekte. Görüldüğü üzere kapasite artırımına gitmek zaman kaybına neden olmaktadır.

İlgili Yazılar:

  1. Java Dersleri 13 – Koleksiyon API (Collection API) Listeler Koleksiyonlar yazılımımızda verinin hafızada nasıl tutulacağına karar veren soyut veri...
  2. Java Dersleri 14 – Koleksiyon API (Collection API) Kuyruklar (Queue) Koleksiyon API’sine ait diğer bir arayüz kuyruk (queue) arayüzüdür. Temel...
  3. Java Dersleri 12 – String İşlemleri Bu dersimizde Java’nın ve diğer dillerin en temel elemanlarından olan...
  4. Java Dersleri 6 – Arayüzler ve Gerçeklenmesi (Interface and Implementation) Nesne odaklı programlamada arayüzler sınıfların dış dünyaya açılan kapılarıdır. Bir...
  5. Java Dersleri 4 – Erişim Denetleyicileri (Access Modifiers) Bu dersimizde Java’nın metodlar ve sınıflar üzerinde erişim kurallarını...

  1. Merhaba, java yazılım ile ilgili googleda araştırma yaparken tesadüfen websitenize ulaştım. Web tasarım açısından ve arama motoru optimizasyonu açısından çok başarılı bulduğumu söyleyebilirim.Biraz daha teknik destek ile bu websitesi daha iyi noktalara ulaşacaktır diye düşünüyorum. :lol:

Fikrin geldiyse buraya yaz


[ Ctrl + Enter ]