hashCode和identityHashCode的區別你知道嗎?

茅坤寶駿氹發表於2018-05-03

轉載自 hashCode和identityHashCode的區別你知道嗎?

hashCode

關於hashCode參考之前的文章,點選參考之前文章。

identityHashCode

identityHashCode是System裡面提供的本地方法,java.lang.System#identityHashCode。

/**
 * Returns the same hash code for the given object as
 * would be returned by the default method hashCode(),
 * whether or not the given object's class overrides
 * hashCode().
 * The hash code for the null reference is zero.
 *
 * @param x object for which the hashCode is to be calculated
 * @return  the hashCode
 * @since   JDK1.1
 */
public static native int identityHashCode(Object x);

identityHashCode和hashCode的區別是,identityHashCode會返回物件的hashCode,而不管物件是否重寫了hashCode方法。

示例

public static void main(String[] args) {
    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));

    User user = new User("test", 1);
    System.out.println("user hashCode: " + user.hashCode());
    System.out.println("user identityHashCode: " + System.identityHashCode(user));
}

輸出結果:

str1 hashCode: 96354
str2 hashCode: 96354
str1 identityHashCode: 1173230247
str2 identityHashCode: 856419764
user hashCode: 621009875
user identityHashCode: 621009875

結果分析:

1、str1和str2的hashCode是相同的,是因為String類重寫了hashCode方法,它根據String的值來確定hashCode的值,所以只要值一樣,hashCode就會一樣。

2、str1和str2的identityHashCode不一樣,雖然String重寫了hashCode方法,identityHashCode永遠返回根據物件實體記憶體地址產生的hash值,所以每個String物件的實體地址不一樣,identityHashCode也會不一樣。

3、User物件沒重寫hashCode方法,所以hashCode和identityHashCode返回的值一樣。

結論

hashCode方法可以被重寫並返回重寫後的值,identityHashCode會返回物件的hash值而不管物件是否重寫了hashCode方法。


相關文章