20200831-牛子良

问题

hashCode和identityhashCode的区别

1.hashCode:

public int hashCode()

(1)在 Java 应用程序执行期间,在对同一对象多次调用 hashCode 方法时,必须一致地返回相同的整数,前提是将对象进行 equals 比较时所用的信息没有被修改。

(2)如果根据 equals(object)方法,两个对象是相等的,那么对这两个对象中的每个对象调用 hashCode 方法都必须生成相同的整数结果。

(3)如果根据 equals(java.lang.Object) 方法,两个对象不相等,那么对这两个对象中的任一对象上调用 hashCode成不同的整数结果。

2.identityhashCode:java.lang 包中System类提供的方法;

public static int identityHashCode(Object x)

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

String str1 = new String("abc");
        String str2 = new String("abc");
        System.out.println("str1 hashCode: " + str1.hashCode());
        System.out.println("str2 hashCode: " + str2.hashCode());
        System.out.println("str1 identityHashCode: " + System.identityHashCode(str1));
        System.out.println("str2 identityHashCode: " + System.identityHashCode(str2));

3一个对象的hashCode和IdentityhashCode的联系:

(1)对象的hashCode,一般是通过将该对象的内部地址转换成一个整数来实现的
(2)当一个类没有重写Object类的hashCode()方法时,它的hashCode和identityHashCode是一致的
(3)当一个类重写了Object类的hashCode()方法时,它的hashCode则有重写的实现逻辑决定,此时的hashCode值一般就不再和对象本身的内部地址有相应的哈希关系了
(4)当null调用hashCode方法时,会抛出空指针异常,但是调用System.identityHashCode(null)方法时能正常的返回0这个值

标签


© 2021 成都云创动力科技有限公司 蜀ICP备20006351号-1