java中hashCode的作用:
1、Java对象的存储是存在内存当中,可当我们要查找一个对象时,按照常规思路,我们需要把要查找的对象与内存中的对象一一匹配.但是这样的匹配会占用较多的时间。
2、所以,加入我们把内存分为很多区域,一个区域又可以存放很多对象,在查找想要对象时,我们只需要知道对象在那块区域,然后在那块区域和其他对象一一匹配就行,这样极大节约了时间。
3、hashCode()方法就是计算在哪块区域的;equals()方法就是进行匹配
4、重写了equals()方法就必须重写hashCode()方法。原因:如果我们只重写equals()方法。不重写hashCode()方法就无法计算
得到我们要查找的对象和目标对象是否在同一块区域,没有在同一块区域计算机就没法调用equals()方法进行匹配。
下面举个例子:
Set类型的集合里面的对象不能重复。
package com.yiheng.Test;
import java.util.HashSet;
import java.util.Iterator;
import java.util.Set;
public class HashTest {
private int i;
public int getI() {
return i;
}
public void setI(int i) {
this.i = i;
}
//重写hashCode——找篮子
@Override
public int hashCode() {
return 1%10;
}
//重写equals——具体匹配
@Override
public boolean equals(Object obj) {
//返回true,计算机就认为该区域有和obj一样的对象了;
//返回false,认为该区域没有和obj一样的对象
if(obj==null){
return false;
}
if(obj==this){
return true;
}
if(!(obj instanceof HashTest)){
return false;
}
HashTest other=(HashTest)obj;
//判断b对象与a对象的i值是否相等,如果i值相等,两对象就一样,
if(other.getI()==this.getI()){
return true;
}
return false;
//Java原装的equals()方法使用==来比较的,这样比较是比较内存中的地址。
//显然a与b的内存是不一样的,所以当我们只重写了hashCode()方法,没重写equals方法,返回值是false;
//return (this == obj);
}
public static void main(String[] args) {
HashTest a = new HashTest();
HashTest b = new HashTest();
a.setI(1);
b.setI(1);
//Set集合就是不能含有相同的对象,如果有相同的对象,就不叫Set了
Set<HashTest> set = new HashSet<HashTest>();
set.add(a);
set.add(b);
System.out.println(a.hashCode()==b.hashCode());
System.out.println(a.equals(b));
System.out.println(set);//输出的集合里面只有一个对象a。
//用迭代器输出集合里面的对象
Iterator<HashTest> iterator = set.iterator();
while (iterator.hasNext()){
System.out.println(iterator.next());
}
}
}