1,hashcode默认是根据对象的内存地止算出的。
2,什么时候重写hashcode? 当使用哈希集合时,如果复写了对象的equals方法,此时必须复写对象的hashcode方法。 以HashSet为例:在向哈希集合中添加对象时,对象的hashcode先被调用。如果两个对象的hashcode不一样hashset则认为他们是不同的两个对象。 当只复写equals方法时,在下面的程序中s1,s2被看作两个不同的对象加入set中。但在现实业务中我们往往希望s1,s2是同一对像。 次时只有跟据字段id,name复写hashcode. s1,s2才被看作相等。s1被加如set后,s2不会再被添加。
3.在remove hashset中对象前请不要修改参与hashcode计算的属性值。因为属性值的改变导致对象哈希值发生变化。而在hashset中是根据对象的hash值来检索对象的,
此时jvm会根本就找不到要删除的对象更不用谈删除对象了。
import java.util.HashSet;
import java.util.Set;
public class HashCodeTest {
public static void main(String[] args) {
Set set = new HashSet();
Student s1 = new Student(1, "zhangsan");
Student s2 = new Student(1, "zhangsan");
set.add(s1);
set.add(s2);
System.out.println(set.size());
}
}
class Student {
public int id;
public String name;
@Override
public int hashCode() {
final int prime = 31;
int result = 1;
result = prime * result + id;
result = prime * result + ((name == null) ? 0 : name.hashCode());
return result;
}
public Student(int id, String name) {
super();
this.id = id;
this.name = name;
}
@Override
public boolean equals(Object obj) {
if (this == obj)
return true;
if (obj == null)
return false;
if (getClass() != obj.getClass())
return false;
Student other = (Student)obj;
if (id != other.id)
return false;
if (name == null) {
if (other.name != null)
return false;
} else if (!name.equals(other.name))
return false;
return true;
}
}