目录
一、==
二、修改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()方法。文章来源:https://www.toymoban.com/news/detail-630503.html
public boolean equals(Object obj) {
if (obj instanceof Integer) {
return value == ((Integer)obj).intValue();
}
return false;
}
结论:在使用Integer比较数值相等时,建议使用equals。文章来源地址https://www.toymoban.com/news/detail-630503.html
到了这里,关于Integer比较时用==还是equals的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!