System.identityHashCode​:

返回给定对象的哈希码,该代码与默认的方法 hashCode() 返回的代码一样,无论给定对象的类是否重写 hashCode()。null引用的哈希码为 0。

obj.hashcode​:

hashCode()方法是顶级类Object类的提供的一个方法,所有的类都可以进行对hashCode方法重写。这时hash值计算根据重写后的hashCode方法计算

如果在没有重写hashcode的前提下,hashcode的返回值等于identityHashCode的返回值

有哪些特点?

  1. 一个对象在其生命期中 identity hash code 必定保持不变;
  2. 如果a == b,那么他们的System.identityHashCode() 必须相等;如果他们的System.identityHashCode() 不相等,那他们必定不是同一个对象;
  3. 如果System.identityHashCode() 相等的话,并不能保证 a == b(毕竟这只是一个散列值,是允许冲突的);

有什么作用?
加速对象去重:由特征2可知,只要判断出两个对象的hashCode不一致,就知道这两个对象不是同一个;又因为hashCode()的性能比 " == "性能高得多,所以多数时候,用它来判断重复。

扩展:为啥hashCode()性能高?
因为hashCode()的结果算出来后缓存起来,下次调用直接用不需要重新计算,提高性能

验证:

public static void main(String [] args) throws Exception{
CA ca = new CA();
CA cb = new CA();
CA cc= ca;

System.out.println("ca identityHashCode:" + System.identityHashCode(ca) + ", ca hashcode:"+ca.hashCode());
System.out.println("cb identityHashCode:" + System.identityHashCode(cb) + ", ca hashcode:"+cb.hashCode());
System.out.println("cc identityHashCode:" + System.identityHashCode(cc) + ", ca hashcode:"+cc.hashCode());

//注意这里是new Sting,而不是aa,因为常亮aa在赋值的时候系统会优化,sb和sc指向字符串缓冲区域的aa,所以sb = sc
String sa = new String("aa");
String sb = "aa";
String sc = "aa";

System.out.println("sa identityHashCode:" + System.identityHashCode(sa) + ", ca hashcode:"+sa.hashCode());
System.out.println("sb identityHashCode:" + System.identityHashCode(sb) + ", ca hashcode:"+sb.hashCode());
System.out.println("sc identityHashCode:" + System.identityHashCode(sc) + ", ca hashcode:"+sc.hashCode());

System.out.println("sa == sb ? "+ (sa == sb ? "true":"false") + ", sb == sc ? "+(sb == sc ? "true":"false"));
}

输出:
ca identityHashCode:21685669, ca hashcode:21685669
cb identityHashCode:2133927002, ca hashcode:2133927002
cc identityHashCode:21685669, ca hashcode:21685669
sa identityHashCode:1836019240, ca hashcode:3104
sb identityHashCode:325040804, ca hashcode:3104
sc identityHashCode:325040804, ca hashcode:3104
sa == sb ? false, sb == sc ? true

结果分析:

  1. 从ca,cb,cc的输出可以看出,CA没有重写HashCode,所以identityHashCode和hashCode是相等的。
  2. sa,sb,sc的hashCode是相同的,是因为String类重写了hashCode方法,它根据String的值来确定hashCode的值,所以只要值一样,hashCode就会一样。
  3. 如果identityHashCode 不相等,那他们必定不是同一个对象