ИдентитиХасхМап класа у Јави

ИдентитиХасхМап класа у Јави

Тхе ИдентитиХасхМап имплементира Мапа интерфејс користећи Хасхтабле користећи референтну једнакост уместо једнакости објеката када упоређујемо кључеве (и вредности). Ова класа није имплементација Мапе опште намене. Иако ова класа имплементира интерфејс Мапе, она намерно крши Мап-ин општи уговор који налаже коришћење методе екуалс() приликом поређења објеката. Ова класа се користи када корисник захтева да се објекти пореде преко референце. То припада јава.утил пакет.

Карактеристике ИдентитиХасхМап-а

  • Следи референтну једнакост уместо да користи метод екуалс() и користи == оператор.
  • Није синхронизовано и мора бити синхронизовано споља.
  • Итератори су брзо бацање ЦонцуррентМодифицатионЕкцептион у покушају да се модификује током понављања.
  • Ова класа обезбеђује перформансе у константном времену за основне операције (доби и стави) под претпоставком да хеш функција системског идентитета (Систем.идентитиХасхЦоде(Објецт)) правилно распршује елементе међу сегментима. ИдентитиХасхМап не користи метод хасхЦоде() уместо тога користи метод Систем.идентитиХасхЦоде(). Ово је значајна разлика јер сада можете да користите променљиве објекте као кључ у мапи чији ће се хеш код вероватно променити када се мапирање ускладишти унутар ИдентитиХасхМап-а.

Декларација:

јавна класа ИдентитиХасхМап проширује АбстрацтМап имплементира Мап Сериализабле Цлонеабле 
 

Ево К је кључни тип објекта и В је вредност Тип објекта.

У Јави ИдентитиХасхМап је класа која имплементира интерфејс мапе. Слично је класи ХасхМап са главном разликом у томе што ИдентитиХасхМап користи референтну једнакост уместо једнакости објеката када упоређује кључеве.

Док ХасхМап користи метод екуалс() за упоређивање кључева, ИдентитиХасхМап користи == оператор за упоређивање кључева. То значи да се у ИдентитиХасхМап-у два кључа сматрају једнакима ако и само ако су исти објекат, а не једнаки у смислу свог садржаја.

Ево примера како можете да користите ИдентитиХасхМап у Јави:

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

Класа ИдентитиХасхМап у Јави је имплементација интерфејса Мап заснована на хеш табели која користи референтну једнакост уместо једнакости објеката када упоређује кључеве (и вредности).

Предности коришћења ИдентитиХасхМап у односу на ХасхМап:

  1. Брже тражење: Пошто ИдентитиХасхМап користи референтну једнакост за поређење, брже је тражење у поређењу са ХасхМап-ом који користи једнакост објеката.
  2. Корисно за поређење инстанци објеката: ИдентитиХасхМап је користан у ситуацијама у којима желите да упоредите инстанце објеката, а не вредности објеката.

Недостаци коришћења ИдентитиХасхМап-а:

  1. Користи више меморије: ИдентитиХасхМап користи више меморије у поређењу са ХасхМап-ом јер треба да ускладишти референцу на објекат.
  2. Није погодно за све случајеве употребе: ИдентитиХасхМап није погодан за све случајеве употребе и треба га користити са опрезом јер може довести до неочекиваног понашања у одређеним ситуацијама.

 

Хијерархија ИдентитиХасхМап-а

ИдентитиХасхМап у Јави

То имплементира Сериализабле Цлонеабле Мапа интерфејси и проширења АбстрацтМап класе.

Пример:

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  ihm = new IdentityHashMap (); (or) Map  hm = new IdentityHashMap (); 

1. ИдентитиХасхМап():  Конструише нову празну хеш мапу идентитета са подразумеваном очекиваном максималном величином. 

ИдентитиХасхМап он = нова ИдентитиХасхМап ();

2. ИдентитиХасхМап(инт очекиванаМакСизе):  Конструише нову празну мапу са наведеном очекиваном максималном величином. 

ИдентитиХасхМап ихм = нев ИдентитиХасхМап(инт екпецтМакСизе);

3. ИдентитиХасхМап(Мапа м):  Конструише нову хеш мапу идентитета која садржи пресликавања кључ/вредност у наведеној мапи.

ИдентитиХасхМап ихм = нев ИдентитиХасхМап(Мап м);

Основне операције на ИдентитиХасхМап-у

1. Додавање елемената

Да бисте уметнули или додали мапирање у ИдентитиХасхМап који имамо стави() и ставиСве() методе. пут() може да убаци одређени кључ и вредност коју мапира у одређену мапу. Ако се проследи постојећи кључ, претходна вредност се замењује новом вредношћу. путАлл() копира све елементе, тј. пресликавања из једне мапе у другу. 

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. Уклањање елемената
За уклањање мапирања користимо уклони() уграђени метод класе ИдентитиХасхМап и користи се за уклањање мапирања било ког одређеног кључа са мапе.

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. Приступ елементима

Можемо приступити елементима ИдентитиХасхМап користећи гет() метод, пример овога је дат у наставку.

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. Траверсинг
Можемо да користимо интерфејс Итератор за прелазак преко било које структуре оквира колекције. Пошто итератори раде са једном врстом података, користимо Ентри < ? ? >да бисте раздвојили два одвојена типа у компатибилан формат. Затим помоћу методе нект() штампамо елементе ИдентитиХасхМап-а.

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  

Синцхронизед ИдентитиХасхМап

Ако више нити истовремено приступа хеш мапи идентитета и барем једна од нити структурно модификује мапу, она мора бити синхронизована споља. (Структурна модификација је свака операција која додаје или брише једно или више мапирања; само промена вредности повезане са кључем који инстанца већ садржи није структурна модификација.) Ово се обично постиже синхронизацијом на неком објекту који природно инкапсулира мапу. Ако такав објекат не постоји, мапу треба 'умотати' користећи Цоллецтионс.синцхронизедМап методом. Ово је најбоље урадити у време креирања како би се спречио случајни несинхронизовани приступ мапи. 

Мапа м = Цоллецтионс.синцхронизедМап(нев ИдентитиХасхМап(...));

Методе ИдентитиХасхМап-а

    К – Тип кључева на мапи. В – Тип вредности мапираних на мапи.

МЕТОДА

ОПИС

цлеар() Уклања сва мапирања са ове мапе.
клон () Враћа плитку копију ове хеш мапе идентитета: сами кључеви и вредности нису клонирани.
садржиКеи? (Кључ објекта) Тестира да ли је наведена референца објекта кључ у овој хеш мапи идентитета.
цонтаинсВалуе? (вредност објекта) Тестира да ли је наведена референца објекта вредност у овој хеш мапи идентитета.
ентриСет() Враћа а Сет приказ мапирања садржаних у овој мапи.
једнако? (Објекат о) Упоређује наведени објекат са овом мапом ради једнакости.
добити? (кључ објекта) Враћа вредност на коју је наведени кључ мапиран или нулл ако ова мапа не садржи мапирање за кључ.
хасхЦоде() Враћа вредност хеш кода за ову мапу.
исЕмпти() Враћа тачно ако ова хеш мапа идентитета не садржи пресликавања кључ/вредност.
кеиСет() Враћа приказ скупа кључева садржаних у овој мапи заснован на идентитету.
ставити? (К кључ В вредност) Повезује наведену вредност са наведеним кључем у овој хеш мапи идентитета.
ставиАлл? (Мапа м) Копира сва мапирања са наведене мапе на ову мапу.
уклонити? (кључ објекта) Уклања мапирање за овај кључ са ове мапе ако постоји.
величина() Враћа број пресликавања кључ/вредност у овој хеш мапи идентитета.
вредности() Враћа приказ колекције вредности садржаних у овој мапи.

Методе декларисане у класи јава.утил.АбстрацтМап

МЕТОДА

ОПИС

 тоСтринг() Враћа стринг приказ ове мапе.

Методе декларисане у интерфејсу јава.утил.Мап

МЕТОДА

ОПИС

 израчунати? (К кључ БиФунцтион ремаппингФунцтион) Покушаји да се израчуна мапирање за наведени кључ и његову тренутну мапирану вредност (или нулл ако тренутно не постоји мапирање).
цомпутеИфАбсент? (К тастер Функција маппингФунцтион) Ако наведени кључ није већ повезан са вредношћу (или је мапиран на нулл) покушава да израчуна своју вредност користећи дату функцију мапирања и уноси је у ову мапу осим ако је нулл.
цомпутеИфПресент? (К кључ БиФунцтион ремаппингФунцтион) Ако је вредност за наведени кључ присутна и не-нулл покушава да израчуна ново мапирање с обзиром на кључ и његову тренутну мапирану вредност.
форЕацх? (БиЦонсумер акција) Изводи дату радњу за сваки унос на овој мапи док се сви уноси не обрађују или док акција не изазове изузетак.
гетОрДефаулт? (Кључ објекта В дефаултВалуе) Враћа вредност на коју је наведени кључ мапиран или дефаултВалуе ако ова мапа не садржи мапирање за кључ.
спојити? (К кључ В вредност БиФунцтион ремаппингФунцтион) Ако наведени кључ није већ повезан са вредношћу или је повезан са нултом, повезује га са датом вредношћу која није нулта.
ставитиИфАбсент? (К кључ В вредност) Ако наведени кључ није већ повезан са вредношћу (или је мапиран у нулл), повезује га са датом вредношћу и враћа нулл, иначе враћа тренутну вредност.
уклонити? (Кључ објекта Вредност објекта) Уклања унос за наведени кључ само ако је тренутно мапиран на наведену вредност.
заменити? (К кључ В вредност) Замењује унос за наведени кључ само ако је тренутно мапиран на неку вредност.
заменити? (К кључ В олдВалуе В новаВалуе) Замењује унос за наведени кључ само ако је тренутно мапиран на наведену вредност.
реплацеАлл? (БиФунцтион функција) Замењује вредност сваког уноса резултатом позивања дате функције на том уносу док се сви уноси не обрађују или док функција не избаци изузетак.

ИдентитиХасхМап вс  ХасхМап

  • ИдентитиХасхМап користи оператор једнакости '==' за поређење кључева и вредности док ХасхМап користи метод једнакости за поређење кључева и вредности унутар Мапе.
  • Пошто ИдентитиХасхМап не користи екуалс(), он је релативно бржи од ХасхМап-а за објекат са скупим екуалс().
  • ИдентитиХасхМап не захтева да кључеви буду непроменљиви јер се не ослања на екуалс().

Програм у наставку илуструје разлику између имплементације ИдентитиХасхМап и ХасхМап.

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  


ИдентитиХасхМап је класа у Јави која имплементира интерфејс мапе и користи референтну једнакост за упоређивање кључева. Сличан је обичном ХасхМап-у, али користи == оператор за упоређивање кључева уместо методе екуалс(). То значи да ће се два кључа са истим садржајем али различитим референцама објеката третирати као различити кључеви у ИдентитиХасхМап-у.

Ево примера како да користите ИдентитиХасхМап у Јави:

 

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  

У овом примеру креирамо ИдентитиХасхМап који пресликава стринг кључеве у вредности Интегер. Додајемо два пара кључ/вредност на мапу користећи два различита Стринг објекта који имају исти садржај. Затим преузимамо вредности са мапе користећи исте и различите Стринг објекте. Открили смо да можемо да преузмемо вредности са мапе користећи два различита кључа који имају исти садржај, али не можемо да преузмемо вредност користећи Стринг објекат који има исти садржај, али је другачија референца објекта.

Имајте на уму да ИдентитиХасхМап има нешто другачије понашање од обичног ХасхМап-а и генерално је користан само у одређеним ситуацијама када је референтна једнакост важна. У већини случајева обичан ХасхМап је довољан и прикладнији.

 

Креирај квиз