مجموعات Java - hashCode () و equals () - كيفية تجاوز يساوي () و hashcode () طريقة في Java؟
نشرت: 2018-08-08
equals()
و hashCode()
في Java هما طريقتان أساسيتان تم الإعلان عنه في فئة الكائن ومكتبة Java جزئية أو أساسية.
إذا كان لديك أي من المخاوف أدناه في Java فأنت في المكان الصحيح.
- ممارسات Java -> تنفيذ يساوي
- تجاوز - تجاوز يساوي و hashCode في جافا
- كيفية تجاوز طريقة يساوي () في جافا
- كيفية تجاوز طريقة hashCode () في جافا
- كيفية تجاوز طريقة يساوي و hashCode في جافا
- كيف ولماذا تجاوز طريقة التساوي في جافا
- لماذا يتم دائمًا تجاوز رمز التجزئة () إذا كان التجاوز يساوي ()؟
دعونا نلقي نظرة على مثال بسيط لفهم أولاً Reference Equality
Logical Equality
. يقارن عامل المساواة (==) المراجع (العناوين في الذاكرة) للسلسلتين كرقمين مختلفين - يُعرف هذا Reference equality
.
تقارن Logical equality
بيانات الكائنات بدلاً من قيمة المراجع.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 |
package com . crunchify . tutorials ; /** * @author Crunchify.com */ public class CrunchifyLogicalVsReferenceEqality { public static void main ( String [ ] args ) { String strA = new String ( "eBay" ) ; String strB = new String ( "eBay" ) ; String strC = new String ( "Paypal" ) ; // Create a String reference and assign an existing String's reference to it // so that both references point to the same String object in memory. String strD = strA ; // Print out the results of various equality checks // Reference Equality System . out . println ( "Reference Equality Result:" ) ; System . out . println ( strA == strB ) ; System . out . println ( strA == strC ) ; System . out . println ( strA == strD ) ; // Logical Equality System . out . println ( "\nLogical Equality Result:" ) ; System . out . println ( strA . equals ( strB ) ) ; System . out . println ( strA . equals ( strC ) ) ; System . out . println ( strA . equals ( strD ) ) ; } } |
انتاج:
1 2 3 4 5 6 7 8 9 |
Reference Equality Result : false false true Logical Equality Result : true false true |
ترتبط قيمة 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 ، يجب أن تجتاز الاختبارات التالية دائمًا:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
/ reflexive property assertTrue ( a . equals ( a ) ) ; // symmetric property assertTrue ( a . equals ( b ) == b . equals ( a ) ) ; // transitive property if ( a . equals ( b ) && b.equals(c) ) { assertTrue( a.equals(c) ); } // consistency property assertTrue ( a . equals ( b ) == a . equals ( b ) ) ; // non-null property assertFalse ( a . equals ( null ) ) ; |
للحصول على أفضل ممارسة ، استخدم الخطوات التالية لتنفيذ طريقة equals () الخاصة بك:
- استخدم هذا == للتحقق من المساواة المرجعية
- استخدم
instanceof
لاختبار نوع الوسيطة الصحيح - تحويل الوسيطة إلى النوع الصحيح
- قارن بين المجالات الهامة للمساواة
هنا مثال كامل.
CrunchifyImplementEqualsHashCode.java
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 |
package crunchify . com . tutorials ; /** * * @author Crunchify.com * How to Override equals() method in Java? * How to Override hasCode() method in Java? * version:1.2 * */ public class CrunchifyImplementEqualsHashCode { public static void main ( String [ ] args ) { CrunchifyImplementEqualsHashCode crunchifyTest = new CrunchifyImplementEqualsHashCode ( ) ; Crunchify one = new Crunchify ( 1 ) ; Crunchify two = new Crunchify ( 1 ) ; crunchifyTest . test1 ( one , two ) ; Crunchify three = new Crunchify ( 1 ) ; Crunchify four = new Crunchify ( 2 ) ; crunchifyTest . test2 ( three , four ) ; } public void test1 ( Crunchify one , Crunchify two ) { if ( one . equals ( two ) ) { System . out . println ( "Test1: One and Two are equal" ) ; } else { System . out . println ( "Test1: One and Two are not equal" ) ; } } public void test2 ( Crunchify three , Crunchify four ) { if ( three . equals ( four ) ) { System . out . println ( "Test2: Three and Four are equal" ) ; } else { System . out . println ( "Test2: Three and Four are not equal" ) ; } } } class Crunchify { private int value ; Crunchify ( int val ) { value = val ; } public int getValue ( ) { return value ; } // The method does override or implement a method declared in a supertype. @Override public boolean equals ( Object o ) { // null check if ( o == null ) { return false ; } // this instance check if ( this == o ) { return true ; } // instanceof Check and actual value check if ( ( o instanceof Crunchify ) && (((Crunchify) o).getValue() == this.value)) { return true; } else { return false ; } } @Override public int hashCode ( ) { int result = 0 ; result = ( int ) ( value / 11 ) ; return result ; } } |
إخراج وحدة التحكم Eclipse:
1 2 |
Test1 : One and Two are equal Test2 : Three and Four are not equal |