Java HashMap Nedir ? (Key Value İlişkisi) Ders 1:

Diğer proğramla dillerinden hakim olduğumu key value ilişkisini yönetebileceğimiz bir yapı.Bu yapıda verileri key value ilişkisi ile depolayabiliriz.Aslında key value ilişkisi ile verileri yönetmenin farklı yolları var mesela 2 farklı dizi yapıp bu şekilde bir sistemde yapabilirim ama adamlar zaten biz uğraşmayalım diye hashmap diye bişi geliştirmişler o yüzden hashmap olmasaydı evet bunu kullanabilirdik.Öncelikle hashmap kullanmak için porjeimize java.util.hashmap kütüphanesini ekliyoruz ve ardından başlıyoruz.

  • Öncelikle hashmap yapısında hangi türde veri ekleyeceksem onları belirttim.Soldaki değişken key yapsını sağ tarafta kı ise value olduğunu belirtiyor.Ben burada String ve İnt veri tipini kullandım.
  • Ardından put özelliği ile verilerimi key value olarak ekledim.
  • MymapSize ile map büyüklüğümü görebilirim.Burada tutulan her bir key value 1 değerine sahiptir.Key ve value yapısı bir bütün olarak tutulur bu yüzden 3 değerini aldım.

Bir Key Değerinin Value Değerini Erişmek

  • ContainsKey ile hangi key üzerinde erişmek istiyorsam onu if blogu kontrol ettim ve key degerim izmir değerine eşit ise true bir değer döndürdü.
  • Ardından madem true bir değer döndürdü ve ardından mymap üzerinde get komutu ile “izmir” key değerininin karşılığında ki değer myınt degerine atadım .
  • Ardından bu değeri myınt isimli değişkenime atadım ve ekrana bastım.

HashMap Özellikleri

  • Hashmap üzerinde bir value ya erişmek için onun keyini bilmek gerekir.Hashmap kendi içinde hashing diye bir teknik kullanıyor .Hashhing ise büyük bir string değer aynı string değerini temsil edecek şekilde dönüştürme işlemidir.Daha kısa bir değere dönüşünce aramalarda işimizi kolaylaştırır.
  • Hashmap aslında Map arayüzünün uygulamasını sağlayan somut bir yapıdır.
  • Hashmap yinelenen keylere izin vermez.Ancak yinelenen value sistemine izin verir.Bu durumda tek bir anahtarın 1 den fazla değer içeremeyecegini ancak 1 den fazla anahtarın tek bir değer içerebileceğini anlamına gelir.
  • Hashmap full bir anahtara izin verebilir ancak yalnız bir kez ve birden çok boş deger için geçerli.
  • Hashmap haritanın sırasını ilişkin garanti vermez özellikle sıranın zaman içinde sabit kalacağını garanti etmez.Taslak olarak hashtable’a benzer ancak senkronize edilememiştir.

Hashmap Yapısı

Hashmap dahili olarak bir node dizisi içerir ve bir dügüm 4 alan içeren bir sınıf olarak temsil eder.

  1. Int
  2. K anahtarı
  3. V degeri
  4. Sonraki dügüm

Düğümün kendi nesnesinin bir referans içerdiği görülebilir .Yani bağlantılı bir liste bu şeklinde olabilir.

Daha Performanslı Bir Hashmap

Performans parametresi 2 şeye bağlıdır.Başlangıç kapasitesi ve yük faktörüdür.

İlk kapasite:Hashmap ilk oluşturulduğunda belli bir kapasiteye sahiptir.Yani hashmağ soyutlaştırıldıgı zaman tutabileceği grup sayısı yani.Java başlangıçta 2 ^ 4 = 16’dır, yani 16 anahtar-değer çifti tutabilir.

yük faktörü:Sonrasında hashmap kapasitesi arttırılacağı kapasitenin yüzde değeridir.Javada varsayılan 0.75f dir.Yanı yenıden yükleme kapasitenin %75 i dolduktan sonra gerçekleşir.

Eşik:Yük faktörü ve başlangıç kapasitesinin ürünüdür.Java’da varsayılan olarak (16 * 0.75 = 12) şeklindedir. Yani, yeniden düzenleme, HashMap’e 12 anahtar / değer çifti eklendikten sonra gerçekleşir.

Yeniden düzenleme – Eşik değerine ulaştıktan sonra HashMap’in kapasitesini iki katına çıkarma işlemidir. Java’da, HashMap şu sırayla (varsayılan olarak) yeniden çalışmaya devam eder – 2 ^ 4, 2 ^ 5, 2 ^ 6, 2 ^ 7,…

Başlangıç ​​kapasitesi daha yüksek tutulursa, yeniden işleme asla yapılmayacaktır. Ancak onu daha yüksek tutmak, yinelemenin zaman karmaşıklığını artırır. Bu yüzden performansı artırmak için çok akıllıca seçilmelidir. Başlangıç ​​kapasitesini ayarlamak için beklenen değer sayısı dikkate alınmalıdır. En çok tercih edilen yük faktörü değeri 0.75 olup, zaman ve mekan maliyetleri arasında iyi bir anlaşma sağlar. Yük faktörünün değeri 0 ile 1 arasında değişir.

Not: Java 8’den itibaren Java, zincirleme için bağlantılı liste yerine Kendi Kendini Dengeleme BST’yi kullanmaya başladı. Kendini dengelemenin avantajı, en kötü durumu (her anahtar aynı yuvaya eşlendiğinde) arama süresini O (Log n) olarak elde etmemizdir.

Senkroize HashMap

HashMap’in senkronize olmadığı, yani birden fazla iş parçacığının aynı anda erişebileceği söylendiği gibi. Eğer birden fazla evre bu sınıfa eşzamanlı olarak erişiyorsa ve en az bir evre onu yapısal olarak işliyorsa, o zaman onu harici olarak senkronize etmek gerekir. Haritayı çevreleyen bir nesnenin senkronize edilmesiyle yapılır. Böyle bir nesne yoksa, HashMap’i eşitlemek ve yanlışlıkla eşitlenmemiş erişimi önlemek için Collections.synchronizedMap () etrafına sarılabilir. Aşağıdaki örnekte olduğu gibi:

Map m = Collections.synchronizedMap(new HashMap(...));

Bu sınıfın yineleyicileri, yineleyicinin yaratılmasından sonra herhangi bir yapı değişikliği yapılırsa, yineleyicinin kaldırma yöntemi dışında herhangi bir şekilde başarısız olur. Yineleyici arızasında, ConcurrentModificationException oluşturur.

HashMap’te Oluşturucular

HashMap 4 yapıcı sağlar ve her birinin erişim değiştiricisi geneldir:

  1. HashMap (): Başlangıç ​​kapasitesi 16 ve yük faktörü 0.75 olan bir HashMap örneği oluşturan varsayılan yapıcıdır.
  2. HashMap (int ilk kapasite): Belirtilen başlangıç ​​kapasitesi ve 0.75 yük faktörü ile bir HashMap örneği oluşturur.
  3. HashMap (int ilk kapasite, float loadFactor): Belirtilen başlangıç ​​kapasitesi ve belirtilen yük faktörüne sahip bir HashMap örneği oluşturur.
  4. HashMap (Map map): Belirtilen haritayla aynı eşlemelere sahip HashMap örneğini oluşturur.

HashMap’in zaman karmaşıklığı

HashMap, temel işlemler için sabit zaman karmaşıklığı sağlar, hash işlevi düzgün yazılırsa ve öğeleri kovalar arasında düzgün bir şekilde dağıtırsa al ve koy. HashMap üzerinde yineleme, HashMap’in kapasitesine ve bir dizi anahtar-değer çiftine bağlıdır. Temel olarak kapasite + boyut ile doğru orantılıdır. Kapasite, HashMap’teki paket sayısıdır. Bu nedenle, başlangıçta HashMap’te çok sayıda tutmak iyi bir fikir değildir.

Bazı HashMap Mehtodları

  1. void clear(): Used to remove all mappings from a map.
  2. boolean containsKey(Object key): Used to return True if for a specified key, mapping is present in the map.
  3. boolean containsValue(Object value): Used to return true if one or more key is mapped to a specified value.
  4. Object clone(): It is used to return a shallow copy of the mentioned hash map.
  5. boolean isEmpty(): Used to check whether the map is empty or not. Returns true if the map is empty.
  6. Set entrySet(): It is used to return a set view of the hash map.
  7. Object get(Object key): It is used to retrieve or fetch the value mapped by a particular key.
  8. Set keySet(): It is used to return a set view of the keys.
  9. int size(): It is used to return the size of a map.
  10. Object put(Object key, Object value): It is used to insert a particular mapping of key-value pair into a map.
  11. putAll(Map M): It is used to copy all of the elements from one map into another.
  12. Object remove(Object key): It is used to remove the values for any particular key in the Map.
  13. Collection values(): It is used to return a Collection view of the values in the HashMap.
  14. compute(K key, BiFunction<K, V> remappingFunction): This method Attempts to compute a mapping for the specified key and its current mapped value (or null if there is no current mapping).
  15. computeIfAbsent(K key, Function<K> mappingFunction): This method If the specified key is not already associated with a value (or is mapped to null), attempts to compute its value using the given mapping function and enters it into this map unless null.
  16. computeIfPresent(K key, BiFunction<K, V> remappingFunction): This method If the value for the specified key is present and non-null, attempts to compute a new mapping given the key and its current mapped value.
  17. forEach(BiConsumer<K, V> action): This method Performs the given action for each entry in this map until all entries have been processed or the action throws an exception.
  18. getOrDefault(Object key, V defaultValue): This method returns the value to which the specified key is mapped, or defaultValue if this map contains no mapping for the key.
  19. merge(K key, V value, BiFunction<K, V> remappingFunction): This method If the specified key is not already associated with a value or is associated with null, associates it with the given non-null value.
  20. putIfAbsent(K key, V value): This method If the specified key is not already associated with a value (or is mapped to null) associates it with the given value and returns null, else returns the current value.
  21. replace(K key, V value): This method replaces the entry for the specified key only if it is currently mapped to some value.
  22. replace(K key, V oldValue, V newValue): This method replaces the entry for the specified key only if currently mapped to the specified value.
  23. replaceAll(BiFunction<K, V> function): This method replaces each entry’s value with the result of invoking the given function on that entry until all entries have been processed or the function throws an exception.

Leave a Reply

*