فئة IdentityHashMap في جافا

فئة 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 في جافا

ينفذ قابل للتسلسل قابل للاستنساخ رسم خريطة واجهات ويمتد 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):  إنشاء خريطة فارغة جديدة بالحجم الأقصى المتوقع المحدد. 

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

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

IdentityHashMap ihm = 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(...));

طرق الهوية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 العادية كافية وأكثر ملاءمة.

 

إنشاء اختبار