Клас IdentityHashMap в Java

Клас IdentityHashMap в Java

The IdentityHashMap инструменти Карта използване на интерфейс Хеш таблица използване на референтно равенство вместо обектно равенство при сравняване на ключове (и стойности). Този клас не е реализация на карта с общо предназначение. Въпреки че този клас имплементира интерфейса на Map, той умишлено нарушава общия договор на Map, който изисква използването на метода equals() при сравняване на обекти. Този клас се използва, когато потребителят изисква обектите да бъдат сравнени чрез справка. Принадлежи на java.util пакет.

Характеристики на IdentityHashMap

  • Той следва референтно равенство, вместо да използва метода equals(), използва оператора ==.
  • Не е синхронизиран и трябва да се синхронизира външно.
  • Итераторите се хвърлят бързо ConcurrentModificationException в опит за промяна по време на повторение.
  • Този клас осигурява производителност в постоянно време за основните операции (вземане и поставяне), като се приеме, че хеш функцията за идентичност на системата (System.identityHashCode(Object)) разпръсква правилно елементите между кофите. IdentityHashMap не използва метода hashCode(), вместо това използва метода System.identityHashCode(). Това е значителна разлика, защото сега можете да използвате променливи обекти като ключ в Map, чийто хеш код е вероятно да се промени, когато картографирането се съхранява в IdentityHashMap.

Декларация:

публичен клас IdentityHashMap разширява AbstractMap внедрява Map Възможност за сериализиране, възможност за клониране 
 

тук К е ключовият тип обект и V е стойността Тип обект.

В Java IdentityHashMap е клас, който имплементира интерфейса Map. Той е подобен на класа HashMap, като основната разлика е, че IdentityHashMap използва референтно равенство вместо равенство на обекти при сравняване на ключове.

Докато HashMap използва метода equals() за сравняване на ключовете, IdentityHashMap използва оператора == за сравняване на ключовете. Това означава, че в IdentityHashMap два ключа се считат за равни тогава и само ако са един и същ обект, а не са равни по отношение на тяхното съдържание.

Ето пример за това как можете да използвате IdentityHashMap в Java:

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      }   }   

изход;

1

Класът IdentityHashMap в Java е базирана на хеш таблица имплементация на интерфейса Map, която използва референтно равенство вместо обектно равенство при сравняване на ключове (и стойности).

Предимства на използването на IdentityHashMap пред HashMap:

  1. По-бързи търсения: Тъй като IdentityHashMap използва референтно равенство за сравнение, той е по-бърз за търсения в сравнение с HashMap, който използва обектно равенство.
  2. Полезно за сравняване на екземпляри на обекти: IdentityHashMap е полезно в ситуации, в които искате да сравните екземпляри на обекти, а не стойности на обекти.

Недостатъци на използването на IdentityHashMap:

  1. Използва повече памет: IdentityHashMap използва повече памет в сравнение с HashMap, тъй като трябва да съхранява препратката към обекта.
  2. Не е подходящ за всички случаи на употреба: IdentityHashMap не е подходящ за всички случаи на употреба и трябва да се използва с повишено внимание, тъй като може да доведе до неочаквано поведение в определени ситуации.

 

Йерархията на IdentityHashMap

IdentityHashMap в Java

Той изпълнява Може да се сериализира Може да се клонира Карта интерфейси и разширения Абстрактна карта клас.

Пример:

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  ());          }   }   

Изход
Size of IdentityHashMap--2  

Конструктори на IdentityHashMap

Можем да създадем екземпляр на IdentityHashMap по два начина:

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

1. IdentityHashMap():  Създава нова празна хеш карта на идентичност с очакван максимален размер по подразбиране. 

IdentityHashMap него = нова IdentityHashMap ();

2. IdentityHashMap(int очакван максимален размер):  Конструира нова празна карта с посочения очакван максимален размер. 

IdentityHashMap ihm = нова IdentityHashMap(int очакван максимален размер);

3. IdentityHashMap (Карта m):  Конструира нова хеш карта на идентичност, съдържаща съпоставянията ключ-стойност в указаната карта.

IdentityHashMap ihm = нова IdentityHashMap(Карта m);

Основни операции върху IdentityHashMap

1. Добавяне на елементи

За да вмъкнете или добавите картографиране в IdentityHashMap, който имаме постави () и putAll() методи. put() може да вмъкне конкретен ключ и стойността, която картографира в определена карта. Ако бъде подаден съществуващ ключ, предишната стойност се заменя с новата стойност. putAll() копира всички елементи, т.е. съпоставянията от една карта в друга. 

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  );      }   }   

Изход
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. Премахване на елементи
За да премахнем съпоставянията, които използваме премахване () вграден метод на клас IdentityHashMap и се използва за премахване на картографирането на всеки конкретен ключ от картата.

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  );         }      }      

Изход
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. Достъп до елементите

Можем да имаме достъп до елементите на IdentityHashMap, като използваме получи() метод примерът за това е даден по-долу.

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  ());         }   }   

Изход
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. Траверсиране
Можем да използваме интерфейса на Iterator, за да преминем през всяка структура на Collection Framework. Тъй като итераторите работят с един тип данни, ние използваме Entry < ? ? >за разделяне на двата отделни типа в съвместим формат. След това с помощта на метода next() отпечатваме елементите на IdentityHashMap.

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  ());      }      }   }   

Изход
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  

Синхронизирана IdentityHashMap

Ако множество нишки имат достъп до хеш карта на идентичност едновременно и поне една от нишките модифицира картата структурно, тя трябва да бъде синхронизирана външно. (Структурна модификация е всяка операция, която добавя или изтрива едно или повече съпоставяния; просто промяната на стойността, свързана с ключ, който екземплярът вече съдържа, не е структурна модификация.) Това обикновено се постига чрез синхронизиране на някакъв обект, който естествено капсулира картата. Ако не съществува такъв обект, картата трябва да бъде "обвита" с помощта на Collections.synchronizedMap метод. Това се прави най-добре по време на създаване, за да се предотврати случаен несинхронизиран достъп до картата. 

Карта m = Collections.synchronizedMap(нова IdentityHashMap(...));

Методи на IdentityHashMap

    К – Видът на ключовете в картата. V – Типът стойности, картографирани в картата.

МЕТОД

ОПИСАНИЕ

ясно() Премахва всички съпоставяния от тази карта.
клонинг() Връща плитко копие на тази хеш карта на идентичността: самите ключове и стойности не се клонират.
съдържа ключ? (обектен ключ) Тества дали указаната препратка към обект е ключ в тази хеш карта на самоличността.
съдържа стойност? (стойност на обект) Тества дали указаната препратка към обект е стойност в тази хеш карта на самоличността.
enterSet() Връща a Комплект изглед на съпоставянията, съдържащи се в тази карта.
е равно? (Обект o) Сравнява посочения обект с тази карта за равенство.
get? (обектен ключ) Връща стойността, на която е съпоставен посоченият ключ, или нула, ако тази карта не съдържа съпоставяне за ключа.
hashCode() Връща стойността на хеш кода за тази карта.
isEmpty() Връща true, ако тази хеш карта на самоличността не съдържа съпоставяния ключ-стойност.
keySet() Връща базиран на самоличност набор изглед на ключовете, съдържащи се в тази карта.
постави? (K ключ V стойност) Свързва посочената стойност с посочения ключ в тази хеш карта на самоличността.
putAll?(Карта м) Копира всички съпоставяния от посочената карта към тази карта.
премахване? (обектен ключ) Премахва картографирането за този ключ от тази карта, ако има такова.
размер () Връща броя на съпоставянията ключ-стойност в тази хеш карта на самоличността.
стойности() Връща изглед на колекция от стойностите, съдържащи се в тази карта.

Методи, декларирани в клас java.util.AbstractMap

МЕТОД

ОПИСАНИЕ

 toString() Връща низово представяне на тази карта.

Методи, декларирани в интерфейса java.util.Map

МЕТОД

ОПИСАНИЕ

 изчисли? (клавиш K BiFunction remappingFunction) Опитва се да изчисли съпоставяне за посочения ключ и текущата му съпоставена стойност (или нула, ако няма текущо съпоставяне).
computeIfAbsent?(К клавишна функция mappingFunction) Ако посоченият ключ все още не е свързан със стойност (или е съпоставен с null), се опитва да изчисли стойността му с помощта на дадената функция за съпоставяне и го въвежда в тази карта, освен ако не е null.
computeIfPresent?(К ключ BiFunction remappingFunction) Ако стойността за посочения ключ е налице и не е null, се опитва да изчисли ново съпоставяне, дадено на ключа и текущата му съпоставена стойност.
forEach?(BiConsumer действие) Извършва даденото действие за всеки запис в тази карта, докато всички записи бъдат обработени или действието хвърли изключение.
getOrDefault?(Обектен ключ V defaultValue) Връща стойността, към която е съпоставен посоченият ключ, или defaultValue, ако тази карта не съдържа съпоставяне за ключа.
сливане?(К ключ V стойност BiFunction remappingFunction) Ако указаният ключ все още не е свързан със стойност или е свързан с null, той го свързва с дадената не-null стойност.
putIfAbsent? (К ключ V стойност) Ако посоченият ключ все още не е свързан със стойност (или е съпоставен с null), го свързва с дадената стойност и връща null, иначе връща текущата стойност.
премахнете? (Ключ на обект Стойност на обект) Премахва записа за посочения ключ само ако в момента е съпоставен с указаната стойност.
замени? (К ключ V стойност) Заменя записа за посочения ключ само ако в момента е съпоставен с някаква стойност.
замени? (K ключ V oldValue V newValue) Заменя записа за посочения ключ само ако текущо е съпоставен с указаната стойност.
замениВсички?(Двуфункция функция) Заменя стойността на всеки запис с резултата от извикването на дадена функция върху този запис, докато всички записи бъдат обработени или функцията хвърли изключение.

IdentityHashMap срещу  HashMap

  • IdentityHashMap използва оператора за равенство '==' за сравняване на ключове и стойности, докато HashMap използва метода equals за сравняване на ключове и стойности в Map.
  • Тъй като IdentityHashMap не използва equals(), той е сравнително по-бърз от HashMap за обект със скъп equals().
  • IdentityHashMap не изисква ключовете да бъдат неизменни, тъй като не се разчита на equals().

Програмата по-долу илюстрира разликата между внедряването на IdentityHashMap и HashMap.

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  ());          }   }   

Изход
Size of HashMap is : 1 Size of IdentityHashMap is : 2  


IdentityHashMap е клас в Java, който имплементира интерфейса Map и използва референтно равенство за сравняване на ключове. Той е подобен на обикновен HashMap, но използва оператора == за сравняване на ключове вместо метода equals(). Това означава, че два ключа с едно и също съдържание, но различни препратки към обекти ще бъдат третирани като отделни ключове в IdentityHashMap.

Ето пример за това как да използвате IdentityHashMap в Java:

 

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      }   }   

Изход
1 2 null  

В този пример създаваме IdentityHashMap, който съпоставя ключовете String към стойностите на Integer. Добавяме две двойки ключ-стойност към картата, като използваме два различни String обекта, които имат едно и също съдържание. След това извличаме стойности от картата, използвайки същите и различни String обекти. Откриваме, че можем да извлечем стойности от картата, като използваме двата различни ключа, които имат едно и също съдържание, но не можем да извлечем стойност, използвайки String обект, който има същото съдържание, но е референция на различен обект.

Обърнете внимание, че IdentityHashMap има малко по-различно поведение от обикновения HashMap и обикновено е полезен само в определени ситуации, когато равенството на референтните данни е важно. В повечето случаи обикновен HashMap е достатъчен и по-подходящ.

 

Създаване на тест