Object
的hashCode()
默认是返回内存地址的,但是hashCode()
可以重写,所以hashCode()
不能代表内存地址的不同
System.identityHashCode(Object)
方法可以返回对象的内存地址,不管该对象的类是否重写了hashCode()
方法
public static void main(String[] args) {
String str1 = new String("hong");
String str2 = new String("hong");
System.out.println("str1-identityHashCode:" + System.identityHashCode(str1));
System.out.println("str2-identityHashCode:" + System.identityHashCode(str2));
System.out.println("str1-hashCode:" + str1.hashCode());
System.out.println("str2-hashCode:" + str2.hashCode());
System.out.println("str1 == str2 :" + (str1 == str2));
String str3 = "icarus";
String str4 = "icarus";
System.out.println("str3-identityHashCode:" + System.identityHashCode(str3));
System.out.println("str4-identityHashCode:" + System.identityHashCode(str4));
System.out.println("str3-hashCode:" + str3.hashCode());
System.out.println("str4-hashCode:" + str4.hashCode());
System.out.println("str3 == str4:" + (str3 == str4));
}
打印:
str1-identityHashCode:1915910607
str2-identityHashCode:284720968
str1-hashCode:3208448
str2-hashCode:3208448
false
str3-identityHashCode:189568618
str4-identityHashCode:189568618
str3-hashCode:-1194474839
str4-hashCode:-1194474839
false
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()
,重写之前的hashCode()
网友评论