Java基础之hashCode()方法

一、什么是哈希值?

哈希算法将任意长度的二进制值映射为固定长度的较小二进制值,这个小的二进制值称为哈希值。哈希值是一段数据唯一且极其紧凑的数值表示形式。如果散列一段明文而且哪怕只更改该段落的一个字母,随后的哈希都将产生不同的值。要找到散列为同一个值的两个不同的输入,在计算上来说基本上是不可能的。

二、hashCode()方法

这个方法主要是用于高效率的快速查找,hashCode是用来在散列存储结构中确定对象的存储地址的。
	public native int hashCode(); 
按这个方法来看,返回值会是一个int类型的数值。并且是本地的方法,所以Object没有给出具体实现的方法。
关键字“native”,简单说一下,“native”说明修饰的方法是一个原生的方法;方法对应的实现不是当前的文件,而是在用于其他语言的文件中。额,记得java语言本身不能对操作系统底层进行访问操作的。
三、hashCode()与equlas()
1.两个对象的hashCode值相等,但equlas()的结果就不清楚了;
2.两个对象的hashCode值不相等,但equlas()一定为false;
3.equlas()为true时,两个对象的hashCode值一定一样;
4.equlas()为false时,两个对象的hashCode值不一定不同;
之所以会这样,是因为hashCode()方法中允许不同的对象共享一个哈希码。比如一块田地,不光可以种玉米,还可以种地瓜。在使用hashCode()方法判断时,一定要注意:hashCode相等不代表两个对象就相等,但是呢,hashCode不相等 那两个对象就一定不相等。

注意 :在重写hashCode方法时一定要重写equlas方法。
没有重写equlas方法的话,就会调用object默认的equals方法,是比较两个对象的引用是不是相同,显示这是两个不同的对象,两个对象的引用肯定是不定的。
可以下面的代码测试一下:
package com.zq.test;

import java.util.HashSet;
import java.util.Set;

public class Test {
	private int id;

	public int getId() {
		return id;
	}

	public void setId(int id) {
		this.id = id;
	}

	@Override
	public int hashCode() {
		
		return id % 10;
	}

	public final static void main (String [] args){
		Test a=new Test();
		Test b=new Test();
		a.setId(1);
		b.setId(1);
		Set<Test> set=new HashSet<Test>();
		set.add(a);
		set.add(b);
		System.out.println(a.hashCode() == b.hashCode());
		System.out.println(a.equals(b));
		System.out.println(set);
	}
	
}
结果为:
true
    false
     [com.zq.test.Test@1, com.zq.test.Test@1]
HashSet集合中只能存放唯一的对象,当没有重写equlas方法时,两个相同的对象都保存到了 HashSet集合当中,也让 HashSet集合失去了唯一性的意义。我们加上equlas方法会怎么样?
package com.zq.test;

import java.util.HashSet;
import java.util.Set;

public class Test {
	private int id;

	public int getId() {
		return id;
	}

	public void setId(int id) {
		this.id = id;
	}

	@Override
	public int hashCode() {
		
		return id % 10;
	}
	
	
	@Override
	public boolean equals(Object obj) {
		if (this == obj)
			return true;
		if (obj == null)
			return false;
		if (getClass() != obj.getClass())
			return false;
		Test other = (Test) obj;
		if (id != other.id)
			return false;
		return true;
	}

	public final static void main (String [] args){
		Test a=new Test();
		Test b=new Test();
		a.setId(1);
		b.setId(1);
		Set<Test> set=new HashSet<Test>();
		set.add(a);
		set.add(b);
		System.out.println(a.hashCode() == b.hashCode());
		System.out.println(a.equals(b));
		System.out.println(set);
	}
	
}
其结果为:
true
     true
     [com.zq.test.Test@1]
这样hashSet就保存了一个对象。
切记重写hashCode方法时 equlas方法也要重写。


以上都是看别人博客整理出来的 如果有不对请指教或者涉及您的文章内容请谅解,本人可删除。

加个链接 http://www.codeceo.com/article/java-hashcode-learn.html

猜你喜欢

转载自blog.csdn.net/weixin_39756851/article/details/78500054
今日推荐