java.lnag.Object中对hashCode的约定:
- 在一个应用程序执行期间,如果一个对象的equals方法做比较所用到的信息没有被修改的话,则对该对象调用hashCode方法多次,它必须始终如一地返回同一个整数。
- 如果两个对象根据equals(Object o)方法是相等的,则调用这两个对象中任一对象的hashCode方法必须产生相同的整数结果。
- 如果两个对象根据equals(Object o)方法是不相等的,则调用这两个对象中任一个对象的hashCode方法,不要求产生不同的整数结果。但如果能不同,则可能提高散列表的性能。
- 补充:
hash code是一种编码方式,在Java中,每个对象都会有一个hashcode,Java可以通过这个hashcode来识别一个对象。至于hashcode的具体编码方式,比较复杂(事实上这个编码是可以由程序员通过继承和接口的实现重写的),可以参考数据结构书籍。而hashtable等结构,就是通过这个哈希实现快速查找键对象。这是他们的内部联系,但一般编程时无需了解这些,只要知道hashtable实现了一种无顺序的元素排列就可以了。两个对象值相同(x.equals(y) == true),则一定有相同的hash code。
-
- 详情见例子:
- public void test05(){
String a=new String("1");
String b=new String("1");
System.out.println(a==b);
System.out.println(a.equals(b));
System.out.println(a.hashCode()+" "+b.hashCode());
System.out.println(a.hashCode()==b.hashCode());
}
public static void main(String args[]) {
new test().test05();
//System.gc();
//Runtime.getRuntime().gc();
}
- 结果是:
- false
true
49 49//有相同的hash code。
true