مجموعات Java - hashCode () و equals () - كيفية تجاوز يساوي () و hashcode () طريقة في Java؟

نشرت: 2018-08-08
مجموعات Java hashCode و يساوي

equals() و hashCode() في Java هما طريقتان أساسيتان تم الإعلان عنه في فئة الكائن ومكتبة Java جزئية أو أساسية.

إذا كان لديك أي من المخاوف أدناه في Java فأنت في المكان الصحيح.

  • ممارسات Java -> تنفيذ يساوي
  • تجاوز - تجاوز يساوي و hashCode في جافا
  • كيفية تجاوز طريقة يساوي () في جافا
  • كيفية تجاوز طريقة hashCode () في جافا
  • كيفية تجاوز طريقة يساوي و hashCode في جافا
  • كيف ولماذا تجاوز طريقة التساوي في جافا
  • لماذا يتم دائمًا تجاوز رمز التجزئة () إذا كان التجاوز يساوي ()؟

دعونا نلقي نظرة على مثال بسيط لفهم أولاً Reference Equality Logical Equality . يقارن عامل المساواة (==) المراجع (العناوين في الذاكرة) للسلسلتين كرقمين مختلفين - يُعرف هذا Reference equality .

تقارن Logical equality بيانات الكائنات بدلاً من قيمة المراجع.

انتاج:

ترتبط قيمة hashCode و equals ارتباطًا وثيقًا:

  • إذا قمت بتجاوز القيمة Equal ، فيجب عليك تجاوز hashCode .
  • يجب أن ينشئ hashCode قيمًا متساوية للكائنات المتساوية.
  • يجب أن يعتمد يساوي و hashCode على same set of significant fields . يجب عليك استخدام نفس مجموعة الحقول في كلتا الطريقتين. لا يلزمك استخدام جميع الحقول. على سبيل المثال ، من المحتمل جدًا حذف الحقل المحسوب الذي يعتمد على الآخرين من equals و hashCode .

عند تطبيق المساواة ، تتم مقارنة الحقول بشكل مختلف وفقًا لنوعها:

  • حقول الكائن ، بما في ذلك المجموعات: استخدام يساوي
  • تعدادات النوع الآمن: استخدم إما يساوي أو == (تصل إلى نفس الشيء ، في هذه الحالة)
  • حقول كائن ربما خالية: استخدم كل من == و يساوي
  • حقول المصفوفة: استخدم Arrays.equals
  • الحقول البدائية غير العائمة أو المزدوجة : استخدم ==
  • float : تحويل إلى كثافة العمليات باستخدام Float.floatToIntBits , ثم استخدم ==
  • double : التحويل إلى لون طويل باستخدام Double.doubleToLongBits ، ثم استخدم ==

تنفيذ hashCode :

  • إذا تجاوزت فئة ما ، فيجب أن تتجاوز hashCode
  • عندما يتم تجاوز كلاهما ، يجب أن يستخدم equals و hashCode نفس مجموعة الحقول
  • إذا تساوى كائنان ، فيجب أن تكون قيم hashCode متساوية أيضًا
  • إذا كان الكائن غير قابل للتغيير ، فإن hashCode هو مرشح للتخزين المؤقت والتهيئة البطيئة

من المفاهيم الخاطئة الشائعة أن hashCode يوفر معرفًا فريدًا للكائن. لم يحدث ذلك.

بموجب العقد العام ، يجب أن تكون طريقة equals() في Java انعكاسية ومتماثلة ومتعدية ومتسقة وأي مرجع غير فارغ يجب أن يُرجع خطأً. بمعنى آخر ، بالنسبة للقيم التعسفية لـ a و b و c ، يجب أن تجتاز الاختبارات التالية دائمًا:

للحصول على أفضل ممارسة ، استخدم الخطوات التالية لتنفيذ طريقة equals () الخاصة بك:

  • استخدم هذا == للتحقق من المساواة المرجعية
  • استخدم instanceof لاختبار نوع الوسيطة الصحيح
  • تحويل الوسيطة إلى النوع الصحيح
  • قارن بين المجالات الهامة للمساواة

هنا مثال كامل.

CrunchifyImplementEqualsHashCode.java

إخراج وحدة التحكم Eclipse: