从一般角度来看,Equality 是不错的,但是 hash code 更则具技巧性。如果我们在 hash code上多下点功夫,我们就能了解到 hash code 就是用在细微处去提升性能的。
大部分的数据结构使用equals去检查是否他们包含一个元素。例如:
List
boolean contains = list.contains("b");
这个变量 contains 是true。因为他们是相等的,虽然b的实例化(instance)虽然不完全一样(再说一次,忽略String interning)。
将传递给 contains 的实例与每个元素进行比较很浪费时间。还好,整个这类数据结构使用了一种更高效的方法。它不会将请求的实例与每个元素比较,而是使用捷径,找到可能与之相等的实例,然后只比较这几项。
这个捷径就是哈希码——从对象计算出来的一个能代表该对象的整数值。与哈希码相同的实例不必相等,但相等的实例一定有相同的哈希码。(或者说应该有,我们稍后会对这个问题进行简单讨论)。这类的数据结构常常使用这种技术命名,在名称中加入 Hash 以便识别,其中最具代表性的就是 HashMap。
后面带不带参数,区别就是调用不同的构造方法,对不对name重新进行赋值
public class A {
String name="abc";
A(String name){
this.name=name;
}
public A() {
// TODO Auto-generated constructor stub
}
public int getHashcode(){
return name.hashCode();
}
public static void main(String[] args) {
A a=new A("abcd");
System.out.println(a.getHashcode());
A a1=new A("abcd");
System.out.println(a1.getHashcode());
A a2=new A();
System.out.println(a2.getHashcode());
A a3=new A();
System.out.println(a3.getHashcode());
}
}
打印输出结果:
2987074
2987074
96354
96354