Hello朋友们,我是RatelBlog的李某人。
记得很久之前,在网上看过一篇关于Integer比较值的问题,那么今天抽空复盘一下。
OK,那么代码如下
@Test
public void IntegerTeachingJunint() {
Integer a1 = new Integer(200);
Integer a2 = new Integer(200);
logger.info("a1==a2: " + (a1 == a2));
Integer a3 = new Integer(100);
Integer a4 = new Integer(100);
logger.info("a3==a4: " + (a3 == a4));
Integer a5 = 100;
Integer a6 = 100;
logger.info("a5==a6: " + (a5 == a6));
Integer a7 = new Integer(100);
Integer a8 = 100;
logger.info("a7==a8: " + (a7 == a8));
Integer a9 = new Integer(100);
int a10 = 100;
logger.info("a9==a10: " + (a9 == a10));
}
OK 代码运行后,输出的结果如下,那么朋友们 你们都写对了吗?
a1==a2: false
a3==a4: false
a5==a6: true
a7==a8: false
a9==a10: true
1.a1==a2、a3==a4输出是false,这个大家肯定都猜对了。
因为通过new关键字创建对象,实际上在JVM的堆内存创建了a1,a2,a3,a4四个对象,然后咱们通过==比较符,
比较a1==a2、a3==a4。实际上不是比较的数值,因为==比较的是地址,所以输出false。如果要比较数值
可以通过intValue()方法比较。列如:a1.intValue() == a2.intValue()。
2.a5==a6输出的是true,那么有些朋友是不是会产生疑问呢?难道此处的==比较符,不是比较的地址而是比较
的数值?其实不然,==还是比较的地址。Integer a5 = 100;Integer a6 = 100;这种方式编写,实则是调用了
Integer的valueOf(int i)方法。
源码如下:
public static Integer valueOf(int i) {
if (i >= IntegerCache.low && i <= IntegerCache.high)
return IntegerCache.cache[i + (-IntegerCache.low)];
return new Integer(i);
}
private static class IntegerCache {
static final int low = -128;
static final int high;
static final Integer cache[];
static {
// high value may be configured by property
int h = 127;
String integerCacheHighPropValue =
sun.misc.VM.getSavedProperty("java.lang.Integer.IntegerCache.high");
if (integerCacheHighPropValue != null) {
try {
int i = parseInt(integerCacheHighPropValue);
i = Math.max(i, 127);
// Maximum array size is Integer.MAX_VALUE
h = Math.min(i, Integer.MAX_VALUE - (-low) -1);
} catch( NumberFormatException nfe) {
// If the property cannot be parsed into an int, ignore it.
}
}
high = h;
cache = new Integer[(high - low) + 1];
int j = low;
for(int k = 0; k < cache.length; k++)
cache[k] = new Integer(j++);
// range [-128, 127] must be interned (JLS7 5.1.7)
assert IntegerCache.high >= 127;
}
private IntegerCache() {}
}
在Integer中存在IntegerCache内部类,那么在调用valueOf(i)方式时,先判断i是否在low,high范围中,
如果在low,high的范围中,返回cache数组中缓存的Integer对象,那么low,high值时多少呢?通过Debug
得出low=-128,high=127。那么就是说cache数组中缓存了-128~127的Integer对象,只要在-128~127的范
围中,通过valueOf(i)方法获取的就是cache中缓存的对象。
那么a5==a6为true就可以理解了,因为是在cache数组中取的同一个对象。
a7==a8: false。
这个很好理解,a7是在堆内存new的新对象,a8是在IntegerCache类中cache数组取的对象,
这两个不是同一个对象,==比较输出false。
a9==a10: true。
这个也好理解 a10是基本数据类型,a9是Integer引用包装类型,在比较时会进行“拆箱”所以比较的是数值。
如果你不满意你的现状,要么开始改变,要么就闭嘴。