logo

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 IdentityHashMapAbstractMap'i genişletirHaritayı uygularSerileş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.

Shilpa Shetty

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'da IdentityHashMap' src='//techcodeview.com/img/misc/68/identityhashmap-class-in-java.webp' title=

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. 

tarayıcı java'yı içe aktar

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ı

java kırpma dizesi

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?(HaritaM) 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 BiFunctionyeniden 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 İşlevharitalamaFonksiyonu)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 BiFunctionyeniden 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üketiciaksiyon)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 BiFunctionyeniden 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?(BiFunctioniş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.

bash'ta if ve else

 

Test Oluştur