hashcode()方法相信大家都知道这是在Object中定义的方法,估计很多人不知道它是干嘛用的,今天在imageLoader框架源码时遇到的,于是,也学习下,在这说一句,看框架源码真是可以学到很多知识!
比如Set集合我们都知道它是不能存放重复的数据,那么它是怎么做到的呢?它会涉及到hash算法了,
如果我们每次加入一个数据都要用equals方法来判断时,当数据到几万或者几十万时候,这样遍历进行判断,效率就变低了,
java为了提升效率就引入了哈希表的算法,也就是哈希算法了!
hash算法原理:
当Set接收一个元素时根据该对象的内存地址算出hashCode,看它属于哪一个区间,在这个区间里调用equeals方法,
如果哈希不一样就不是同一个数据了,这样就不用equals进行判断了,是不是省略了遍历进行equals判断,从而提高了效率~
确实提高了效率。但发现一个问题:若两个对象equals相等,但不在一个区间,根本没有机会进行比较,会被认为是不同的对象。所以Java对于eqauls方法和hashCode方法是这样规定的:
1 如果两个对象相同,那么它们的hashCode值一定要相同。也告诉我们重写equals方法,一定要重写hashCode方法。
2 如果两个对象的hashCode相同,它们并不一定相同,这里的对象相同指的是用eqauls方法比较。
现在写个例子进行比较:
public class User {
private String name;
private int age;
public User(String name, int age) {
super();
this.name = name;
this.age = age;
}
@Override
public boolean equals(Object obj) {
if(obj==null){
return false;
}
User user = (User) obj;
return this.name==user.name&&this.age==user.age;
}
@Override
public int hashCode() {
return age;
}
}
Test.java测试
public class Test {
public static void main(String[] args) {
User user1 = new User("zgz",1);
User user2 = new User("zgz",1);
System.out.println("user1="+user1);
System.out.println("user2="+user2);
System.out.println(user1.equals(user2));
}
}
这个时候equals调用的就不是Object方法中的equals的方法了,这个时候打印出来的是true,表示这user1和user2是同一个对象
这就验证了第一个结论是正确的:
如果两个对象相同,那么它们的hashCode值一定要相同。也告诉我们重写equals方法,一定要重写hashCode方法
那么怎么验证第二个结论是否正确呢?很简单,不要重写equals方法就ok