„IdentityHashMap“ klasė „Java“.

„IdentityHashMap“ klasė „Java“.

The IdentityHashMap padargai Žemėlapis naudojant sąsają Hashtable lyginant raktus (ir reikšmes), vietoj objekto lygybės naudojant nuorodos lygybę. Ši klasė nėra bendros paskirties žemėlapio diegimas. Nors ši klasė įgyvendina žemėlapio sąsają, ji tyčia pažeidžia Žemėlapio bendrąją sutartį, kuri įpareigoja naudoti lygių () metodą lyginant objektus. Ši klasė naudojama, kai vartotojas reikalauja, kad objektai būtų lyginami naudojant nuorodą. Tai priklauso java.util paketą.

„IdentityHashMap“ ypatybės

  • Jis vadovaujasi nuorodos lygybe, užuot naudojęs equals() metodą, naudoja operatorių ==.
  • Jis nėra sinchronizuotas ir turi būti sinchronizuojamas išorėje.
  • Iteratoriai yra greitai išmesti ConcurrentModificationException bandant pakeisti kartojimo metu.
  • Ši klasė užtikrina nuolatinį pagrindinių operacijų (gauti ir įdėti) našumą, darant prielaidą, kad sistemos tapatybės maišos funkcija (System.identityHashCode(Object)) tinkamai paskirsto elementus tarp segmentų. IdentityHashMap nenaudoja hashCode() metodo, o naudoja System.identityHashCode() metodą. Tai reikšmingas skirtumas, nes dabar kaip raktą Žemėlapyje galite naudoti kintamus objektus, kurių maišos kodas gali pasikeisti, kai atvaizdas bus saugomas „IdentityHashMap“.

Deklaracija:

viešoji klasė „IdentityHashMap“. pratęsia AbstractMap įgyvendina Žemėlapį Serializuojamas klonuojamas 
 

Čia K yra pagrindinis objekto tipas ir V yra reikšmė Objekto tipas.

Java IdentityHashMap yra klasė, kuri įgyvendina žemėlapio sąsają. Jis panašus į „HashMap“ klasę, o pagrindinis skirtumas yra tas, kad „IdentityHashMap“ lygindama raktus naudoja nuorodos lygybę, o ne objektų lygybę.

Nors „HashMap“ raktams palyginti naudoja „ equals“ () metodą, „IdentityHashMap“ raktams palyginti naudoja operatorių ==. Tai reiškia, kad „IdentityHashMap“ du raktai laikomi lygiais tada ir tik tada, kai jie yra tas pats objektas, o ne lygūs savo turiniu.

Štai pavyzdys, kaip „Java“ galite naudoti „IdentityHashMap“:

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

išvestis;

1

„Java“ „IdentityHashMap“ klasė yra maišos lentelės pagrindu sukurtas žemėlapio sąsajos įgyvendinimas, kuriame lyginant raktus (ir reikšmes) vietoj objekto lygybės naudojama nuorodų lygybė.

„IdentityHashMap“ naudojimo pranašumai, palyginti su „HashMap“:

  1. Greitesnės paieškos: kadangi „IdentityHashMap“ palyginimui naudoja nuorodų lygybę, ji yra greitesnė, palyginti su „HashMap“, kuri naudoja objektų lygybę.
  2. Naudinga lyginant objektų egzempliorius: „IdentityHashMap“ yra naudinga tais atvejais, kai norite palyginti objektų egzempliorius, o ne objektų reikšmes.

„IdentityHashMap“ naudojimo trūkumai:

  1. Naudoja daugiau atminties: „IdentityHashMap“ naudoja daugiau atminties, palyginti su „HashMap“, nes jai reikia saugoti nuorodą į objektą.
  2. Netinka visiems naudojimo atvejams: „IdentityHashMap“ netinka visiems naudojimo atvejams ir turėtų būti naudojamas atsargiai, nes tam tikrose situacijose tai gali sukelti netikėtą elgesį.

 

„IdentityHashMap“ hierarchija

IdentityHashMap Java

Tai įgyvendina Serializuojama Galima klonuoti Žemėlapis sąsajas ir išplečia AbstractMap klasė.

Pavyzdys:

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

Išvestis
Size of IdentityHashMap--2  

„IdentityHashMap“ konstruktoriai

Galime sukurti egzempliorių IdentityHashMap dviem būdais:

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

1. IdentityHashMap():  Sukuria naują tuščią tapatybės maišos žemėlapį su numatytuoju numatomu didžiausiu dydžiu. 

IdentityHashMap jis = naujas IdentityHashMap ();

2. IdentityHashMap (int tikimasiMaxSize):  Sukuria naują tuščią žemėlapį su nurodytu numatomu didžiausiu dydžiu. 

IdentityHashMap ihm = new IdentityHashMap(int tikimasiMaxSize);

3. IdentityHashMap (žemėlapis m):  Sukuria naują tapatybės maišos žemėlapį, kuriame yra rakto-reikšmių susiejimas nurodytame žemėlapyje.

IdentityHashMap ihm = naujas IdentityHashMap (žemėlapis m);

Pagrindinės operacijos „IdentityHashMap“.

1. Elementų pridėjimas

Norėdami įterpti arba įtraukti atvaizdą į „IdentityHashMap“, turime įdėti () ir įdėti viską () metodus. put() gali įterpti konkretų raktą ir jo priskirtą reikšmę į tam tikrą žemėlapį. Jei perduodamas esamas raktas, ankstesnė vertė pakeičiama nauja. putAll () nukopijuoja visus elementus, ty atvaizdus iš vieno žemėlapio į kitą. 

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

Išvestis
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. Elementų pašalinimas
Norėdami pašalinti atvaizdus, ​​kuriuos naudojame pašalinti () integruotas IdentityHashMap klasės metodas ir naudojamas pašalinti bet kurio konkretaus rakto atvaizdavimą iš žemėlapio.

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

Išvestis
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. Prieiga prie elementų

„IdentityHashMap“ elementus galime pasiekti naudodami gauti () Šio metodo pavyzdys pateiktas žemiau.

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

Išvestis
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. Traversavimas
Galime naudoti „Iterator“ sąsają, norėdami pereiti per bet kurią kolekcijos struktūrą. Kadangi Iteratoriai dirba su vieno tipo duomenimis, naudojame Entry < ? ? >kad išskirstytumėte du atskirus tipus į suderinamą formatą. Tada naudodami next() metodą spausdiname IdentityHashMap elementus.

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

Išvestis
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  

Sinchronizuotas IdentityHashMap

Jei kelios gijos vienu metu pasiekia tapatybės maišos žemėlapį ir bent viena iš gijų struktūriškai modifikuoja žemėlapį, ji turi būti sinchronizuota išoriškai. (Struktūrinis modifikavimas yra bet kokia operacija, kuri prideda arba ištrina vieną ar daugiau atvaizdų; vien tik su egzemplioriuje esančiu raktu susietos reikšmės pakeitimas nėra struktūrinis modifikavimas.) Paprastai tai atliekama sinchronizuojant su kokiu nors objektu, kuris natūraliai apima žemėlapį. Jei tokio objekto nėra, žemėlapis turėtų būti „apvyniotas“ naudojant Kolekcijos.synchronizedMap metodas. Tai geriausia padaryti kuriant, kad išvengtumėte atsitiktinės nesinchronizuotos prieigos prie žemėlapio. 

Žemėlapis m = Collections.synchronizedMap(new IdentityHashMap(...));

IdentityHashMap metodai

    K – klavišų tipas žemėlapyje. V – Žemėlapyje susietų verčių tipas.

METODAS

APRAŠYMAS

aišku () Iš šio žemėlapio pašalinami visi atvaizdai.
klonas () Grąžina negilią šio tapatybės maišos žemėlapio kopiją: patys raktai ir reikšmės nėra klonuoti.
includeKey? (Objekto raktas) Tikrina, ar nurodyta objekto nuoroda yra raktas šiame tapatybės maišos žemėlapyje.
includeValue?(Objekto vertė) Tikrina, ar nurodyta objekto nuoroda yra reikšmė šiame tapatybės maišos žemėlapyje.
įrašasSet() Grąžina a Nustatyti šiame žemėlapyje esančių žemėlapių vaizdas.
lygus? (O objektas) Lygina nurodytą objektą su šiuo žemėlapiu, kad būtų lygybė.
gauti? (Objekto raktas) Grąžina reikšmę, su kuria susietas nurodytas raktas, arba nulinę vertę, jei šiame žemėlapyje nėra rakto susiejimo.
maišos kodas () Grąžina šio žemėlapio maišos kodo reikšmę.
yra tuščias () Grąžina „true“, jei šiame tapatybės maišos žemėlapyje nėra raktų ir reikšmių susiejimo.
keySet() Pateikia tapatybe pagrįstą šiame žemėlapyje esančių raktų rinkinio rodinį.
įdėti? (K klavišo V vertė) Susieja nurodytą reikšmę su nurodytu raktu šiame tapatybės maišos žemėlapyje.
įdėti viską? (Žemėlapis m) Nukopijuoja visus žemėlapius iš nurodyto žemėlapio į šį žemėlapį.
pašalinti? (Objekto raktas) Pašalina šio rakto atvaizdavimą iš šio žemėlapio, jei yra.
dydis () Grąžina rakto vertės susiejimo skaičių šiame tapatybės maišos žemėlapyje.
reikšmės () Grąžina šiame žemėlapyje esančių verčių rinkinio rodinį.

Metodai, deklaruoti klasėje java.util.AbstractMap

METODAS

APRAŠYMAS

 toString() Pateikia šio žemėlapio eilutę.

Metodai, nurodyti sąsajoje java.util.Map

METODAS

APRAŠYMAS

 apskaičiuoti? (K klavišas BiFunction remappingFunction) Bandoma apskaičiuoti nurodyto rakto ir jo dabartinės susietos vertės susiejimą (arba nulinę, jei dabartinio susiejimo nėra).
computeIfAbsent?(K klavišo funkcija kartografavimo funkcija) Jei nurodytas raktas dar nesusietas su reikšme (arba susietas su nuliu), bando apskaičiuoti jo reikšmę naudodamas nurodytą susiejimo funkciją ir įveda jį į šį žemėlapį, nebent nulis.
computeIfPresent?(K klavišas BiFunction remappingFunction) Jei nurodyto rakto reikšmė yra ir ne nulis, bandoma apskaičiuoti naują susiejimą, atsižvelgiant į raktą ir jo dabartinę susietą reikšmę.
kiekvienam? (Dvi vartotojas veiksmas) Atlieka nurodytą veiksmą kiekvienam šio žemėlapio įrašui, kol visi įrašai bus apdoroti arba veiksmas padarys išimtį.
getOrDefault?(Objekto rakto V numatytoji vertė) Grąžina reikšmę, su kuria susietas nurodytas raktas, arba defaultValue, jei šiame žemėlapyje nėra rakto susiejimo.
sujungti? (K klavišo V reikšmė BiFunction remappingFunction) Jei nurodytas raktas dar nesusietas su reikšme arba yra susietas su nuliu, susieja jį su nurodyta nenuline verte.
įdėti, jei nėra? (K rakto V reikšmė) Jei nurodytas raktas dar nesusietas su reikšme (arba susietas su nuliu), susieja jį su nurodyta reikšme ir grąžina nulį, kitaip grąžina dabartinę reikšmę.
pašalinti? (Objekto raktas Objekto vertė) Pašalina nurodyto rakto įrašą tik tuo atveju, jei jis šiuo metu susietas su nurodyta reikšme.
pakeisti? (K klavišo V vertė) Pakeičia nurodyto rakto įrašą tik tuo atveju, jei jis šiuo metu susietas su kokia nors verte.
pakeisti?(K raktas V oldValue V newValue) Pakeičia nurodyto rakto įrašą tik tuo atveju, jei šiuo metu susietas su nurodyta reikšme.
pakeisti viską? (BiFunction funkcija) Pakeičia kiekvieno įrašo reikšmę duotos funkcijos iškvietimu tame įraše, kol visi įrašai bus apdoroti arba funkcija padarys išimtį.

IdentityHashMap vs  HashMap

  • „IdentityHashMap“ raktams ir reikšmėms lyginti naudoja lygybės operatorių „==“, o „HashMap“ naudoja lygių metodą raktams ir reikšmėms lyginti žemėlapyje.
  • Kadangi „IdentityHashMap“ nenaudoja equals(), jis yra palyginti greitesnis nei „HashMap“ objektui su brangiu equals ().
  • „IdentityHashMap“ nereikalauja, kad raktai būtų nekintami, nes jis nėra pagrįstas „ equals ().

Žemiau pateikta programa parodo skirtumą tarp „IdentityHashMap“ ir „HashMap“ diegimo.

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

Išvestis
Size of HashMap is : 1 Size of IdentityHashMap is : 2  


„IdentityHashMap“ yra „Java“ klasė, kuri įgyvendina žemėlapio sąsają ir naudoja nuorodų lygybę raktams palyginti. Jis panašus į įprastą HashMap, tačiau raktams lyginti naudojamas operatorius ==, o ne lygis () metodas. Tai reiškia, kad du raktai su tuo pačiu turiniu, bet skirtingomis objektų nuorodomis bus traktuojami kaip skirtingi raktai „IdentityHashMap“.

Štai pavyzdys, kaip „Java“ naudoti „IdentityHashMap“:

 

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

Išvestis
1 2 null  

Šiame pavyzdyje sukuriame IdentityHashMap, kuris susieja String raktus su sveikųjų skaičių reikšmėmis. Prie žemėlapio pridedame dvi raktų ir reikšmių poras, naudodami du skirtingus eilutės objektus, kurių turinys yra toks pat. Tada iš žemėlapio gauname reikšmes naudodami tuos pačius ir skirtingus eilutės objektus. Pastebime, kad galime gauti reikšmes iš žemėlapio naudodami du skirtingus raktus, kurių turinys yra toks pat, bet negalime gauti reikšmės naudodami objektą String, kurio turinys yra toks pat, bet yra kitokia objekto nuoroda.

Atminkite, kad „IdentityHashMap“ veikia šiek tiek kitaip nei įprastas „HashMap“ ir paprastai yra naudingas tik tam tikrose situacijose, kai svarbi nuorodų lygybė. Daugeliu atvejų įprasto HashMap pakanka ir tinkamesnis.

 

Sukurti viktoriną