您的位置:首页 > 编程语言 > Java开发

java HashCode()方法理解

2015-11-24 19:56 399 查看
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
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: