概述
目录
一、==
二、修改integer的缓存范围
三、使用equals
一、==
一般情况在代码代码中比较interger的值时用==是没有问题的,但是也存在一定的范围。
可以看到,当Integer表示的值在[-128 ~ 127]之间,使用==时能达到我们的预期的。
可是一旦超过这个范围,结果就不是我们想要的了。
如上图,我们看到一旦integer超过了[-128~127],==比较的结果为false;
这是因为Integer在进行比较的时候会自动的进行拆箱操作,而进行拆箱操作的时候会调用valueOf方法。
源码:
public static Integer valueOf(int i) {
if (i >= IntegerCache.low && i <= IntegerCache.high)
return IntegerCache.cache[i + (-IntegerCache.low)];
return new Integer(i);
}
而IntegerCache.low ~ IntegerCache.high是从IntegerCache中获取的,IntegerCache缓存范围是[-128~127],一旦超出这个范围就得不到预期的结果。
源码如下:
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的缓存范围
当然这个缓存范围是可以修改的,如下图操作:
-XX:AutoBoxCacheMax=200
测试:
修改自动拆箱的缓存最大值为200时,得到验证。
三、使用equals
分析:
equals方法底层调用了intValue()方法。
public boolean equals(Object obj) {
if (obj instanceof Integer) {
return value == ((Integer)obj).intValue();
}
return false;
}
结论:在使用Integer比较数值相等时,建议使用equals。
最后
以上就是沉默故事为你收集整理的Integer比较时用==还是equals一、==二、修改integer的缓存范围三、使用equals的全部内容,希望文章能够帮你解决Integer比较时用==还是equals一、==二、修改integer的缓存范围三、使用equals所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复