Integer.class 是Integer类型的类对象,类似的,int.class是是int类型的类对象。
作为一个特例,基本类型都有一个类对象,主要是用在反射中。
Integer.TYPE 和 int.class 是等价的。
public static void main(String[] args) {
Class<Integer> a = int.class;
Class<Integer> b = Integer.TYPE;
Class<Integer> c = Integer.class;
System.out.println(System.identityHashCode(a));
System.out.println(System.identityHashCode(b));
System.out.println(System.identityHashCode(c));
}
输出结果:
// 前两个的结果总是一样的。
621009875
621009875
1265094477
这里System.identityHashCode
跟调用 hashcode
是一样的效果,那这俩有啥区别?
/**
* 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);
-
首先,
System.identityHashCode(nullReference)
会返回0,但是nullReference.hashCode()
会报错NullPointerException
-
然后,如果我们重写了
hashcode()
,比如:
@Override
public int hashCode() {
return 0xAAAABBBB;
}
结果都是一样的hashcode,但是 如果调用 System.identityHashCode
,结果还是不一样的,
System.identityHashCode()
也能传入基本类型,会进行自动包装。
int i = 5;
System.out.println(System.identityHashCode(i));
参考
- https://stackoverflow.com/questions/22470985/integer-class-vs-int-class