يفهم
الغرض من hashcode () هو الحصول على رمز التجزئة ، والمعروف أيضًا باسم رمز التجزئة ؛ انها في الواقع يعيد عدد صحيح int. تتمثل وظيفة رمز التجزئة في تحديد موضع الفهرس للكائن في جدول التجزئة.
يتم تعريف HashCode () في JDK's Object.java ، مما يعني أن أي فئة في Java تحتوي على وظيفة HashCode ().
على الرغم من أن كل فئة من فئة Java تحتوي على وظيفة HashCode (). ومع ذلك ، فإن hashcode () للفئة مفيدة فقط عند إنشاء وإنشاء "جدول التجزئة" (انظر الوصف أدناه لـ "جدول التجزئة") (تتمثل الوظيفة في تحديد موضع كل كائن من الفئة في جدول التجزئة ؛ في حالات أخرى (على سبيل المثال ، كائن واحد من الفئة ، أو إنشاء مجموعة من الكائنات من الفئة ، وما إلى ذلك) ، و hashcode ().
تشير قائمة التجزئة أعلاه إلى: فصول في مجموعات Java التي هي أساسًا قوائم التجزئة ، مثل HashMap و Hashtable و Hashset.
بمعنى آخر: hashcode () مفيد فقط في عازف التجزئة ، ولكنه عديم الفائدة في حالات أخرى. تتمثل وظيفة HashCode () في جدول التجزئة في الحصول على رمز التجزئة للكائن ، ثم تحديد موضع الكائن في جدول التجزئة.
نعلم جميعًا أن جدول التجزئة يخزن أزواج القيمة الرئيسية ، والتي تتميز بها: يمكن أن يسترجع بسرعة "القيم" المقابلة بناءً على "المفاتيح". هذا يستخدم رمز التجزئة!
يتم تنفيذ جوهر جدول التجزئة من خلال صفيف. عندما نريد الحصول على "قيمة" معينة في جدول التجزئة ، نريد بالفعل الحصول على العنصر في موضع معين في الصفيف. يتم الحصول على موضع الصفيف بواسطة "المفتاح" ؛ علاوة على ذلك ، يتم حساب موضع الصفيف بواسطة رمز التجزئة المقابل لـ "المفتاح".
أدناه ، سوف نأخذ hassset كمثال لشرح دور HashCode () بعمق.
لنفترض أن هناك بالفعل 1000 عنصر في Hashset. ماذا علي أن أفعل عند إدخال العنصر 1001؟ نظرًا لأن Hashset عبارة عن مجموعة محددة ، فهي تسمح لعناصر مكررة.
"قارن العنصر 1001 واحد تلو الآخر مع 1000 عنصر سابق"؟ من الواضح أن هذه الكفاءة غير فعالة بنفس القدر. جدول التجزئة يحل هذه المشكلة بشكل جيد للغاية. يقوم بحساب موضع العنصر في جدول التجزئة استنادًا إلى رمز التجزئة ، ثم يقوم بإدراج العنصر في هذا الموضع. لنفس العنصر ، بطبيعة الحال ، يتم حفظ واحد فقط.
من هذا يمكننا أن نرى أنه إذا كان هناك عنصرين متساويين ، فيجب أن تكون رموز التجزئة متساوية ؛ لكن العكس ليس كذلك. في جدول التجزئة ،
1. إذا كان كائنين متساويين ، فيجب أن تكون قيم HashCode () هي نفسها ؛
2. إذا كان الكائنان hashcode () متساويين ، فهي ليست بالضرورة متساوية.
ملاحظة: هذا هو الحال في جداول التجزئة. يجب أن يكون هذا صحيحًا في قوائم غير هاش!
مثال
دعونا نلقي نظرة على مثال محدد.
علامة التجزئة من الطبقة العامة {private int i ؛ public int geti () {return i ؛ } public void seti (int i) {this.i = i ؛ } public int hashcode () {return i ٪ 10 ؛ } public final static void main (string [] args) {hashtest a = new hashtest () ؛ علامة التجزئة B = علامة التجزئة الجديدة () ؛ A.Seti (1) ؛ B.Seti (1) ؛ set <ashtest> set = new hashset <ashtest> () ؛ set.add (a) ؛ set.add (b) ؛ System.out.println (A.HashCode () == B.HashCode ()) ؛ system.out.println (A.equals (b)) ؛ system.out.println (set) ؛ }}نتيجة هذا الإخراج:
صحيح خطأ [com.ubs.sae.test.hashtest@1 ، com.ubs.sae.test.hashtest@1]
في المثال أعلاه ، نقوم بإعادة كتابة طريقة Hashcode. من النتائج المذكورة أعلاه ، يمكننا أن نرى أنه على الرغم من أن ترميزات الكائنين متساوية ، إلا أن الكائنين ليسا متساويين في الواقع ؛ ، لم نعيد كتابة طريقة متساوية ، وبعد ذلك سوف نسمي طريقة المساواة في الكائن لمقارنة ما إذا كانت مراجع الكائنين هي نفسها ، ويوضحان أن هاتين كائنين مختلفين ، والمراجعين للكائنات هي بالتأكيد غير مؤكدة. هنا وضعنا الكائن الذي تم إنشاؤه في مجموعة التجزئة ، ويمكن تخزين الكائن الفريد فقط في مجموعة التجزئة ، أي الكائن نفسه (الذي ينطبق على طريقة متساوية) سيخزن واحدة فقط ، ولكن هنا ، يوجد في الواقع كائنين A و B يتم وضعهما في مجموعة التجزئة ، وبالتالي فإن مجموعة التجزئة تفقد معناها.
في هذا الوقت ، نضيف طريقة متساوية:
علامة التجزئة من الطبقة العامة {private int i ؛ public int geti () {return i ؛ } public void seti (int i) {this.i = i ؛ } <span style = "color:#3366ff ؛"> <strong> public boolean يساوي (كائن كائن) {if (object == null) {return false ؛ } if (object == this) {return true ؛ } if (! (Object extryof hashtest)) {return false ؛ } علامة التجزئة الأخرى = (علامة التجزئة) ؛ if (other.geti () == this.geti ()) {return true ؛ } إرجاع خطأ ؛ } </strong> </span> public int hashcode () {return i ٪ 10 ؛ } public final static void main (string [] args) {hashtest a = new hashtest () ؛ علامة التجزئة B = علامة التجزئة الجديدة () ؛ A.Seti (1) ؛ B.Seti (1) ؛ set <ashtest> set = new hashset <ashtest> () ؛ set.add (a) ؛ set.add (b) ؛ System.out.println (A.HashCode () == B.HashCode ()) ؛ system.out.println (A.equals (b)) ؛ system.out.println (set) ؛ }}ستكون النتائج التي تم الحصول عليها في هذا الوقت كما يلي:
صحيح صحيح [com.ubs.sae.test.hashtest@1]
من النتائج ، يمكننا أن نرى أن الكائنين متساوين تمامًا تمامًا ، ويتم تخزين كائن واحد فقط في Hashset.
لخص
1. يستخدم وجود رمز Hashcode بشكل أساسي للبحث عن الثبات ، مثل الهاشتو ، و hashmap ، وما إلى ذلك. يستخدم Hashcode لتحديد عنوان تخزين كائن في بنية تخزين التجزئة ؛
2. إذا كان الكائنان متماثلان ، فهو ينطبق على طريقة متساوية (java.lang.object) ، فيجب أن تكون ترميز هاتين الكائنين هي نفسها ؛
3. إذا تمت إعادة كتابة طريقة متساوية الكائن ، فيجب إعادة كتابة رمز هاشف الكائن بأكبر قدر ممكن ، ويجب أن يكون الكائن الذي يستخدمه رمز Hashde متسقًا مع طريقة متساوية ، وإلا فإنه سينتهك النقطة الثانية المذكورة أعلاه ؛
4. هو رمز التجزئة لكائنين هو نفسه ، وهو ما لا يعني بالضرورة أن الكائنين متماثلان ، أي أنه لا ينطبق بالضرورة على طريقة متساوية (java.lang.object). يمكن أن يشير فقط إلى أن هذين الكائنين في بنية تخزين التجزئة ، مثل علامة التصنيف ، ويتم "تخزينها في نفس السلة".