سؤال

عادةً ما يكون التنفيذ الافتراضي لـ Object.hashCode() هي إحدى وظائف العنوان المخصص للكائن في الذاكرة (على الرغم من أن هذا غير مطلوب من قبل JLS).نظرًا لأن الجهاز الظاهري يقوم بتحويل الكائنات إلى الذاكرة، فلماذا يتم إرجاع القيمة بواسطة System.identityHashCode() لا تتغير أبدًا خلال عمر الكائن؟

إذا كانت عملية حسابية "لطلقة واحدة" (الكائن hashCode يتم حسابها مرة واحدة ومخبأة في رأس الكائن أو شيء من هذا القبيل)، فهل هذا يعني أنه من الممكن أن يكون لكائنين نفس الشيء identityHashCode (إذا تم تخصيصها لأول مرة على نفس العنوان في الذاكرة)؟

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

المحلول

تقوم JVMs الحديثة بحفظ القيمة في رأس الكائن.أعتقد أن القيمة يتم حسابها عادةً فقط عند الاستخدام الأول من أجل تقليل الوقت المستغرق في تخصيص الكائنات إلى الحد الأدنى (أحيانًا يصل إلى ما يصل إلى اثنتي عشرة دورة).يمكن تجميع Sun JVM المشترك بحيث يكون رمز تجزئة الهوية دائمًا 1 لجميع الكائنات.

يمكن أن تحتوي الكائنات المتعددة على نفس رمز تجزئة الهوية.هذه هي طبيعة رموز التجزئة.

نصائح أخرى

في الإجابة على السؤال الثاني، بغض النظر عن التنفيذ، من الممكن أن يكون لكائنات متعددة نفس الهويةHashCode.

يرى علة 6321873 لمناقشة موجزة حول الصياغة في javadoc، وبرنامج لإثبات عدم التفرد.

يتكون رأس الكائن في HotSpot من مؤشر فئة وكلمة "علامة".

يمكن العثور على الكود المصدري لبنية البيانات لكلمة العلامة في markOop.hpp ملف.يوجد في هذا الملف تعليق يصف تخطيط الذاكرة لكلمة العلامة:

hash:25 ------------>| age:4 biased_lock:1 lock:2 (normal object)

هنا يمكننا أن نرى أن رمز تجزئة الهوية لكائنات Java العادية على نظام 32 بت يتم حفظه في كلمة العلامة ويبلغ طوله 25 بت.

المبدأ التوجيهي العام لتنفيذ وظيفة التجزئة هو:

  • يجب أن يُرجع نفس الكائن رمز تجزئة متسقًا, ، يجب ألا تتغير بمرور الوقت أو تعتمد على أي معلومات متغيرة (على سبيل المثال.خوارزمية مصنفة بواسطة رقم أو قيم عشوائية لحقول الأعضاء القابلة للتغيير
  • يجب أن تحتوي وظيفة التجزئة على توزيع عشوائي جيد, ، وأعني بذلك أنه إذا كنت تعتبر رمز التجزئة عبارة عن مجموعات، فيجب تعيين كائنين إلى مجموعات مختلفة (رموز التجزئة) قدر الإمكان.يجب أن يكون احتمال أن يكون لكائنين نفس رمز التجزئة أمرًا نادرًا - على الرغم من ذلك يستطيع يحدث.

بقدر ما أعرف، يتم تنفيذ ذلك لإرجاع المرجع، الذي لن يتغير أبدًا طوال عمر الكائن.

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