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:
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 } }
вихід;
2
1
Клас IdentityHashMap у Java — це реалізація інтерфейсу Map на основі хеш-таблиці, яка використовує рівність посилань замість рівності об’єктів під час порівняння ключів (і значень).
Переваги використання IdentityHashMap над HashMap:
- Швидший пошук: оскільки IdentityHashMap використовує для порівняння рівність посилань, пошук виконується швидше порівняно з HashMap, який використовує рівність об’єктів.
- Корисно для порівняння екземплярів об’єктів: IdentityHashMap корисний у ситуаціях, коли ви хочете порівняти екземпляри об’єктів, а не значення об’єктів.
Недоліки використання IdentityHashMap:
- Використовує більше пам’яті: IdentityHashMap використовує більше пам’яті порівняно з HashMap, оскільки йому потрібно зберігати посилання на об’єкт.
- Не підходить для всіх випадків використання: IdentityHashMap не підходить для всіх випадків використання, і його слід використовувати з обережністю, оскільки це може призвести до неочікуваної поведінки в певних ситуаціях.
Ієрархія IdentityHashMap
Це реалізує Серіалізований Можливість клонування Карта
приклад:
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 двома способами:
IdentityHashMapihm = new IdentityHashMap (); (or) Map hm = new IdentityHashMap ();
1. IdentityHashMap(): Створює нову порожню хеш-карту ідентичності з очікуваним максимальним розміром за замовчуванням.
рядки в c
IdentityHashMap
йому = нова IdentityHashMap ();
2. IdentityHashMap(int expectMaxSize): Створює нову порожню карту із заданим очікуваним максимальним розміром.
IdentityHashMap
ihm = нова IdentityHashMap(int очікуваний максимальний розмір);
3. IdentityHashMap(Map m): Створює нову геш-карту ідентичності, яка містить зіставлення ключів і значень у вказаній карті.
IdentityHashMap
ihm = нова 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 swingJava
// 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 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
- IdentityHashMap використовує оператор рівності '==' для порівняння ключів і значень, тоді як HashMap використовує метод equals для порівняння ключів і значень всередині Map.
- Оскільки IdentityHashMap не використовує equals(), він порівняно швидший, ніж HashMap для об’єкта з дорогим equals().
- IdentityHashMap не вимагає, щоб ключі були незмінними, оскільки він не покладається на equals().
МЕТОД | ОПИС |
|---|---|
| очистити() | Видаляє всі зіставлення з цієї карти. |
| клонувати() | Повертає поверхневу копію цієї хеш-карти ідентичності: самі ключі та значення не клонуються. |
| containsKey? (ключ об'єкта) | Перевіряє, чи є вказане посилання на об’єкт ключем у цій хеш-карті ідентифікатора. |
| містить значення? (значення об’єкта) | Перевіряє, чи є вказане посилання на об’єкт значенням у цій хеш-карті ідентифікатора. |
| entrySet() | Повертає a встановити перегляд відображень, що містяться на цій карті. |
| дорівнює? (Об'єкт o) | Порівнює вказаний об’єкт із цією картою на рівність. |
| отримати? (ключ об'єкта) | Повертає значення, на яке зіставляється вказаний ключ, або null, якщо ця карта не містить зіставлення для ключа. |
| hashCode() | Повертає значення хеш-коду для цієї карти. |
| isEmpty() | Повертає true, якщо ця хеш-карта ідентифікатора не містить зіставлень ключ-значення. |
| keySet() | Повертає представлення набору ключів, які містяться в цій карті, на основі ідентичності. |
| поставити? (K ключ V значення) | Пов’язує вказане значення з указаним ключем у цій хеш-карті ідентифікатора. |
| putAll?(Карта extends K?? extends V>м) | Копіює всі зіставлення з указаної карти на цю карту. |
| видалити? (ключ об'єкта) | Видаляє відображення для цього ключа з цієї карти, якщо воно є. |
| розмір() | Повертає кількість зіставлень ключ-значення в цій хеш-карті ідентифікаційних даних. |
| значення() | Повертає перегляд колекції значень, які містяться на цій карті. |
Методи, оголошені в класі java.util.AbstractMap
МЕТОД | ОПИС |
|---|---|
| toString() | Повертає рядкове представлення цієї карти. |
Методи, оголошені в інтерфейсі java.util.Map
МЕТОД | ОПИС |
|---|---|
| обчислити? (Клавіша BiFunction super K?? super V?? extends V>remappingFunction) | Намагається обчислити відображення для вказаного ключа та його поточного відображеного значення (або значення null, якщо поточного відображення немає). |
| computeIfAbsent?(К ключ Функція super K?? extends V>mappingFunction) | Якщо вказаний ключ ще не пов’язано зі значенням (або зіставлено з null), намагається обчислити його значення за допомогою заданої функції відображення та вводить його в цю карту, якщо він не null. |
| computeIfPresent?(клавіша K BiFunction super K?? super V?? extends V>remappingFunction) | Якщо значення для вказаного ключа присутнє та ненульове, намагається обчислити нове зіставлення з урахуванням ключа та його поточного зіставленого значення. |
| forEach?(BiConsumer super K?? super V>дія) | Виконує вказану дію для кожного запису в цій карті, доки всі записи не будуть оброблені або дія не викличе виняток. |
| getOrDefault?(ключ об’єкта V defaultValue) | Повертає значення, на яке зіставляється вказаний ключ, або defaultValue, якщо ця карта не містить зіставлення для ключа. |
| об'єднати?(K ключ V значення BiFunction super V?? super V?? extends V>remappingFunction) | Якщо вказаний ключ ще не пов’язано зі значенням або пов’язано з нульовим значенням, він пов’язується з даним ненульовим значенням. |
| putIfAbsent? (К ключ V значення) | Якщо вказаний ключ ще не пов’язано зі значенням (або зіставлено з null), він пов’язує його з заданим значенням і повертає null, інакше повертає поточне значення. |
| видалити? (Ключ об’єкта Значення об’єкта) | Видаляє запис для вказаного ключа, лише якщо він наразі зіставлений із вказаним значенням. |
| замінити? (K ключ V значення) | Замінює запис для вказаного ключа, лише якщо він наразі зіставлено з деяким значенням. |
| замінити? (K ключ V oldValue V newValue) | Замінює запис для вказаного ключа, лише якщо наразі зіставлено з вказаним значенням. |
| замінитиВсе?(БіФункція super K?? super V?? extends V>функція) | Замінює значення кожного запису результатом виклику заданої функції для цього запису, доки всі записи не будуть оброблені або функція не викличе виняткову ситуацію. |
IdentityHashMap проти HashMap
Наведена нижче програма ілюструє різницю між реалізацією 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 для циклу
Створіть вікторину