Множество ответов, приведенных выше, просто нужно добавить несколько баллов.
Когда мы говорим obj.hashCode()
, содержимое obj считается, с другой стороны, в System.identityHashCode(obj)
содержимое не принимается вТаким образом, identityHashCode
для двух разных String
, int
(с одинаковым значением) будут разными, но Hashcode
будет одинаковым.
В случае String
для получения identityHashCode
строковый пул играет важную роль, например
Object s1 = "abcd";
Object s2 = new String("abcd");
Object s3 = "abcd";
System.out.println("identityHashCode : " + System.identityHashCode(s1) + " HashCode : " + s1.hashCode());
System.out.println("identityHashCode : " + System.identityHashCode(s2) + " HashCode : " + s2.hashCode());
System.out.println("identityHashCode : " + System.identityHashCode(s3) + " HashCode : " + s3.hashCode());
//output:
identityHashCode : 2018699554 HashCode : 2987074
identityHashCode : 1311053135 HashCode : 2987074
identityHashCode : 2018699554 HashCode : 2987074
здесь s1
и s3
, указывающие одну и ту же ссылку, поэтому identityHashCode
для s1 and s3
всегда одинаковы, а s2
будет отличаться.
То же самое для int
также, IntegerCache
играет важную роль для получения identityHashCode
Object s1 = 5;
Object s2 = new Integer(5);
Object s3 = 5;
System.out.println("identityHashCode : " + System.identityHashCode(s1) + " HashCode : " + s1.hashCode());
System.out.println("identityHashCode : " + System.identityHashCode(s2) + " HashCode : " + s2.hashCode());
System.out.println("identityHashCode : " + System.identityHashCode(s3) + " HashCode : " + s3.hashCode());
//Output
identityHashCode : 2018699554 HashCode : 5
identityHashCode : 1311053135 HashCode : 5
identityHashCode : 2018699554 HashCode : 5