سؤال

هل كنت تعلم هذا :

Map<Object,Object> m1 = new HashMap<Object, Object>();
Map<Object,Object> m2 = new HashMap<Object, Object>();
System.out.println("m1.equals(m2) = "+m1.equals(m2));
System.out.println("m1.keySet().equals(m2.keySet()) = "
            +m1.keySet().equals(m2.keySet()));
System.out.println("m1.entrySet().equals(m2.entrySet()) = "
            +m1.entrySet().equals(m2.entrySet()));
System.out.println("m1.values().equals(m2.values()) = "
            +m1.values().equals(m2.values()));

سوف الإخراج:

m1.equals(m2) = true
m1.keySet().equals(m2.keySet()) = true
m1.entrySet().equals(m2.entrySet()) = true
m1.values().equals(m2.values()) = false

هذا ناتج عن حقيقة أن AbstractCollection (أيّ HashMap$Values يرث من) لا يتجاوز #equals().

هل لديك فكرة لماذا هذا؟

هل كانت مفيدة؟

المحلول

حسب عقد Collection#equals(), ، لا يوجد غرض عام متساوي () أساليب ل CollectionS ، وبالتالي AbstractCollection لا يمكن توفير واحدة.

لاحظ أن HashMap$Values ليست مجموعة ولا قائمة ، وبالتالي المأزق وبسبب ما لا يدعمها equals().

نصائح أخرى

تمديد كل من AbstractList و Abstractset AsstractCollection ، ولديهما سلوكيات مختلفة لطرق المساواة () ، المحددة بواسطة الواجهات قائمة و تعيين. الواجهة ل مجموعة يقول:

بينما لا تضيف واجهة التجميع أي شروط إلى العقد العام للكائن. إذا اختاروا تجاوز الكائن.

لذلك يجب أن لا تتأثر مجردة Collection بالتأكيد (). ومع ذلك ، لا أعرف حقًا لماذا لن تنفذ قيم HashMap $ متساوية () نفسها.

لست متأكدًا مما إذا كان هذا هو السبب الرسمي ، لكن AbstractCollection يتجنب إضافة قيود دلالية على الفئات الفرعية المحتملة. يتم تحديد دلالات المساواة من خلال طبيعة بنية بيانات الوراثة الملموسة ، وعلى وجه الخصوص بناءً على ما إذا كان بنيتك قد تم طلبه وما إذا كان يسمح بالتكرار.

على سبيل المثال ، فكر في Treeset ، LinkedList ، حقيبة ، إلخ.

راجع للشغل ، فيما يتعلق بالرمز الذي نشرته ، ما هو النوع الفعلي لأي شيء يتم إرجاعه بالقيم؟ يجب أن يكون ذلك فئة فرعية مع تطبيق ملموس .. إذا كانت خريطتك فارغة عند تشغيل هذا الرمز ، فمن المحتمل أن تنتهي بشيء لا يعتبر مجموعتين فارغتين متساويتين.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top