logo

فئة IdentityHashMap في جافا

ال IdentityHashMap ينفذ رسم خريطة واجهة باستخدام جدول التجزئة استخدام المساواة المرجعية بدلاً من المساواة بين الكائنات عند مقارنة المفاتيح (والقيم). هذه الفئة ليست تطبيق خريطة للأغراض العامة. في حين أن هذه الفئة تنفذ واجهة الخريطة، فإنها تنتهك عمدا العقد العام للخريطة الذي يفرض استخدام طريقة يساوي () عند مقارنة الكائنات. يتم استخدام هذه الفئة عندما يطلب المستخدم مقارنة الكائنات عبر المرجع. انه ينتمي الى java.util طَرد.

ميزات IdentityHashMap

  • إنه يتبع المساواة المرجعية بدلاً من استخدام طريقة يساوي () التي تستخدم عامل التشغيل ==.
  • إنه غير متزامن ويجب مزامنته خارجيًا.
  • التكرارات هي رمية سريعة الفشل ConcurrentModificationException في محاولة للتعديل أثناء التكرار.
  • توفر هذه الفئة أداءً ثابتًا للعمليات الأساسية (الحصول والوضع) بافتراض أن وظيفة تجزئة هوية النظام (System.identityHashCode(Object)) تقوم بتوزيع العناصر بشكل صحيح بين المجموعات. لا يستخدم IdentityHashMap طريقة hashCode() بدلاً من ذلك يستخدم طريقة System.identityHashCode(). يعد هذا فرقًا كبيرًا لأنه يمكنك الآن استخدام الكائنات القابلة للتغيير كمفتاح في الخريطة التي من المحتمل أن يتغير رمز التجزئة الخاص بها عند تخزين التعيين داخل IdentityHashMap.

تصريح:



IdentityHashMap من الفئة العامةيمتد AbstractMapينفذ الخريطةقابل للتسلسل وقابل للاستنساخ 
 

هنا ك هو نوع الكائن الرئيسي و V هو نوع كائن القيمة.

في Java IdentityHashMap هي فئة تنفذ واجهة الخريطة. إنه مشابه لفئة HashMap مع الاختلاف الرئيسي وهو أن IdentityHashMap يستخدم المساواة المرجعية بدلاً من المساواة في الكائنات عند مقارنة المفاتيح.

بينما يستخدم HashMap طريقة يساوي () لمقارنة المفاتيح، يستخدم 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 عبارة عن تطبيق قائم على جدول التجزئة لواجهة الخريطة التي تستخدم المساواة المرجعية بدلاً من المساواة بين الكائنات عند مقارنة المفاتيح (والقيم).

مزايا استخدام IdentityHashMap عبر HashMap:

  1. عمليات بحث أسرع: نظرًا لأن IdentityHashMap يستخدم المساواة المرجعية للمقارنة، فهو أسرع لعمليات البحث مقارنةً بـ HashMap الذي يستخدم المساواة بين الكائنات.
  2. مفيد لمقارنة مثيلات الكائن: يعد IdentityHashMap مفيدًا في المواقف التي تريد فيها مقارنة مثيلات الكائن بدلاً من قيم الكائن.

عيوب استخدام IdentityHashMap:

  1. يستخدم المزيد من الذاكرة: يستخدم IdentityHashMap ذاكرة أكبر مقارنة بـ HashMap لأنه يحتاج إلى تخزين المرجع إلى الكائن.
  2. غير مناسب لجميع حالات الاستخدام: IdentityHashMap غير مناسب لجميع حالات الاستخدام ويجب استخدامه بحذر لأنه قد يؤدي إلى سلوك غير متوقع في مواقف معينة.

 

التسلسل الهرمي للهويةHashMap

IdentityHashMap في جافا' src='//techcodeview.com/img/misc/68/identityhashmap-class-in-java.webp' title=

ينفذ قابل للتسلسل قابل للاستنساخ رسم خريطة واجهات ويمتد AbstractMap فصل.

مثال:

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 الجديد()؛

2. IdentityHashMap(int المتوقعMaxSize):  إنشاء خريطة فارغة جديدة بالحجم الأقصى المتوقع المحدد. 

الرياضيات جافا

IdentityHashMapihm = new IdentityHashMap(int المتوقعMaxSize);

3.IdentityHashMap(خريطة م):  إنشاء خريطة تجزئة هوية جديدة تحتوي على تعيينات قيمة المفتاح في الخريطة المحددة.

IdentityHashMapihm = new IdentityHashMap(Map m);

العمليات الأساسية على IdentityHashMap

1. إضافة العناصر

لإدراج أو إضافة تعيين إلى IdentityHashMap لدينا يضع() و وضع الكل () طُرق. يمكن لـ 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. الوصول إلى العناصر

يمكننا الوصول إلى عناصر 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 لاجتياز أي بنية لإطار عمل المجموعة. نظرًا لأن التكرارات تعمل مع نوع واحد من البيانات، فإننا نستخدم الإدخال< ? ? >لحل النوعين المنفصلين في تنسيق متوافق. ثم باستخدام الطريقة التالية () نقوم بطباعة عناصر 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 طريقة. من الأفضل القيام بذلك في وقت الإنشاء لمنع الوصول العرضي غير المتزامن إلى الخريطة. 

Map m = Collections.synchronizedMap(new IdentityHashMap(...));

الأرقام الرومانية 1-100

طرق الهويةHashMap

    ك– نوع المفاتيح الموجودة في الخريطة .V– نوع القيم المعينة في الخريطة.

طريقة

وصف

واضح() يزيل كافة التعيينات من هذه الخريطة.
استنساخ () إرجاع نسخة سطحية من خريطة تجزئة الهوية هذه: لا يتم استنساخ المفاتيح والقيم نفسها.
يحتوي على مفتاح؟ (مفتاح الكائن) يختبر ما إذا كان مرجع الكائن المحدد هو مفتاح في خريطة تجزئة الهوية هذه.
يحتوي على القيمة؟ (قيمة الكائن) يختبر ما إذا كان مرجع الكائن المحدد يمثل قيمة في خريطة تجزئة الهوية هذه.
مجموعة الإدخال () يعود أ تعيين عرض التعيينات الواردة في هذه الخريطة.
يساوي؟(الكائن س) يقارن الكائن المحدد بهذه الخريطة من أجل المساواة.
الحصول على؟ (مفتاح الكائن) إرجاع القيمة التي تم تعيين المفتاح المحدد لها أو إرجاعها فارغة إذا كانت هذه الخريطة لا تحتوي على تعيين للمفتاح.
رمز التجزئة () إرجاع قيمة رمز التجزئة لهذه الخريطة.
فارغ () يُرجع صحيحًا إذا كانت خريطة تجزئة الهوية هذه لا تحتوي على تعيينات لقيمة المفتاح.
مجموعة المفاتيح () إرجاع عرض مجموعة يعتمد على الهوية للمفاتيح الموجودة في هذه الخريطة.
ضع؟ (قيمة مفتاح K V) يربط القيمة المحددة بالمفتاح المحدد في خريطة تجزئة الهوية هذه.
ضع الكل؟(خريطةم) نسخ كافة التعيينات من الخريطة المحددة إلى هذه الخريطة.
إزالة؟ (مفتاح الكائن) إزالة التعيين لهذا المفتاح من هذه الخريطة إذا كان موجودًا.
مقاس() إرجاع عدد تعيينات القيمة الرئيسية في خريطة تجزئة الهوية هذه.
قيم() تُرجع طريقة عرض المجموعة للقيم الموجودة في هذه الخريطة.

الطرق المعلنة في الفئة java.util.AbstractMap

طريقة

وصف

 إلى سلسلة ()تقوم بإرجاع تمثيل سلسلة لهذه الخريطة.

الطرق المعلنة في الواجهة java.util.Map

طريقة

وصف

 حساب؟(K مفتاح BiFunctionوظيفة إعادة التعيين)يحاول حساب تعيين للمفتاح المحدد وقيمته المعينة الحالية (أو يكون خاليًا إذا لم يكن هناك تعيين حالي).
computeIfAbsent?(وظيفة مفتاح Kوظيفة رسم الخرائط)إذا لم يكن المفتاح المحدد مرتبطًا بالفعل بقيمة (أو تم تعيينه إلى قيمة فارغة)، فسيحاول حساب قيمته باستخدام وظيفة التعيين المحددة وإدخاله في هذه الخريطة ما لم يكن فارغًا.
computeIfPresent?(مفتاح K BiFunctionوظيفة إعادة التعيين)إذا كانت قيمة المفتاح المحدد موجودة ومحاولات غير فارغة لحساب تعيين جديد بالنظر إلى المفتاح وقيمته المعينة الحالية.
لكل؟(BiConsumerفعل)ينفذ الإجراء المحدد لكل إدخال في هذه الخريطة حتى تتم معالجة جميع الإدخالات أو يطرح الإجراء استثناءً.
getOrDefault?(مفتاح الكائن V defaultValue)تُرجع القيمة التي تم تعيين المفتاح المحدد لها أو القيمة الافتراضية إذا كانت هذه الخريطة لا تحتوي على تعيين للمفتاح.
دمج؟(K مفتاح V قيمة BiFunctionوظيفة إعادة التعيين)إذا لم يكن المفتاح المحدد مرتبطًا بالفعل بقيمة أو كان مرتبطًا بقيمة خالية، فسيتم ربطه بالقيمة غير الخالية المحددة.
putIfAbsent?(قيمة مفتاح K V)إذا لم يكن المفتاح المحدد مرتبطًا بالفعل بقيمة (أو تم تعيينه إلى قيمة فارغة)، فسيتم ربطه بالقيمة المحددة وإرجاع قيمة فارغة وإلا فسيتم إرجاع القيمة الحالية.
إزالة؟ (قيمة الكائن مفتاح الكائن)يزيل الإدخال الخاص بالمفتاح المحدد فقط إذا كان معينًا حاليًا للقيمة المحددة.
استبدال؟(قيمة مفتاح K V)يستبدل الإدخال الخاص بالمفتاح المحدد فقط إذا كان معينًا حاليًا لبعض القيمة.
استبدال؟(K مفتاح V oldValue V newValue)يستبدل الإدخال الخاص بالمفتاح المحدد فقط إذا تم تعيينه حاليًا للقيمة المحددة.
استبدال الكل؟(BiFunctionوظيفة)يستبدل قيمة كل إدخال بنتيجة استدعاء الوظيفة المحددة على هذا الإدخال حتى تتم معالجة جميع الإدخالات أو تقوم الوظيفة بطرح استثناء.

هويةHashMap مقابل  HashMap

  • يستخدم IdentityHashMap عامل المساواة '==' لمقارنة المفاتيح والقيم بينما يستخدم HashMap طريقة يساوي لمقارنة المفاتيح والقيم داخل الخريطة.
  • نظرًا لأن IdentityHashMap لا يستخدم يساوي () فهو أسرع نسبيًا من HashMap لكائن ذي قيمة متساوية () باهظة الثمن.
  • لا يتطلب IdentityHashMap أن تكون المفاتيح غير قابلة للتغيير لأنها لا تعتمد على يساوي ().

يوضح البرنامج أدناه الفرق بين تنفيذ 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 تنفذ واجهة الخريطة وتستخدم المساواة المرجعية لمقارنة المفاتيح. إنه مشابه لـ HashMap العادي ولكنه يستخدم عامل التشغيل == لمقارنة المفاتيح بدلاً من طريقة يساوي (). وهذا يعني أنه سيتم التعامل مع مفتاحين لهما نفس المحتوى ولكن بمراجع كائنات مختلفة كمفاتيح مميزة في 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 الذي يقوم بتعيين مفاتيح السلسلة إلى قيم عدد صحيح. نضيف زوجين من القيمة الرئيسية إلى الخريطة باستخدام كائنين مختلفين من السلسلة لهما نفس المحتوى. نقوم بعد ذلك باسترداد القيم من الخريطة باستخدام نفس كائنات السلسلة ومختلفة. نجد أنه يمكننا استرداد القيم من الخريطة باستخدام مفتاحين مختلفين لهما نفس المحتوى ولكن لا يمكننا استرداد قيمة باستخدام كائن سلسلة له نفس المحتوى ولكنه مرجع كائن مختلف.

لاحظ أن سلوك IdentityHashMap مختلف قليلاً عن HashMap العادي وهو مفيد بشكل عام فقط في مواقف معينة حيث تكون المساواة المرجعية مهمة. في معظم الحالات، تكون HashMap العادية كافية وأكثر ملاءمة.

التحكم في البرنامج المخزن

 

إنشاء اختبار