المحتوى الرئيسي لهذه المقالة هو طريقة التقييم الصحيحة لـ Hashcode في Java ، على النحو التالي.
هناك تحسين لقوائم التجزئة التي يمكنها تخزين رمز التجزئة للكائن. إذا كان رمز التجزئة لا يتطابق ، فلن يتحقق من تكافؤ الكائن ويعتبره كائنًا مختلفًا بشكل مباشر. إذا كان رمز التجزئة (hashcode) متساويًا ، فسوف يكتشف ما إذا كانت الكائنات متساوية.
إذا كان للكائنات نفس رمز التجزئة (HashCode) ، فسيتم تعيينها إلى نفس دلو التجزئة. إذا كانت رمز التجزئة لجميع الكائنات في قائمة التجزئة هي نفسها ، فسوف تتحول قائمة التجزئة إلى قائمة مرتبطة ، مما يقلل بشكل كبير من كفاءة الاستعلام.
عادة ما تميل وظيفة التجزئة الجيدة إلى "توليد رموز تجزئة غير متكافئة للكائنات التي لا تريد أن تنتظر". من الناحية المثالية ، يجب أن توزع وظيفة التجزئة الحالات بالتساوي في المجموعة التي لا تريد أن تكون كذلك على جميع التجزئة الممكنة ، ولكن من الصعب للغاية تحقيق هذا الموقف المثالي تمامًا. فيما يلي طريقة تجزئة بسيطة وفعالة نسبيًا:
1. حفظ قيمة ثابتة غير صفرية ، مثل 17 ، في متغير من النوع int يسمى النتيجة.
2. لكل مجال مفتاح F في الكائن ( في إشارة إلى كل مجال متورط في طريقة متساوية ) ، أكمل الخطوات التالية:
result = 31 * result + c; تتمثل عملية الضرب في الحصول على وظيفة تجزئة أفضل. على سبيل المثال ، إذا كانت وظيفة التجزئة في سلسلة الضرب ، فستكون لجميع الأوتار ذات الترتيب الأبجدي المختلفة نفس رمز التجزئة. السبب في اختيار 31 هنا لأنه رقم رئيسي غريب. إذا كان المضاعف هو رقم زوجي ويخفق الضرب ، فستفقد المعلومات لأن الضرب مع 2 يعادل الإزاحة. فوائد استخدام الأرقام الأولية ليست واضحة ، ولكن يتم استخدام نتائج التجزئة تقليديًا لحساب نتائج التجزئة. 31 لها ميزة جيدة ، أي استخدام التحول والطرح بدلاً من الضرب ، والتي يمكن أن تحقق أداء أفضل: 31 * i == (i << 5) - i. يمكن لـ VMS اليوم تنفيذ هذا التحسين تلقائيًا.إذا كانت الفئة غير قابلة للتغيير (جميع المجالات هي تعديلات نهائية ، وجميع المجالات هي أنواع أساسية أو فئات غير قابلة للتغيير) ، وكانت النفقات العامة لحساب رموز التجزئة مرتفعة نسبيًا ، ثم يجب أن تفكر في ذاكرة التخزين المؤقت في رمز التجزئة داخل الكائن.
الطبقة العامة hashcodedemo {static class hashcodeClass {private Final Boolean Bresult ؛ النهائي النهائي Byte Bytevalue ؛ تشارفالوي النهائي الخاص ؛ اختصار نهائي خاص قصير ؛ نهائي خاص int intvalue ؛ نهائي خاص طويل الطويل. تعويم نهائي خاص تعويم. نهائي خاص مزدوج المزدوج. سلسلة نهائية خاصة نهائي خاص نهائي int [] arrayvalue ؛ // المتقلبة يعني أن المتغير يتم تخزينه واسترجاعه في الذاكرة في كل مرة لضمان أن المتغير هو أحدث عروض ترويدية متقلبة خاصة ؛ hashcodeclass () {bresult = false ؛ Bytevalue = 1 ؛ charvalue = 'a' ؛ قصيرة القيمة = 1 ؛ Intvalue = 1 ؛ Longvalue = 1L ؛ floatvalue = 1.0f ؛ doublevalue = 1.0d ؛ str = getClass (). getName () ؛ ArrayValue = new int [] {1،2،3،4،5} ؛ } Override public int hashcode () {if (hashcode == 0) {// قم بتعيين قيمة أولية غير صفرية لزيادة تعارض النطاق int domain zere = 17 ؛ // إذا تم حذف المضاعف ، فستكون جميع الأوتار ذات الترتيب الأبجدي المختلفة نفس رمز التجزئة النهائي int hash_code = 31 ؛ النتيجة = hash_code * النتيجة + (bresult؟ 1: 0) ؛ النتيجة = hash_code * النتيجة + bytevalue ؛ النتيجة = hash_code * النتيجة + charvalue ؛ النتيجة = hash_code * النتيجة + قصيرة القيمة ؛ النتيجة = hash_code * النتيجة + Intvalue ؛ النتيجة = hash_code * result + (int) (longvalue ^ (longvalue >>> 32)) ؛ النتيجة = hash_code * result + float.floattointBits (floatvalue) ؛ Long DoubleLongValue = double.doubletolongbits (doublevalue) ؛ النتيجة = hash_code * result + (int) (DoubleLongValue ^ (DoubleLongValue >>> 32)) ؛ النتيجة = hash_code * result + (str == null؟ 0: str.hashCode ()) ؛ System.out.println ("str =" + str + "، str.hashCode =" + str.hashCode ()) ؛ النتيجة = hash_code * result + arryvalue.hashCode () ؛ نتيجة العودة } إرجاع hashcode ؛ }} public static void main (string [] args) {hashcodeclass obj = new hashcodeclass () ؛ system.out.println ("obj.hashCode =" + obj.hashCode ()) ؛ system.out.println ("obj ="+obj.toString ()) ؛ }}الإخراج
str = com.demo.test.hashcodedemo $ hashcodeclass ، str.hashCode = -205823051Obj.hashCode = 946611167str = com.demo.test.hashcodedemo $ hashcodeclass ، str.hashcode=-205823051Obj=com.demo.test.hashCodeDemouteMoDhashCodeclass@386c23df
لخص
ما سبق يدور حول هذه المقالة التي تناقش طريقة التقييم الصحيحة لـ Hashcode في Java ، وآمل أن تكون مفيدة للجميع. يمكن للأصدقاء المهتمين الاستمرار في الرجوع إلى الموضوعات الأخرى ذات الصلة على هذا الموقع. إذا كانت هناك أي أوجه قصور ، فيرجى ترك رسالة لإشارةها. شكرا لك يا أصدقائك لدعمكم لهذا الموقع!