logo

Клас IdentityHashMap в Java

The IdentityHashMap інвентар Карта використання інтерфейсу Хеш-таблиця використання рівняння посилань замість рівності об’єктів під час порівняння ключів (і значень). Цей клас не є реалізацією Map загального призначення. Хоча цей клас реалізує інтерфейс Map, він навмисно порушує загальний контракт Map, який зобов’язує використовувати метод equals() під час порівняння об’єктів. Цей клас використовується, коли користувач вимагає, щоб об’єкти порівнювалися за посиланням. Це належить java.util пакет.

Особливості IdentityHashMap

  • Замість використання методу equals() він дотримується еталонної рівності, а використовує оператор ==.
  • Він не синхронізований і повинен бути синхронізований зовні.
  • Ітератори є безвідмовними ConcurrentModificationException у спробі змінити під час ітерації.
  • Цей клас забезпечує постійну продуктивність для базових операцій (get і put) за умови, що хеш-функція ідентифікації системи (System.identityHashCode(Object)) правильно розподіляє елементи між сегментами. IdentityHashMap не використовує метод hashCode(), натомість використовує метод System.identityHashCode(). Це суттєва відмінність, оскільки тепер ви можете використовувати змінні об’єкти як ключі в Map, хеш-код яких, імовірно, зміниться, коли відображення зберігається в IdentityHashMap.

Декларація:



відкритий клас IdentityHashMapрозширює AbstractMapреалізує КартуСеріалізована Клонована 
 

тут К є ключовим типом об'єкта і В це значення Тип об'єкта.

У 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' 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():  Створює нову порожню хеш-карту ідентичності з очікуваним максимальним розміром за замовчуванням. 

рядки в c

IdentityHashMapйому = нова IdentityHashMap();

2. IdentityHashMap(int expectMaxSize):  Створює нову порожню карту із заданим очікуваним максимальним розміром. 

IdentityHashMapihm = нова IdentityHashMap(int очікуваний максимальний розмір);

3. IdentityHashMap(Map 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 swing
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

    К– Тип ключів на карті.В– Тип значень, відображених на карті.

МЕТОД

ОПИС

очистити() Видаляє всі зіставлення з цієї карти.
клонувати() Повертає поверхневу копію цієї хеш-карти ідентичності: самі ключі та значення не клонуються.
containsKey? (ключ об'єкта) Перевіряє, чи є вказане посилання на об’єкт ключем у цій хеш-карті ідентифікатора.
містить значення? (значення об’єкта) Перевіряє, чи є вказане посилання на об’єкт значенням у цій хеш-карті ідентифікатора.
entrySet() Повертає a встановити перегляд відображень, що містяться на цій карті.
дорівнює? (Об'єкт o) Порівнює вказаний об’єкт із цією картою на рівність.
отримати? (ключ об'єкта) Повертає значення, на яке зіставляється вказаний ключ, або null, якщо ця карта не містить зіставлення для ключа.
hashCode() Повертає значення хеш-коду для цієї карти.
isEmpty() Повертає true, якщо ця хеш-карта ідентифікатора не містить зіставлень ключ-значення.
keySet() Повертає представлення набору ключів, які містяться в цій карті, на основі ідентичності.
поставити? (K ключ V значення) Пов’язує вказане значення з указаним ключем у цій хеш-карті ідентифікатора.
putAll?(Картам) Копіює всі зіставлення з указаної карти на цю карту.
видалити? (ключ об'єкта) Видаляє відображення для цього ключа з цієї карти, якщо воно є.
розмір() Повертає кількість зіставлень ключ-значення в цій хеш-карті ідентифікаційних даних.
значення() Повертає перегляд колекції значень, які містяться на цій карті.

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

МЕТОД

ОПИС

 toString()Повертає рядкове представлення цієї карти.

Методи, оголошені в інтерфейсі java.util.Map

МЕТОД

ОПИС

 обчислити? (Клавіша BiFunctionremappingFunction)Намагається обчислити відображення для вказаного ключа та його поточного відображеного значення (або значення null, якщо поточного відображення немає).
computeIfAbsent?(К ключ ФункціяmappingFunction)Якщо вказаний ключ ще не пов’язано зі значенням (або зіставлено з null), намагається обчислити його значення за допомогою заданої функції відображення та вводить його в цю карту, якщо він не null.
computeIfPresent?(клавіша K BiFunctionremappingFunction)Якщо значення для вказаного ключа присутнє та ненульове, намагається обчислити нове зіставлення з урахуванням ключа та його поточного зіставленого значення.
forEach?(BiConsumerдія)Виконує вказану дію для кожного запису в цій карті, доки всі записи не будуть оброблені або дія не викличе виняток.
getOrDefault?(ключ об’єкта V defaultValue)Повертає значення, на яке зіставляється вказаний ключ, або defaultValue, якщо ця карта не містить зіставлення для ключа.
об'єднати?(K ключ V значення BiFunctionremappingFunction)Якщо вказаний ключ ще не пов’язано зі значенням або пов’язано з нульовим значенням, він пов’язується з даним ненульовим значенням.
putIfAbsent? (К ключ V значення)Якщо вказаний ключ ще не пов’язано зі значенням (або зіставлено з null), він пов’язує його з заданим значенням і повертає null, інакше повертає поточне значення.
видалити? (Ключ об’єкта Значення об’єкта)Видаляє запис для вказаного ключа, лише якщо він наразі зіставлений із вказаним значенням.
замінити? (K ключ 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 є достатнім і більш відповідним.

bash для циклу

 

Створіть вікторину