بادئ ذي بدء، لفهم دور hashCode، يجب عليك أولاً معرفة المجموعة الموجودة في Java.
بشكل عام، هناك نوعان من المجموعات في Java، أحدهما هو القائمة والآخر هو Set.
هل تعرف الفرق بينهما؟ العناصر الموجودة في المجموعة السابقة مرتبة، ويمكن تكرار العناصر الموجودة في المجموعة الأخيرة، ولكن لا يمكن تكرار العناصر.
إذن هنا مشكلة أكثر خطورة: إذا كنت تريد التأكد من عدم تكرار العناصر، فما هو الأساس الذي يجب أن يكون عليه الحكم على ما إذا كان هناك عنصران متكرران؟
هذه هي طريقة Object.equals. ومع ذلك، إذا قمت بالتحقق مرة واحدة في كل مرة يتم فيها إضافة عنصر، فعند وجود العديد من العناصر، سيكون عدد المقارنات بين العناصر المضافة إلى المجموعة كبيرًا جدًا.
بمعنى آخر، إذا كان هناك الآن 1000 عنصر في المجموعة، فعند إضافة العنصر 1001 إلى المجموعة، سيتم استدعاء طريقة يساوي 1000 مرة. ومن الواضح أن هذا سوف يقلل بشكل كبير من الكفاءة.
ولذلك، تعتمد جافا مبدأ جدول التجزئة. التجزئة هي في الواقع اسم شخص لأنه اقترح مفهوم خوارزمية التجزئة، فقد تم تسميتها باسمه.
تقوم خوارزمية التجزئة، المعروفة أيضًا باسم خوارزمية التجزئة، بتعيين البيانات مباشرة إلى عنوان وفقًا لخوارزمية محددة. إذا قمت بشرح خوارزمية التجزئة بالتفصيل، فستتطلب المزيد من طول المقالة، لذلك لن أقدمها هنا.
يمكن للمبتدئين أن يفهموا أن طريقة hashCode تُرجع فعليًا العنوان الفعلي لتخزين الكائنات (في الواقع قد لا يكون الأمر كذلك).
بهذه الطريقة، عند إضافة عنصر جديد إلى المجموعة، يتم استدعاء طريقة hashCode لهذا العنصر أولاً، ويمكن تحديد الموقع الفعلي الذي يجب وضعه فيه على الفور.
إذا لم يكن هناك عنصر في هذا الموضع، فيمكن تخزينه مباشرة في هذا الموضع دون أي مقارنة؛ إذا كان هناك عنصر بالفعل في هذا الموضع،
ما عليك سوى استدعاء طريقة يساوي لمقارنتها بالعنصر الجديد. إذا كان هو نفسه، فلن يتم حفظه. وإذا لم يكن هو نفسه، فسيتم تجزئة العناوين الأخرى.
لذلك هناك مشكلة حل الصراع هنا. بهذه الطريقة، يتم تقليل عدد الاستدعاءات الفعلية لطريقة التساوي بشكل كبير، مرة واحدة أو مرتين فقط تقريبًا.
لذلك، توفر Java هذا لأسلوب eqauls وأسلوب hashCode:
1. إذا كان هناك كائنان متماثلان، فيجب أن تكون قيم رمز التجزئة الخاصة بهما هي نفسها؛ 2. إذا كان رمز التجزئة لكائنين متماثلًا، فليس بالضرورة أن تكون الكائنات المذكورة أعلاه هي نفسها، مما يشير إلى استخدام المقارنة طريقة التكافؤ.
بالطبع ليس عليك القيام بذلك كما هو مطلوب، ولكن ستجد أن نفس الكائن يمكن أن يظهر في مجموعة المجموعة. وفي الوقت نفسه، سيتم تقليل كفاءة إضافة عناصر جديدة بشكل كبير. يتم استخدام طريقة hashcode لتحديد ما إذا كان هناك كائنان متساويان.
ثم قد تقول، أليس هناك طريقة تسمى يساوي؟ نعم، يتم استخدام هاتين الطريقتين لتحديد ما إذا كان الجسمان متساويان أم لا. لكنهم مختلفون. بشكل عام، يتم استدعاء الأسلوب يساوي من قبل المستخدم إذا كنت تريد تحديد ما إذا كان هناك كائنين متساويين، أم لا.
يمكنك تجاوز طريقة يساوي واستدعائها في التعليمات البرمجية الخاصة بك لتحديد ما إذا كانت متساوية. ببساطة، تُستخدم طريقة التساوي بشكل أساسي لتحديد ما إذا كان كائنان متساويان من السطح أو المحتوى. على سبيل المثال، هناك فئة الطلاب،
السمات الوحيدة هي الاسم والجنس، لذلك يمكننا أن نعتقد أنه طالما أن الاسم والجنس متساويان، فإن الشيئين متساويان. لا يتم استدعاء طريقة رمز التجزئة بشكل عام من قبل المستخدمين، على سبيل المثال، في hashmap، نظرًا لأنه لا يمكن تكرار المفتاح،
عندما حكم على ما إذا كان المفتاح قد تم تكراره، حكم على طريقة رمز التجزئة، واستخدم أيضًا طريقة التساوي. ما لا يمكن تكراره هنا يعني أنه طالما أن واحدًا يساوي ورمز التجزئة غير متساوٍ، فسيكون الأمر على ما يرام! وبكل بساطة، فإن رمز التجزئة يعادل ترميز كائن، تمامًا مثل md5 في الملف، وهو يختلف عن يساوي لأنه يُرجع نوع int، وهو أمر غير بديهي بالمقارنة. نقوم عمومًا بالكتابة فوق رمز التجزئة عند تجاوز يساوي لجعل منطقهم متسقًا. على سبيل المثال،
لا تزال تستخدم المثال الآن، إذا كان الاسم والجنس متساويين، حتى لو كان الكائنان متساويين، فيجب أن تقوم طريقة رمز التجزئة أيضًا بإرجاع قيمة رمز التجزئة للاسم بالإضافة إلى قيمة رمز التجزئة للجنس، لذا فمن المنطقي أنها متسقة .
لتحديد ما إذا كان هناك كائنين متساويين، فقط استخدم ==