关于 Integer 的两个值得比较 (常考的面试题)
/**
* 两个Integer类型 == 比较的是地址
* new 出来的是一个新的对象
* 在这里肯定是 false
*/
Integer i1 = new Integer(1);
Integer i2 = new Integer(1);
System.out.println(i1 == i2);
/**
* 包装类 和 基本数据类型 使用 == 做比较
* 比较的都是值是否相等
*/
Integer i3 = new Integer(128);
int i4 = 128;
System.out.println(i3 == i4);
/**
* int i4 = 128; 这样的赋值方式 底层用的是 Integer类的 valueOf(int i)
* 在 -128 到 127 之间是直接返回的值 超出了就是 new 的 看源码
* if (i >= -128 && i <= 127)
* return 返回一个 -128 到 127 之间的一个数字, 这个数字在常量池
* return IntegerCache.cache[i + (-IntegerCache.low)];
* return new Integer(i);
*
* static final cache[] 返回的值是一个常量
* 所以 i5 和 i6 的值来自常量池 , 它们来自同一个地方所以地址都是相等的
*
*/
Integer i5 = 122;
Integer i6 = 122;
System.out.println(i5 == i6);
/**
* int i7 = 128; 这样的赋值方式底层用的是 Integer类的 valueOf(int i)
* 在 -128 到 127 之间是直接返回的值 超出了就是 new 的
* 看源码
* if (i >= -128 && i <= 127)
* return new Integer(i); 使用的是 Integer(int value) 这个构造器
*
* Integer i7 = 128; Integer i8 = 128;
* i7 和 i8 都是 new 出来的一个对象
* 这里比较的是两个对象的地址 所以是 false
*
*/
Integer i7 = 128;
Integer i8 = 128;
System.out.println(i7 == i8);
|