Как я должен осуществить hashCode()
и equals()
для следующего класса на Яве?
class Emp
{
int empid ; // unique across all the departments
String name;
String dept_name ;
String code ; // unique for the department
}
в Eclipse правой мыши мыши -> Источник -> генерировать hashcode () и равен () дает это:
/* (non-Javadoc)
* @see java.lang.Object#hashCode()
*/
@Override
public int hashCode() {
final int prime = 31;
int result = 1;
result = prime * result + (code == null ? 0 : code.hashCode());
return result;
}
/* (non-Javadoc)
* @see java.lang.Object#equals(java.lang.Object)
*/
@Override
public boolean equals(Object obj) {
if (this == obj)
return true;
if (obj == null)
return false;
if (!(obj instanceof Emp))
return false;
Emp other = (Emp) obj;
return code == null ? other.code == null : code.equals(other.code);
}
Я выбрал код как уникальное поле
Если код уникален (то есть ваш бизнес ключ), лучше всего использовать код для равных и HASHCODE - это хорошая практика для отдельной бизнес-ключа (код) от идентификатора объекта (ID).
Вот приятное чтение: Hibernate Документация: равен и hashcode (действует не только для самого гибернации)
Какие когда-либо ценности, которые вы используете, равны, чтобы определить, являются ли двумя объектами одинаковыми, являются значениями, которые необходимо использовать для создания хэш-кода.
public boolean equals(Object o) {
boolean result = false;
if(o instanceof CategoryEnum) {
CategoryEnum ce = (CategoryEnum) o;
result = ce.toString().equals(name);
}
return result;
}
public int hashCode()
{
int hash = 6;
hash += 32 * name.hashCode();
return hash;
}
Изменение профиля для «Продолжить ошибки согласованности данных», не всегда будет работать. Очевидно, что это уменьшает или не обнаруживает ошибку, но вы не получите все правильные данные. Он пропустит строки, с помощью которых происходит ошибка, и, следовательно, вы не можете получить точные данные.
-121--3081067-равен () и hashcode (), у них много разных мест. равны (), если мы не отменим его от объекта, он представляет, что две переменные указывают на одинаковый куча объекта?
public Class Student(){
private int id;
private name;
public Student(int id,String name){
this.name=name;
this.id=id;
}
public void main(String[] args){
Student A=new Student(20,'Lily');
Student B=new Student(20,'Lily');
boolean flag=A.equals(B)//flag=flase;
/*
*Although they attribute the same, but they are two different objects, they point to different memory
*/
@Override
public boolean equals(Object obj) {
if (obj == null) {
return false;
}
if (this == obj) {
return true;
}
if (this.getClass() != obj.getClass()) {
return false;
}
Student s=(Student)obj;
return new Integer(this.id).equals(new Integer(s.id))&&this.name.equals(s.name);
}
/**
*Sometimes even though we Override the equals, but we still can not determine whether the *two objects the same,
*In the collection object, such as HashSet, this time we have to Override the hashoCode ()
*/
public int hashCode(){
return id + name.hashCode() ;
}