Java'da IdentityHashMap sınıfı

Java'da IdentityHashMap sınıfı

Kimlik Hash Haritası uygular Harita arayüz kullanarak Karma tablo anahtarları (ve değerleri) karşılaştırırken nesne eşitliği yerine referans eşitliğini kullanmak. Bu sınıf genel amaçlı bir Harita uygulaması değildir. Bu sınıf Harita arayüzünü uygularken, nesneleri karşılaştırırken equals() yönteminin kullanılmasını zorunlu kılan Harita'nın genel sözleşmesini kasıtlı olarak ihlal eder. Bu sınıf, kullanıcının nesnelerin referans yoluyla karşılaştırılmasını gerektirdiğinde kullanılır. Ait olduğu java.util paket.

IdentityHashMap'in Özellikleri

  • == operatörünü kullandığı equals() yöntemini kullanmak yerine referans eşitliğini takip eder.
  • Senkronize değildir ve harici olarak senkronize edilmesi gerekir.
  • Yineleyiciler başarısız hızlı atışlardır EşzamanlıModifikasyonİstisnası yineleme sırasında değişiklik yapma girişiminde.
  • Bu sınıf, sistem kimliği karma işlevinin (System.identityHashCode(Object)) öğeleri klasörler arasında düzgün bir şekilde dağıttığını varsayarak temel işlemler (alma ve koyma) için sabit zamanlı performans sağlar. IdentityHashMap, hashCode() yöntemini kullanmaz, bunun yerine System.identityHashCode() yöntemini kullanır. Bu önemli bir farktır çünkü artık eşleme IdentityHashMap içinde depolandığında karma kodu muhtemelen değişecek olan değiştirilebilir nesneleri Harita'da anahtar olarak kullanabilirsiniz.

Beyanname:

genel sınıf IdentityHashMap AbstractMap'i genişletir Haritayı uygular Serileştirilebilir Klonlanabilir 
 

Burada k anahtar Nesne türüdür ve V Nesne türü değeridir.

Java'da IdentityHashMap, Harita arayüzünü uygulayan bir sınıftır. HashMap sınıfına benzer; temel fark, IdentityHashMap'in anahtarları karşılaştırırken nesne eşitliği yerine referans eşitliği kullanmasıdır.

HashMap, anahtarları karşılaştırmak için equals() yöntemini kullanırken IdentityHashMap, anahtarları karşılaştırmak için == operatörünü kullanır. Bu, bir IdentityHashMap'te iki anahtarın içerik açısından eşit olmak yerine yalnızca aynı nesne olmaları durumunda eşit kabul edildiği anlamına gelir.

Java'da IdentityHashMap'i nasıl kullanabileceğinize dair bir örnek:

Java
   import     java.util.IdentityHashMap  ;   public     class   Example     {      public     static     void     main  (  String  []     args  )     {      IdentityHashMap   <  String       Integer  >     identityHashMap     =     new     IdentityHashMap   <>  ();      identityHashMap  .  put  (  'A'       1  );      identityHashMap  .  put  (  new     String  (  'A'  )     2  );      System  .  out  .  println  (  identityHashMap  .  size  ());     // 2      System  .  out  .  println  (  identityHashMap  .  get  (  'A'  ));     // 1      }   }   

çıktı;

1

Java'daki IdentityHashMap sınıfı, anahtarları (ve değerleri) karşılaştırırken nesne eşitliği yerine referans eşitliğini kullanan Harita arayüzünün karma tablo tabanlı bir uygulamasıdır.

IdentityHashMap'i HashMap'e göre kullanmanın avantajları:

  1. Daha hızlı aramalar: IdentityHashMap karşılaştırma için referans eşitliğini kullandığından, nesne eşitliğini kullanan HashMap ile karşılaştırıldığında aramalar daha hızlıdır.
  2. Nesne örneklerini karşılaştırmak için kullanışlıdır: IdentityHashMap, nesne değerleri yerine nesne örneklerini karşılaştırmak istediğiniz durumlarda kullanışlıdır.

IdentityHashMap kullanmanın dezavantajları:

  1. Daha fazla bellek kullanır: IdentityHashMap, nesneye olan referansı saklaması gerektiğinden HashMap'e kıyasla daha fazla bellek kullanır.
  2. Tüm kullanım durumları için uygun değildir: IdentityHashMap tüm kullanım durumları için uygun değildir ve belirli durumlarda beklenmeyen davranışlara yol açabileceğinden dikkatli kullanılmalıdır.

 

Kimlik HiyerarşisiHashMap

Java

Uygular Serileştirilebilir Klonlanabilir Harita arayüzler ve uzanır Soyut Harita sınıf.

Örnek:

Java
   // Java code to demonstrate IdentityHashMap    import     java.util.Map  ;   import     java.util.HashMap  ;   import     java.util.IdentityHashMap  ;   public     class   IdentityHashMapExample      {      public     static     void     main  (  String  []     args  )         {      // creating an instance of IdentityHashMap      Map   <  String       String  >     ihm     =     new     IdentityHashMap   <>  ();      // Putting key and value pair      // in a IdentityHashMap Object      ihm  .  put  (  'ihmkey'    'ihmvalue'  );         ihm  .  put  (  new     String  (  'ihmkey'  )  'ihmvalue1'  );             // ihm.size() will print 2 since it       // compares the objects by reference      System  .  out  .  println  (  'Size of IdentityHashMap--'  +  ihm  .  size  ());          }   }   

Çıkış
Size of IdentityHashMap--2  

IdentityHashMap Oluşturucuları

Bir örneğini oluşturabiliriz Kimlik Hash Haritası iki şekilde:

IdentityHashMap  ihm = new IdentityHashMap (); (or) Map  hm = new IdentityHashMap (); 

1. IdentityHashMap():  Varsayılan beklenen maksimum boyuta sahip yeni bir boş kimlik karma haritası oluşturur. 

Kimlik Hash Haritası o = yeni IdentityHashMap ();

2. IdentityHashMap(int beklenenMaxSize):  Belirtilen beklenen maksimum boyuta sahip yeni bir boş harita oluşturur. 

Kimlik Hash Haritası ihm = new IdentityHashMap(int beklenenMaxSize);

3. IdentityHashMap(Harita m):  Belirtilen haritadaki anahtar-değer eşlemelerini içeren yeni bir kimlik karması haritası oluşturur.

Kimlik Hash Haritası ihm = new IdentityHashMap(Harita m);

IdentityHashMap'te Temel İşlemler

1. Öğe Ekleme

Bir IdentityHashMap'e eşleme eklemek veya eklemek için elimizdekiler koymak() Ve putAll() yöntemler. put() belirli bir anahtarı ve eşlediği değeri belirli bir haritaya ekleyebilir. Mevcut bir anahtar iletilirse önceki değerin yerini yeni değer alır. putAll() tüm elemanları, yani eşlemeleri bir haritadan diğerine kopyalar. 

Java
   // Java code to illustrate   // adding elements to IdentityHashMap   import     java.util.*  ;   public     class   AddingElementsToIdentityHashMap     {          public     static     void     main  (  String  []     args  )      {      // Creating an empty IdentityHashMap      Map   <  Integer       String  >     identity_hash      =     new     IdentityHashMap   <  Integer       String  >  ();      // Mapping string values to int keys      // using put() method      identity_hash  .  put  (  10       'Geeks'  );      identity_hash  .  put  (  15       '4'  );      identity_hash  .  put  (  20       'Geeks'  );      identity_hash  .  put  (  25       'Welcomes'  );      identity_hash  .  put  (  30       'You'  );      // Displaying the IdentityHashMap      System  .  out  .  println  (  'Initial Mappings are: '      +     identity_hash  );      // Inserting existing key along with new value      // previous value gets returned and stored in      // returned_value      String     returned_value      =     (  String  )  identity_hash  .  put  (  20       'All'  );      // Verifying the returned value      System  .  out  .  println  (  'Returned value is: '      +     returned_value  );      // Displaying the new map      System  .  out  .  println  (  'New map is: '     +     identity_hash  );      // Creating a new Identityhash map and copying      Map   <  Integer       String  >     new_Identityhash_map      =     new     IdentityHashMap   <  Integer       String  >  ();      new_Identityhash_map  .  putAll  (  identity_hash  );      // Displaying the final IdentityHashMap      System  .  out  .  println  (  'The new map: '      +     new_Identityhash_map  );      }   }   

Çıkış
Initial Mappings are: {30=You 10=Geeks 15=4 25=Welcomes 20=Geeks} Returned value is: Geeks New map is: {30=You 10=Geeks 15=4 25=Welcomes 20=All} The new map: {30=You 10=Geeks 15=4 25=Welcomes 20=All}  

2. Elemanların Kaldırılması
Eşlemeleri kaldırmak için kullandığımız kaldırmak() IdentityHashMap sınıfının yerleşik bir yöntemidir ve belirli bir anahtarın eşlemesini haritadan kaldırmak için kullanılır.

Java
   // Java code to illustrate removing   // elements from IdentityHashMap   import     java.util.*  ;      public     class   RemovingMappingsFromIdentityHashMap     {         public     static     void     main  (  String  []     args  )         {         // Creating an empty IdentityHashMap       Map   <  Integer       String  >     Identity_hash     =     new      IdentityHashMap   <  Integer       String  >  ();             // Mapping string values to int keys       Identity_hash  .  put  (  10       'Geeks'  );         Identity_hash  .  put  (  15       '4'  );         Identity_hash  .  put  (  20       'Geeks'  );         Identity_hash  .  put  (  25       'Welcomes'  );         Identity_hash  .  put  (  30       'You'  );         // Displaying the IdentityHashMap       System  .  out  .  println  (  'Initial Mappings are: '     +         Identity_hash  );         // Removing the existing key mapping       String     returned_value     =         (  String  )  Identity_hash  .  remove  (  20  );         // Verifying the returned value       System  .  out  .  println  (  'Returned value is: '     +         returned_value  );         // Displaying the new map       System  .  out  .  println  (  'New map is: '     +     Identity_hash  );         }      }      

Çıkış
Initial Mappings are: {30=You 10=Geeks 15=4 25=Welcomes 20=Geeks} Returned value is: Geeks New map is: {30=You 10=Geeks 15=4 25=Welcomes}  

3. Öğelere Erişim

Bir IdentityHashMap'in öğelerine şunu kullanarak erişebiliriz: elde etmek() yönteminin örneği aşağıda verilmiştir.

Java
   // Java code to illustrate the accessing   // elements from IdentityHashMap   import     java.util.*  ;   public     class   AccessingElementsFromIdentityHashMap     {      public     static     void     main  (  String  []     args  )      {      // Creating an empty IdentityHashMap      Map   <  Integer       String  >     identity_hash      =     new     IdentityHashMap   <  Integer       String  >  ();      // Mapping string values to int keys      identity_hash  .  put  (  10       'Geeks'  );      identity_hash  .  put  (  15       '4'  );      identity_hash  .  put  (  20       'Geeks'  );      identity_hash  .  put  (  25       'Welcomes'  );      identity_hash  .  put  (  30       'You'  );      // Displaying the IdentityHashMap      System  .  out  .  println  (  'Initial Mappings are: '      +     identity_hash  );      // Getting the value of 25      System  .  out  .  println  (  'The Value is: '      +     identity_hash  .  get  (  25  ));      // Getting the value of 10      System  .  out  .  println  (  'The Value is: '      +     identity_hash  .  get  (  10  ));          // Using keySet() to get the set view of keys       System  .  out  .  println  (  'The set is: '     +     identity_hash  .  keySet  ());             // Using entrySet() to get the set view       System  .  out  .  println  (  'The set is: '     +         identity_hash  .  entrySet  ());         }   }   

Çıkış
Initial Mappings are: {30=You 10=Geeks 15=4 25=Welcomes 20=Geeks} The Value is: Welcomes The Value is: Geeks The set is: [30 10 15 25 20] The set is: [30=You 10=Geeks 15=4 25=Welcomes 20=Geeks]  

4. Geçiş
Koleksiyon Çerçevesinin herhangi bir yapısı üzerinde geçiş yapmak için Iterator arayüzünü kullanabiliriz. Yineleyiciler tek tür veriyle çalıştığı için Giriş'i kullanırız < ? ? >iki ayrı türü uyumlu bir formatta çözümlemek için. Daha sonra next() yöntemini kullanarak IdentityHashMap'in öğelerini yazdırırız.

Java
   // Java code to illustrate the    // iterating over IdentityHashmap   import     java.util.*  ;   public     class   IteratingIdentityHashMap     {      public     static     void     main  (  String  []     args  )      {      // Creating an empty IdentityHashMap      IdentityHashMap   <  Integer       String  >     identity_hash      =     new     IdentityHashMap   <  Integer       String  >  ();      // Mapping string values to int keys      identity_hash  .  put  (  10       'Geeks'  );      identity_hash  .  put  (  15       '4'  );      identity_hash  .  put  (  20       'Geeks'  );      identity_hash  .  put  (  25       'Welcomes'  );      identity_hash  .  put  (  30       'You'  );      // Displaying the IdentityHashMap      System  .  out  .  println  (  'Initial Mappings are: '      +     identity_hash  );      // Create an Iterator over the      // IdentityHashMap      Iterator   <  IdentityHashMap  .  Entry   <  Integer       String  >     >      itr     =     identity_hash  .  entrySet  ().  iterator  ();      // The hasNext() method is used to check if there is      // a next element The next() method is used to      // retrieve the next element      while     (  itr  .  hasNext  ())     {      IdentityHashMap  .  Entry   <  Integer       String  >     entry      =     itr  .  next  ();      System  .  out  .  println  (  'Key = '     +     entry  .  getKey  ()      +     ' Value = '      +     entry  .  getValue  ());      }      }   }   

Çıkış
Initial Mappings are: {30=You 10=Geeks 15=4 25=Welcomes 20=Geeks} Key = 30 Value = You Key = 10 Value = Geeks Key = 15 Value = 4 Key = 25 Value = Welcomes Key = 20 Value = Geeks  

Senkronize Kimlik Hash Haritası

Birden fazla iş parçacığı bir kimlik karma haritasına aynı anda erişiyorsa ve iş parçacıklarından en az biri haritayı yapısal olarak değiştirirse, bunun harici olarak senkronize edilmesi gerekir. (Yapısal değişiklik, bir veya daha fazla eşlemeyi ekleyen veya silen herhangi bir işlemdir; yalnızca bir örneğin zaten içerdiği bir anahtarla ilişkili değeri değiştirmek yapısal bir değişiklik değildir.) Bu genellikle haritayı doğal olarak kapsülleyen bazı nesneler üzerinde senkronizasyon yapılarak gerçekleştirilir. Eğer böyle bir nesne mevcut değilse, harita şu şekilde 'sarılmalıdır': Collections.synchronizedMap yöntem. Haritaya kazara senkronize olmayan erişimi önlemek için bu en iyi şekilde oluşturma sırasında yapılır. 

Harita m = Collections.synchronizedMap(new IdentityHashMap(...));

IdentityHashMap Yöntemleri

    k – Haritadaki tuşların türü. V – Haritada eşlenen değerlerin türü.

YÖNTEM

TANIM

temizlemek() Bu haritadaki tüm eşlemeleri kaldırır.
klon() Bu kimlik karma haritasının yüzeysel bir kopyasını döndürür: anahtarların ve değerlerin kendileri kopyalanmaz.
içerirAnahtar?(Nesne anahtarı) Belirtilen nesne başvurusunun bu kimlik karma haritasında bir anahtar olup olmadığını test eder.
içerirDeğer?(Nesne değeri) Belirtilen nesne başvurusunun bu kimlik karma haritasındaki bir değer olup olmadığını test eder.
girişSet() Bir döndürür Ayarlamak Bu haritada yer alan eşlemelerin görünümü.
eşittir?(Nesne o) Belirtilen nesneyi eşitlik açısından bu haritayla karşılaştırır.
anladın mı?(Nesne anahtarı) Belirtilen anahtarın eşlendiği değeri döndürür veya bu eşleme anahtar için eşleme içermiyorsa null değerini döndürür.
hashCode() Bu haritanın karma kodu değerini döndürür.
isEmpty() Bu kimlik karması haritası anahtar/değer eşlemesi içermiyorsa true değerini döndürür.
anahtarSet() Bu haritada yer alan anahtarların kimliğe dayalı küme görünümünü döndürür.
koymak?(K tuşu V değeri) Belirtilen değeri bu kimlik karması haritasındaki belirtilen anahtarla ilişkilendirir.
hepsini koy?(Harita M) Belirtilen haritadaki tüm eşlemeleri bu haritaya kopyalar.
kaldırılsın mı?(Nesne anahtarı) Varsa, bu anahtarın eşlemesini bu eşlemeden kaldırır.
boyut() Bu kimlik karma haritasındaki anahtar/değer eşlemelerinin sayısını döndürür.
değerler() Bu haritada yer alan değerlerin Koleksiyon görünümünü döndürür.

Java.util.AbstractMap sınıfında bildirilen yöntemler

YÖNTEM

TANIM

 toString() Bu haritanın dize gösterimini döndürür.

Java.util.Map arayüzünde bildirilen yöntemler

YÖNTEM

TANIM

 hesaplansın mı?(K tuşu BiFunction yeniden eşleme işlevi) Belirtilen anahtar ve onun geçerli eşlenen değeri için bir eşleme hesaplamaya çalışır (veya geçerli eşleme yoksa null).
computeIfAbsent?(K tuşu İşlev haritalamaFonksiyonu) Belirtilen anahtar halihazırda bir değerle ilişkilendirilmemişse (veya null ile eşlenmişse), verilen eşleme işlevini kullanarak değerini hesaplamaya çalışır ve null olmadığı sürece onu bu eşlemeye girer.
computeIfPresent?(K tuşu BiFunction yeniden eşleme işlevi) Belirtilen anahtarın değeri mevcutsa ve null değilse, anahtara ve onun geçerli eşlenen değerine göre yeni bir eşleme hesaplamaya çalışır.
Her biri için mi?(İkiTüketici aksiyon) Tüm girişler işlenene veya eylem bir özel durum oluşturana kadar bu haritadaki her giriş için verilen eylemi gerçekleştirir.
getOrDefault?(Nesne anahtarı V defaultValue) Belirtilen anahtarın eşlendiği değeri veya bu eşleme anahtar için eşleme içermiyorsa defaultValue değerini döndürür.
birleştirilsin mi?(K tuşu V değeri BiFunction yeniden eşleme işlevi) Belirtilen anahtar zaten bir değerle ilişkilendirilmemişse veya null ile ilişkilendirilmişse, onu verilen null olmayan değerle ilişkilendirir.
putIfAbsent?(K tuşu V değeri) Belirtilen anahtar halihazırda bir değerle ilişkilendirilmemişse (veya null ile eşlenmişse), onu verilen değerle ilişkilendirir ve null değerini döndürür, aksi takdirde geçerli değeri döndürür.
kaldırılsın mı?(Nesne anahtarı Nesne değeri) Belirtilen anahtara ilişkin girişi yalnızca şu anda belirtilen değerle eşlenmişse kaldırır.
değiştirilsin mi?(K tuşu V değeri) Belirtilen anahtarın girdisini yalnızca şu anda bir değerle eşlenmişse değiştirir.
değiştirilsin mi?(K tuşu V eskiDeğer V yeniDeğer) Yalnızca şu anda belirtilen değerle eşlenmişse, belirtilen anahtarın girdisini değiştirir.
Tümü değiştirilsin mi?(BiFunction işlev) Tüm girişler işlenene veya işlev bir istisna atana kadar, her girişin değerini, o girişte verilen işlevin çağrılmasının sonucuyla değiştirir.

IdentityHashMap vs  Hash Haritası

  • IdentityHashMap, anahtarları ve değerleri karşılaştırmak için '==' eşitlik operatörünü kullanırken HashMap, Harita içindeki anahtarları ve değerleri karşılaştırmak için equals yöntemini kullanır.
  • IdentityHashMap equals() kullanmadığından, pahalı equals()'a sahip bir nesne için HashMap'ten nispeten daha hızlıdır.
  • IdentityHashMap equals()'a dayanmadığı için anahtarların değişmez olmasını gerektirmez.

Aşağıdaki program IdentityHashMap ve HashMap uygulaması arasındaki farkı göstermektedir.

Java
   // Java code to demonstrate IdentityHashMap and   // illustration of how it is different from HashMap    import     java.util.Map  ;   import     java.util.HashMap  ;   import     java.util.IdentityHashMap  ;   public     class   IdentityHashMapExample      {      public     static     void     main  (  String  []     args  )         {      // Creating HashMap and IdentityHashMap objects      Map   <  String       String  >     hm     =     new     HashMap   <>  ();      Map   <  String       String  >     ihm     =     new     IdentityHashMap   <>  ();      // Putting key and value in HashMap and IdentityHashMap Object      hm  .  put  (  'hmkey'    'hmvalue'  );      hm  .  put  (  new     String  (  'hmkey'  )  'hmvalue1'  );         ihm  .  put  (  'ihmkey'    'ihmvalue'  );         ihm  .  put  (  new     String  (  'ihmkey'  )  'ihmvalue1'  );             // Print Size of HashMap and WeakHashMap Object      // hm.size() will print 1 since it compares the objects logically      // and both the keys are same      System  .  out  .  println  (  'Size of HashMap is : '  +  hm  .  size  ());          // ihm.size() will print 2 since it compares the objects by reference      System  .  out  .  println  (  'Size of IdentityHashMap is : '  +  ihm  .  size  ());          }   }   

Çıkış
Size of HashMap is : 1 Size of IdentityHashMap is : 2  


IdentityHashMap, Java'da Harita arayüzünü uygulayan ve anahtarları karşılaştırmak için referans eşitliğini kullanan bir sınıftır. Normal HashMap'e benzer ancak anahtarları karşılaştırmak için equals() yöntemi yerine == operatörünü kullanır. Bu, aynı içeriğe sahip ancak farklı nesne referanslarına sahip iki anahtarın bir IdentityHashMap'te farklı anahtarlar olarak ele alınacağı anlamına gelir.

IdentityHashMap'in Java'da nasıl kullanılacağına dair bir örnek:

 

Java
   import     java.util.IdentityHashMap  ;   public     class   IdentityHashMapExample     {      public     static     void     main  (  String  []     args  )     {      IdentityHashMap   <  String       Integer  >     map     =     new     IdentityHashMap   <>  ();      // Add key-value pairs to the map      String     key1     =     new     String  (  'key'  );      String     key2     =     new     String  (  'key'  );      map  .  put  (  key1       1  );      map  .  put  (  key2       2  );      // Get values from the map using the same and different keys      System  .  out  .  println  (  map  .  get  (  key1  ));     // Output: 1      System  .  out  .  println  (  map  .  get  (  key2  ));     // Output: 2      System  .  out  .  println  (  map  .  get  (  new     String  (  'key'  )));     // Output: null      }   }   

Çıkış
1 2 null  

Bu örnekte, String anahtarlarını Tamsayı değerleriyle eşleştiren bir IdentityHashMap oluşturuyoruz. Aynı içeriğe sahip iki farklı String nesnesini kullanarak haritaya iki anahtar/değer çifti ekliyoruz. Daha sonra aynı ve farklı String nesnelerini kullanarak haritadan değerleri alırız. Aynı içeriğe sahip iki farklı anahtarı kullanarak haritadan değer alabileceğimizi ancak aynı içeriğe sahip ancak farklı bir nesne referansı olan bir String nesnesini kullanarak değer alamadığımızı bulduk.

IdentityHashMap'in normal HashMap'ten biraz farklı bir davranışa sahip olduğunu ve genellikle yalnızca referans eşitliğinin önemli olduğu belirli durumlarda yararlı olduğunu unutmayın. Çoğu durumda düzenli bir HashMap yeterli ve daha uygundur.

 

Test Oluştur