A IdentityHashMap megvalósítja Térkép interfész segítségével Hashtable referencia-egyenlőség használata az objektum-egyenlőség helyett a kulcsok (és értékek) összehasonlításakor. Ez az osztály nem egy általános célú térkép-megvalósítás. Bár ez az osztály megvalósítja a Map interfészt, szándékosan megsérti a Map általános szerződését, amely előírja az equals() metódus használatát az objektumok összehasonlításakor. Ezt az osztályt akkor használjuk, ha a felhasználó megköveteli az objektumok referencia útján történő összehasonlítását. hozzátartozik java.util csomag.
Az IdentityHashMap jellemzői
- A referenciaegyenlőséget követi az equals() metódus helyett, az == operátort használja.
- Nincs szinkronizálva, és külsőleg kell szinkronizálni.
- Az iterátorok hibagyors dobások ConcurrentModificationException iteráció közben próbálva módosítani.
- Ez az osztály állandó idejű teljesítményt biztosít az alapvető műveletekhez (get és put), feltételezve, hogy a rendszeridentitás-kivonatoló függvény (System.identityHashCode(Object)) megfelelően szétosztja az elemeket a tárolók között. Az IdentityHashMap nem használja a hashCode() metódust, hanem a System.identityHashCode() metódust. Ez jelentős különbség, mert mostantól a Map kulcsaként használhat olyan módosítható objektumokat, amelyek hash kódja valószínűleg megváltozik, amikor a leképezést az IdentityHashMapben tárolják.
Nyilatkozat:
nyilvános osztály IdentityHashMap
kiterjeszti az AbstractMap-et térképet valósít meg Sorosozható klónozható
Itt K a kulcs Objektumtípus és V az objektum típusa.
A Java-ban az IdentityHashMap egy osztály, amely megvalósítja a Map felületet. Hasonló a HashMap osztályhoz, azzal a fő különbséggel, hogy az IdentityHashMap referenciaegyenlőséget használ az objektum egyenlőség helyett a kulcsok összehasonlításakor.
Míg a HashMap az equals() metódust használja a kulcsok összehasonlítására, az IdentityHashMap az == operátort használja a kulcsok összehasonlításához. Ez azt jelenti, hogy az IdentityHashMap-ben két kulcs akkor és csak akkor tekintendő egyenlőnek, ha ugyanaz az objektum, nem pedig tartalmukat tekintve egyenlőek.
urfi javed
Íme egy példa arra, hogyan használhatja az IdentityHashMap-et Java-ban:
Javaimport 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 } }
kimenet;
2
1
A Java IdentityHashMap osztálya a Map interfész hash tábla alapú megvalósítása, amely a referencia-egyenlőséget használja az objektum-egyenlőség helyett a kulcsok (és értékek) összehasonlításakor.
Az IdentityHashMap használatának előnyei a HashMap-pel szemben:
- Gyorsabb keresések: Mivel az IdentityHashMap referencia-egyenlőséget használ az összehasonlításhoz, gyorsabb a kereséseknél, mint az objektum-egyenlőséget használó HashMap.
- Hasznos objektumpéldányok összehasonlításához: Az IdentityHashMap olyan helyzetekben hasznos, amikor objektumpéldányokat szeretne összehasonlítani az objektumértékek helyett.
Az IdentityHashMap használatának hátrányai:
- Több memóriát használ: Az IdentityHashMap több memóriát használ a HashMaphez képest, mivel tárolnia kell az objektumra mutató hivatkozást.
- Nem alkalmas minden felhasználási esetre: Az IdentityHashMap nem alkalmas minden felhasználási esetre, és óvatosan kell használni, mert bizonyos helyzetekben váratlan viselkedéshez vezethet.
Az IdentityHashMap hierarchiája
Megvalósítja Sorozatozható Klónozható Térkép
Példa:
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()); } }
Kimenet
Size of IdentityHashMap--2
Az IdentityHashMap konstruktőrei
Létrehozhatunk egy példányt IdentityHashMap kétféleképpen:
IdentityHashMapihm = new IdentityHashMap (); (or) Map hm = new IdentityHashMap ();
1. IdentityHashMap(): Új üres identitáskivonat-leképezést hoz létre az alapértelmezett várható maximális mérettel.
IdentityHashMap
őt = új IdentityHashMap ();
2. IdentityHashMap(int vártMaxSize): Új üres térképet hoz létre a megadott várható maximális mérettel.
IdentityHashMap
ihm = new IdentityHashMap(int vártMaxSize);
3. IdentityHashMap(m térkép): Létrehoz egy új identitáskivonat-leképezést, amely tartalmazza a kulcsérték-leképezéseket a megadott leképezésben.
IdentityHashMap
ihm = new IdentityHashMap(M térkép); homogén keverék
Az IdentityHashMap alapvető műveletei
1. Elemek hozzáadása
Leképezés beszúrásához vagy hozzáadásához egy IdentityHashMap-hez tesz() és mindent elhelyez() mód. A put() beszúrhat egy adott kulcsot és az általa leképezett értéket egy adott térképbe. Ha egy meglévő kulcsot adunk át, akkor az előző érték helyébe az új érték lép. A putAll() az összes elemet, azaz a leképezéseket az egyik térképről a másikra másolja.
java vizualizáló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); } }
Kimenet
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. Elemek eltávolítása
Az általunk használt leképezések eltávolításához eltávolítás() az IdentityHashMap osztály beépített metódusa, és bármely adott kulcs leképezésének eltávolítására szolgál a térképről.
// 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); } }
Kimenet
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. Az elemek elérése
Az IdentityHashMap elemeit a kap() módszer példáját az alábbiakban mutatjuk be.
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()); } }
Kimenet
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. Bejárás
Az Iterator interfész segítségével a Collection Framework bármely struktúráján áthaladhatunk. Mivel az iterátorok egy típusú adattal dolgoznak, az Entry-t használjuk< ? ? >hogy a két különálló típust kompatibilis formátumba oldja fel. Ezután a next() metódussal kinyomtatjuk az IdentityHashMap elemeit.
// 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()); } } }
Kimenet
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 Szinkronizált IdentityHashMap
Ha több szál egyidejűleg fér hozzá egy azonosságkivonat-leképezéshez, és legalább az egyik szál szerkezetileg módosítja a leképezést, akkor külsőleg szinkronizálni kell. (Strukturális módosítás minden olyan művelet, amely egy vagy több leképezést ad hozzá vagy töröl; pusztán egy példányban már szereplő kulcshoz társított érték módosítása nem minősül szerkezeti módosításnak.) Ezt jellemzően valamilyen objektum szinkronizálásával érik el, amely természetesen magába foglalja a térképet. Ha nem létezik ilyen objektum, a térképet a következővel kell „burkolni”. Collections.synchronizedMap módszer. Ezt a legjobb a létrehozáskor megtenni, hogy elkerülje a véletlen, szinkronizálatlan hozzáférést a térképhez.
Térkép m = Collections.synchronizedMap(new IdentityHashMap(...));
Az IdentityHashMap módszerei
- Az IdentityHashMap a '==' egyenlőségi operátort használja a kulcsok és értékek összehasonlításához, míg a HashMap az egyenlőség módszert használja a kulcsok és értékek összehasonlításához a Map-en belül.
- Mivel az IdentityHashMap nem használja az equals()-t, viszonylag gyorsabb, mint a HashMap egy drága equals()-es objektum esetén.
- Az IdentityHashMap nem követeli meg, hogy a kulcsok megváltoztathatatlanok legyenek, mivel nem támaszkodik az equals()-re.
MÓDSZER | LEÍRÁS |
|---|---|
| világos() | Eltávolítja az összes hozzárendelést erről a térképről. |
| klón() | Ennek az identitáskivonat-térképnek egy sekély másolatát adja vissza: maguk a kulcsok és értékek nincsenek klónozva. |
| includeKey? (Objektumkulcs) | Azt teszteli, hogy a megadott objektumhivatkozás kulcs-e ebben az azonosságkivonat-leképezésben. |
| includeValue?(Objektumérték) | Azt teszteli, hogy a megadott objektumhivatkozás érték-e ebben az azonosságkivonat-leképezésben. |
| entrySet() | Visszatér a Készlet a térképen található leképezések nézete. |
| egyenlő? (O-objektum) | Összehasonlítja a megadott objektumot ezzel a térképpel az egyenlőség érdekében. |
| kap? (Objektumkulcs) | Visszaadja azt az értéket, amelyhez a megadott kulcs hozzá van rendelve, vagy nullát, ha ez a leképezés nem tartalmaz leképezést a kulcshoz. |
| hashCode() | Ennek a térképnek a hash kód értékét adja vissza. |
| üres() | Igaz értéket ad vissza, ha ez az azonosságkivonat-leképezés nem tartalmaz kulcsérték-leképezéseket. |
| keySet() | A térképen szereplő kulcsok identitásalapú halmaznézetét adja vissza. |
| tegye? (K kulcs V értéke) | A megadott értéket társítja a megadott kulccsal ebben az azonosságkivonat-leképezésben. |
| Mindent elhelyezni? (Térkép extends K?? extends V>m) | A megadott térkép összes leképezését átmásolja erre a térképre. |
| eltávolítani? (Objektumkulcs) | Eltávolítja a kulcs hozzárendelését a térképről, ha van. |
| méret() | A kulcsérték-leképezések számát adja vissza ebben az identitáskivonat-leképezésben. |
| értékek() | A térképen található értékek gyűjteménynézetét adja vissza. |
A java.util.AbstractMap osztályban deklarált metódusok
MÓDSZER | LEÍRÁS |
|---|---|
| toString() | A térkép karakterlánc-ábrázolását adja vissza. |
A java.util.Map felületen deklarált módszerek
MÓDSZER | LEÍRÁS |
|---|---|
| kiszámítja? (K billentyű BiFunction super K?? super V?? extends V>remappingFunction) | Megkísérli kiszámítani a leképezést a megadott kulcshoz és aktuális leképezési értékéhez (vagy nullához, ha nincs aktuális leképezés). |
| computeIfAbsent?(K billentyű függvény super K?? extends V>leképezési funkció) | Ha a megadott kulcs még nincs értékhez társítva (vagy nullára van leképezve), akkor megpróbálja kiszámítani az értékét az adott leképezési függvény segítségével, és beírja ebbe a leképezésbe, hacsak nem null. |
| computeIfPresent?(K billentyű BiFunction super K?? super V?? extends V>remappingFunction) | Ha a megadott kulcs értéke jelen van, és nem nulla, akkor megpróbál egy új leképezést kiszámítani a kulcs és az aktuális leképezett érték alapján. |
| forEach? (BiConsumer super K?? super V>akció) | Végrehajtja az adott műveletet a térkép minden bejegyzésére, amíg az összes bejegyzést fel nem dolgozták, vagy a művelet kivételt nem tesz. |
| getOrDefault?(V objektumkulcs alapértelmezett értéke) | Visszaadja azt az értéket, amelyhez a megadott kulcs hozzá van rendelve, vagy alapértelmezett értéket, ha ez a leképezés nem tartalmaz leképezést a kulcshoz. |
| egyesítés? (K kulcs V érték BiFunction super V?? super V?? extends V>remappingFunction) | Ha a megadott kulcs még nincs hozzárendelve egy értékhez, vagy nullához van társítva, akkor a megadott nem null értékkel társítja. |
| putIfAbsent? (K kulcs V értéke) | Ha a megadott kulcs még nincs értékhez társítva (vagy nullára van leképezve), akkor társítja az adott értékkel, és nullát ad vissza, elseje az aktuális értéket adja vissza. |
| távolítsa el? (Objektumkulcs Objektumérték) | Csak akkor távolítja el a megadott kulcshoz tartozó bejegyzést, ha az aktuálisan hozzá van rendelve a megadott értékhez. |
| csere? (K kulcs V értéke) | Csak akkor cseréli le a megadott kulcs bejegyzését, ha az aktuálisan le van képezve valamilyen értékre. |
| csere?(K kulcs V oldValue V newValue) | Csak akkor cseréli le a megadott kulcs bejegyzését, ha jelenleg a megadott értékre van leképezve. |
| cserélje ki az összeset? (BiFunction super K?? super V?? extends V>funkció) | Minden egyes bejegyzés értékét lecseréli az adott függvény meghívásának eredményére az adott bejegyzésben, amíg az összes bejegyzés feldolgozásra nem kerül, vagy a függvény kivételt nem dob. |
IdentityHashMap vs HashMap
Az alábbi program bemutatja az IdentityHashMap és a HashMap megvalósítás közötti különbséget.
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()); } }
Kimenet
Size of HashMap is : 1 Size of IdentityHashMap is : 2
Az IdentityHashMap egy olyan Java osztály, amely megvalósítja a Map felületet, és referenciaegyenlőséget használ a kulcsok összehasonlításához. Hasonló a hagyományos HashMaphez, de az == operátort használja a kulcsok összehasonlítására az equals() metódus helyett. Ez azt jelenti, hogy két azonos tartalmú, de eltérő objektumhivatkozású kulcsot a rendszer külön kulcsként kezel az IdentityHashMap-ban.
Íme egy példa az IdentityHashMap használatára Java nyelven:
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 } }
Kimenet
1 2 null
Ebben a példában létrehozunk egy IdentityHashMap-et, amely a karakterlánc-kulcsokat egész értékekre képezi le. Két kulcs-érték párt adunk a térképhez két különböző karakterlánc objektum használatával, amelyeknek azonos a tartalma. Ezután lekérjük az értékeket a térképről ugyanazon és különböző String objektumok használatával. Azt találtuk, hogy lekérhetünk értékeket a térképről a két különböző kulcs használatával, amelyeknek ugyanaz a tartalma, de nem tudunk lekérni értéket olyan String objektum használatával, amely azonos tartalommal rendelkezik, de egy másik objektumhivatkozás.
Vegye figyelembe, hogy az IdentityHashMap viselkedése kissé eltér a hagyományos HashMap-től, és általában csak bizonyos helyzetekben hasznos, amikor a referenciaegyenlőség fontos. A legtöbb esetben egy szokásos HashMap elegendő és megfelelőbb.
kivétel dobja a javát
Kvíz létrehozása