في هذا المثال، سنقوم بفحص كيفية عمل طريقة get(key)
في IdentityHashMap
في مواقف محددة. أولاً وقبل كل شيء، دعونا نلقي نظرة على الشيفرة التي قدمتها.
قمت بإنشاء كائنات HashMap
و IdentityHashMap
، ومن ثم وضعت مفاتيح وقيم في هذين الكائنين باستخدام الأسطر التالية:
javahashmapObject.put(new String("key"), "Google");
hashmapObject.put(new String("key"), "Facebook");
identityObject.put(new String("identityKey"), "Google");
identityObject.put(new String("identityKey"), "Facebook");
في حالة HashMap
، يعمل هذا بشكل عادي ولكن في حالة IdentityHashMap
، فإن القيمة السابقة التي قدمتها للمفتاح "identityKey"
ستستبدل القيمة الجديدة. يتم ذلك بناءً على المقارنة بالهوية في IdentityHashMap
، حيث يتم التحقق من هوية الكائن نفسه بدلاً من استخدام الطريقة equals()
.
الآن، بالنسبة للسؤال الرئيسي حول سبب عودة قيمة null
عند استخدام طريقة get("identityKey")
في IdentityHashMap
، يرجى مراعاة أنك قد قمت بإنشاء كائنات String
جديدة لكل مفتاح. في Java، يتم التعامل مع السلاسل باعتبارها ككائنات لديها هوية خاصة بها.
عند استخدام get("identityKey")
في IdentityHashMap
، يتم التحقق من هوية الكائن المستخدم كمفتاح. في هذا السياق، لدينا كائنات String
مختلفة لكل مفتاح "identityKey"
، وبالتالي تُعتبر هذه الهويات مختلفة ولا تتطابق، مما يؤدي إلى عدم العثور على المفتاح وبالتالي إلى عودة قيمة null
.
لتفادي هذا، يجب استخدام نفس الكائن كمفتاح في IdentityHashMap
. في هذه الحالة، ستكون هويتها هوية المفتاح المحدد، وبالتالي ستكون القيمة متاحة بشكل صحيح باستخدام get("identityKey")
.
المزيد من المعلومات
بالطبع، سنقوم الآن بتوسيع فهمنا لهذا المثال ونستكشف المزيد من المعلومات حول كيفية عمل IdentityHashMap
وسبب عودة قيمة null
عند استخدام طريقة get("identityKey")
.
أولًا، يُلاحظ أن IdentityHashMap
تستخدم المفاتيح بناءً على مقارنة الهوية، وليس بناءً على القيمة الفعلية للمفتاح. بمعنى آخر، إذا كان لديك كائنين String
يحملان نفس القيمة، فإن IdentityHashMap
سيعتبرهما مفاتيح مختلفة إذا كانت هويتهما مختلفة.
التعديل التالي في الشيفرة قد يوضح هذا النقطة بشكل أفضل:
javaString key1 = new String("identityKey");
String key2 = new String("identityKey");
identityObject.put(key1, "Google");
identityObject.put(key2, "Facebook");
في هذه الحالة، key1
و key2
هما كائنين String
مختلفين من حيث الهوية، ولكنهما يحملان نفس القيمة "identityKey"
. عند استخدام get("identityKey")
في IdentityHashMap
، ستكون الهوية هي التي تلعب دورًا أساسيًا، وسترجع القيمة بشكل صحيح.
التأكيد على فهم الاختلاف بين المقارنة بالهوية والمقارنة بالقيمة يسهم في تحديد الحالات التي تحتاج فيها إلى استخدام IdentityHashMap
، حيث يكون للهوية أهمية خاصة في تحديد المفاتيح.