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