جاوا ۾ برابر () ۽ hashCode () طريقن کي ختم ڪرڻ
Equals
۽ hashCode
اهي بنيادي طريقا آهن جيڪي ڪلاس ۾ بيان ڪيا ويا آهن Object
۽ معياري جاوا لائبريرين ۾ شامل آهن. اهو طريقو еquals()
استعمال ڪيو ويندو آهي شين جي مقابلي لاءِ ۽ hashCode
اعتراض لاءِ انٽيجر ڪوڊ ٺاهڻ لاءِ. اهي طريقا جاوا معياري لائبريرين ۾ وڏي پيماني تي استعمال ڪيا ويا آهن جڏهن شيون داخل ڪرڻ ۽ حاصل ڪرڻ ۾ HashMap
. اهو طريقو equal
پڻ استعمال ڪيو ويندو آهي انهي ڳالهه کي يقيني بڻائڻ لاءِ ته صرف منفرد شيون محفوظ ٿيل آهن HashSet
ٻين Set
عملن ۾، ۽ انهي سان گڏ ڪنهن ٻئي صورت ۾ جتي شين جي مقابلي ڪرڻ جي ضرورت آهي. equals()
ڪلاس ۾ طريقي جو ڊفالٽ عمل درآمد java.lang.Object
ميموري ايڊريس جي حوالن جي ڀيٽ ڪري ٿو جيڪي متغير ذخيرو ڪن ٿا ۽ true
صرف ان صورت ۾ واپس اچن ٿا جڏهن ايڊريس ملن ٿا، ٻين لفظن ۾، متغير ساڳئي اعتراض ڏانهن اشارو ڪن ٿا. جاوا سفارش ڪري ٿو equals()
۽ طريقن کي ختم ڪرڻ جي hashCode()
جيڪڏھن توھان توقع ڪريو ته مقابلي کي قدرتي منطق يا ڪاروباري منطق جي مطابق ڪيو وڃي. معياري جاوا لائبريرين ۾ ڪيترائي ڪلاس انھن کي اوور رائيڊ ڪندا آھن، مثال طور ڪلاس String
اووررائڊ ڪري ٿو equals
ته جيئن true
ٻن شين جي مواد جو مقابلو ڪيو وڃي ته اھو واپس اچي. ريپر ڪلاس عددي مقابلي کي انجام ڏيڻ جي Integer
طريقي کي ختم ڪري ٿو equal
، وغيره. جيئن ته جاوا HashMap
پڻ انحصار ڪري ٿو ۽ طريقن سان مقابلو ڪرڻ لاءِ انهن جي ۽ ، جاوا پيش ڪري ٿو هيٺيون ضابطا انهن طريقن کي ختم ڪرڻ لاءِ: HashTable
equals()
hashCode()
key
values
- Reflexivity: اعتراض پاڻ جي برابر هجڻ گهرجي.
- Symmetrical: جيڪڏهن
a.equals(b)
اهو موٽائي ٿوtrue
، تهb.equals(a)
اهو پڻ موٽڻ گهرجيtrue
. - Transitivity: جيڪڏهن
a.equals(b)
اهو واپس اچي ٿوtrue
۽b.equals(c)
پڻ موٽائي ٿوtrue
، پوءc.equals(a)
اهو پڻ موٽڻ گهرجيtrue
. - تسلسل: هڪ طريقي سان بار بار ڪالن کي
equals()
ساڳيو قدر واپس ڪرڻ گهرجي، جيستائين اعتراض جي ملڪيت جي قدرن مان ڪجهه تبديل نه ڪيا وڃن. يعني جاوا ۾ جيڪڏهن ٻه شيون برابر آهن ته پوءِ اهي برابر رهنديون جيستائين انهن جون ملڪيتون اڻ مٽ هونديون. - Comparison
null
: اعتراض جي چڪاس ڪئي وڃيnull
. جيڪڏهن اعتراض برابر آهيnull
، ته پوء طريقو واپس اچڻ گهرجيfalse
، نهNullPointerException
. مثال طور،a.equals(null)
ان کي واپس ڪرڻ گهرجيfalse
.
جاوا ۾ برابر ۽ hashCode جي وچ ۾ معاهدو
- جيڪڏهن شيون طريقي جي عمل جي نتيجن ۾ برابر آهن
equals
، پوء انهن کيhashcode
ساڳيو هجڻ گهرجي. - جيڪڏهن شيون طريقي جي عمل جي نتيجن ۾ برابر نه آهن
equals
، پوء اهيhashcode
يا ته ساڳيا يا مختلف ٿي سگهن ٿا. بهرحال، ڪارڪردگي بهتر ڪرڻ لاء، اهو بهتر آهي ته مختلف شيون مختلف ڪوڊ واپس ڪن.
Как переопределять метод equals в Java
-
@Override public boolean equals(Object obj) { /*1. Check*/
if (obj == this) { /*and return */ return true; }
-
Проверьте an object на
null
, а также проверьте, чтобы an objectы были одного типа. Не делайте проверку с помощьюinstanceof
так How такая проверка будет возвращатьtrue
для подклассов и будет работать правильно только в случае если ваш класс объявлен Howimmutable
. Вместо этого можно использоватьgetClass()
;if (obj == null || obj.getClass() != this.getClass()) { return false; }
-
Объявите переменную типа, который вы сравниваете, и приведите
obj
к этому типу. Потом сравнивайте каждый атрибут типа начиная с численных атрибутов (если имеются) потому что численные атрибуты проверяются быстрей. Сравнивайте атрибуты с помощью операторов И и ИЛИ (так называемыеshort-circuit logical operators
) для объединения проверок с другими атрибутами.Person guest = (Person) obj; return id == guest.id && (firstName == guest.firstName || (firstName != null && firstName.equals(guest.getFirstName()))) && (lastName == guest.lastName || (lastName != null && lastName .equals(guest.getLastName()))); }
/** * Person class with equals and hashcode implementation in Java * @author Javin Paul */
public class Person {
private int id;
private String firstName;
private String lastName;
public int getId() { return id; }
public void setId(int id) { this.id = id;}
public String getFirstName() { return firstName; }
public void setFirstName(String firstName) { this.firstName = firstName; }
public String getLastName() { return lastName; }
public void setLastName(String lastName) { this.lastName = lastName; }
@Override
public boolean equals(Object obj) {
if (obj == this) {
return true;
}
if (obj == null || obj.getClass() != this.getClass()) {
return false;
}
Person guest = (Person) obj;
return id == guest.id
&& (firstName == guest.firstName
|| (firstName != null &&firstName.equals(guest.getFirstName()))) && (lastName == guest.lastName
|| (lastName != null && lastName .equals(guest.getLastName())
));
}
@Override
public int hashCode() {
final int prime = 31;
int result = 1;
result = prime * result + ((firstName == null) ? 0 : firstName.hashCode()); result = prime * result + id; result = prime * result +
((lastName == null) ? 0 : lastName.hashCode()); return result;
}
}
Распространенные ошибки при переопределении equals в Java
-
Вместо того, чтобы переопределять метод
equals (Override)
программист перегружает его(Overload)
Синтаксис методаequals()
в классеObject
определен Howpublic boolean equals(Object obj)
, но многие программисты ненароком перегружают метод:public boolean equals(Person obj)
- instead ofObject
в качестве аргумента используют Name своего класса (напр. Person). Эту ошибку сложно обнаружить из-заstatic binding
. Таким образом, если вы вызовете этот метод для an object своего класса, то метод не просто скомпorруется, а даже сделает это корректно. Однако, если вы положите ваш an object в коллекцию, напримерArrayList
и вызовете методcontains()
, работа которого основана на методеequals()
, то методcontains
не сможет обнаружить ваш an object. -
При переопределении метода
equals()
не проверять наnull
переменные, что в конечном итоге заканчиваетсяNullPointerException
при вызовеequals()
. Ниже представлен корректный code.firstname == guest.firstname || (firstname != null && firstname.equals(guest.firstname));
-
Третья распространенная ошибка это не переопределять метод
hashCode()
, а толькоequals()
. Вы обязаны переопределять оба методаequals()
иhashCode()
в Java. МетодhashCode
используется вhash
-коллекциях(напримерHashSet
), и чем меньше будет коллизий (одинаковый code при разных an objectх) тем эффективнее эти коллекции будут работать с an objectми вашего класса. -
Последняя распространенная ошибка программистов в том, что при переопределении метода
equals()
не сохраняется соответствие между методамиequals()
иcompareTo()
, что является неформальным требованием для избежания хранения дубликатов вSet (SortedSet, TreeSet)
.
Подсказки How писать в Java метод equals
-
Большинство IDE такие How NetBeans, Eclipse и IntelliJ IDEA обеспечивают поддержку генерации методов
equals()
иhashCode()
. В Eclipse нажмите правую кнопку -> source ->generate equals()
иhashCode()
. -
Если в классе есть уникальный бизнес-ключ, то будет достаточно сделать проверку только на equalsство этих полей. Как в нашем примере “id” - уникальный номер для каждого Person.
-
При переопределении
hashCode()
в Java удостоверьтесь в использовании всех полей, что были использованы в методеequals()
. -
String
۽ ريپر ڪلاس جهڙوڪInteger
,Float
andDouble
override the methodequals()
, butStringBuffer
not override. -
جڏهن به ممڪن هجي، جاوا ۾ متغير
immutable
استعمال ڪندي فيلڊ ٺاهيو .final
-
شين جو مقابلو ڪرڻ وقت
String
، استعمال ڪريوequals()
. آپريٽر بدران==
. -
ٻه شيون جيڪي منطقي طور تي برابر آهن پر مختلف شين مان لوڊ ٿيل آهن
ClassLoader
برابر نه ٿي سگهن ٿيون. ياد رکو ته چيڪ ڪرڻ سانgetClass()
واپس ٿيندوfalse
جيڪڏهن لوڊر ڪلاس مختلف آهي. -
تشريح پڻ استعمال ڪريو
@Override
.طريقي تيhashCode
، جيئن ته هي ذيلي غلطين کي روڪيندو آهي جيئن ته واپسي جي قيمتint
. جڏهن ته، ڪجهه پروگرامر واپسيlong
.
GO TO FULL VERSION