java HashCode()方法理解

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





你可能感兴趣的:(java)