logo

Клас 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

сортиране чрез сливане в java

IdentityHashMap в Java' src='//techcodeview.com/img/misc/68/identityhashmap-class-in-java.webp' title=

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

Пример:

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 очакван максимален размер):  Конструира нова празна карта с посочения очакван максимален размер. 

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

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

IdentityHashMapihm = нова 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. Достъп до елементите

урок за реагиране на js

Можем да имаме достъп до елементите на 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 BiFunctionremappingFunction)Опитва се да изчисли съпоставяне за посочения ключ и текущата му съпоставена стойност (или нула, ако няма текущо съпоставяне).
computeIfAbsent?(К клавишна функцияmappingFunction)Ако посоченият ключ все още не е свързан със стойност (или е съпоставен с null), се опитва да изчисли стойността му с помощта на дадената функция за съпоставяне и го въвежда в тази карта, освен ако не е null.
computeIfPresent?(К ключ BiFunctionremappingFunction)Ако стойността за посочения ключ е налице и не е null, се опитва да изчисли ново съпоставяне, дадено на ключа и текущата му съпоставена стойност.
forEach?(BiConsumerдействие)Извършва даденото действие за всеки запис в тази карта, докато всички записи бъдат обработени или действието хвърли изключение.
getOrDefault?(Обектен ключ V defaultValue)Връща стойността, към която е съпоставен посоченият ключ, или defaultValue, ако тази карта не съдържа съпоставяне за ключа.
сливане?(К ключ V стойност BiFunctionremappingFunction)Ако указаният ключ все още не е свързан със стойност или е свързан с 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 е достатъчен и по-подходящ.

набор от пружинни инструменти

 

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