项目中遇到了这个问题,想彻底搞清楚,参考了网上和书上的内容,总结一番,仅供参考。
import java.util.HashSet;
public class TestHashcode {
private Integer id;
private String name;
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
/**
* @param args
*/
public static void main(String[] args) {
TestHashcode t = new TestHashcode();
t.setId(5);
t.setName("Sheldon");
TestHashcode t1 = new TestHashcode();
t1.setId(5);
t1.setName("Sheldon");
if(t.equals(t1)){
System.out.println("t is equal to t1");
}else{
System.out.println("t is not equal to t1");
}
HashSet<TestHashcode> set = new HashSet<TestHashcode>();
set.add(t);
set.add(t1);
//if not override hashcode(),here will be 2
System.out.println("The size is "+set.size());
}
//override equals method to compare by value of two objects instead of memory address
@Override
public boolean equals(Object obj){
if(this == obj){
return true;
}
if(!(obj instanceof TestHashcode)){
return false;
}
TestHashcode t = (TestHashcode)obj;
if(this.id == t.id && this.name.equals(t.name)){
return true;
}else{
return false;
}
}
//override hashcode method to make two objects which have the same id and name
//that have the same hashcode value
@Override
public int hashCode(){
int result;
result=(this.name==null?0:name.hashCode());
result=37*result+(this.id==null?0:id.hashCode());
return result;
}
}
*为什么用Hash算法?
Hashset需要存放不同对象,加入一个对象便和前一对象比较,如果不等就存入,当存放对象过多时,这样挨个比较效率很低,于是采用hash算法。
*Java中Hash原理?
当调用HashSet的add()时,会调用该对象的hashcode()方法,就能直接定位到应该被存储的物理位置,如果该位置无任何元素,则存入,不再进行任何比较。如果该位置有元素,则进行比较,相同就不存了,不同则存放到其他位置。
*为什么要重写equals和hashcode方法?
Object类的equals和hashcode方法是比较内存地址,如果双方具有相同内存地址,则equals和hashcode都相同。如果不重写hashcode,而每次add的对象极有可能内存地址都不等,即便id和name相等,也会生成不同的hash散列值,致使具有相同id和name的对象存放在不同的桶,不应该。重写hashcode()目的是使相同的对象具有相同的hash散列值。如果按上面代码中重写hashcode的算法,大概能保证相同的对象具有相同的hashcode,不同的对象具有不同的hashcode。但如果改变以上hashcode重写的实现方式,改用取余的方式如id%4来实现,这时就有可能致使不同的对象具有相同的hashcode,为确保万无一失,需要重写equals方法再验证一次两个对象的id和name是否相等。
这样,用hashcode()和equals()两个维度确保如果是相同的对象,就不用存放了。
参考链接:
http://apps.hi.baidu.com/share/detail/19416198
http://www.iteye.com/topic/418248
http://daweiangel.iteye.com/blog/625733
如若转载,请说明出处!http://blog.youkuaiyun.com/xukunddp