Overriding padha () lan hashCode () cara ing Jawa
Equals
lan hashCode
minangka metode dhasar sing diumumake ing kelas Object
lan ana ing perpustakaan Jawa standar. Cara iki еquals()
digunakake kanggo mbandhingake obyek lan hashCode
ngasilake kode integer kanggo obyek kasebut. Cara iki akeh digunakake ing perpustakaan standar Jawa nalika nglebokake lan njupuk obyek ing HashMap
. Cara kasebut equal
uga digunakake kanggo mesthekake yen mung obyek unik sing disimpen ing implementasi HashSet
liyane Set
, uga ing kasus liyane ing ngendi obyek kudu dibandhingake. Implementasi standar saka cara equals()
ing kelas java.lang.Object
mbandhingaké referensi kanggo alamat memori sing variabel nyimpen lan bali true
mung yen alamat cocog, ing tembung liyane, variabel nuduhake obyek padha. Jawa nyaranake overriding equals()
lan cara hashCode()
yen mbandhingaké wis samesthine kanggo tindakake logika alam utawa bisnis logika. Akeh kelas ing pustaka Jawa standar sing nimpa, contone, kelas String
override equals
supaya bali true
yen isi rong obyek sing dibandhingake padha. Kelas pambungkus ngatasi Integer
cara equal
kanggo nindakake perbandingan numerik, lan liya-liyane. Wiwit Jawa HashMap
uga gumantung ing lan cara kanggo mbandhingaké lan , Jawa nawakake aturan ing ngisor iki kanggo overriding cara iki: HashTable
equals()
hashCode()
key
values
- Refleksivity: Obyek kudu padha karo awake dhewe.
- Symmetrical: yen
a.equals(b)
balitrue
, banjurb.equals(a)
uga kudu balitrue
. - Transitivity: yen
a.equals(b)
balitrue
lanb.equals(c)
uga balitrue
, banjurc.equals(a)
uga kudu balitrue
. - Konsistensi: Telpon bola-bali menyang cara
equals()
kudu ngasilake nilai sing padha anggere sawetara nilai properti obyek ora diganti. Tegese, yen rong obyek padha ing Jawa, mesthine bakal padha yen sifate ora owah. - Perbandingan
null
: Objek kudu dipriksanull
. Yen obyek padha karonull
, banjur cara kudu balifalse
, oraNullPointerException
. Contone,a.equals(null)
kudu balifalse
.
Agreement antarane witjaksono lan hashCode ing Jawa
- Yen obyek padha karo asil eksekusi metode
equals
, mulahashcode
kudu padha. - Yen obyek ora padha karo asil eksekusi metode
equals
, mulahashcode
bisa uga padha utawa beda. Nanging, kanggo nambah kinerja, iku luwih apik kanggo duwe obyek beda bali kode beda.
Как переопределять метод 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
lan kelas pambungkus kayataInteger
,Float
lanDouble
override caraequals()
, nangingStringBuffer
ora override. -
Yen bisa, gawe kolom
immutable
nggunakakefinal
variabel ing Jawa. -
Nalika mbandhingake
String
obyek, gunakakeequals()
operator==
. -
Loro obyek sing logis padha nanging dimuat saka obyek beda
ClassLoader
ora bisa padha. Elinga yen mriksa karogetClass()
bakal balifalse
yen kelas loader beda. -
Gunakake
@Override
anotasi uga ing cara .hashCode
, amarga iki nyegah kasalahan subtle kayata nilai bali sakaint
. Nanging, sawetara programer balilong
.
GO TO FULL VERSION