Integer 大小比较遇到过的坑

时间:2022-06-16 21:23:20

今天帮人解答了一个Integer 比较的问题,发现坑很多,总结一下遇到过的坑,没什么技术含量,只是为了记录一下,避免入坑。
先看如下几个例子,心里想一下比较结果,我会在下面分别解析公布答案。

        int a1 = 10;
Integer b1 = new Integer(10);
System.out.println(a1== b1); //Line 15

Integer a2 = 127;
Integer b2 = 127;
System.out.println(a2==b2); //Line 19

Integer a3 = 128;
Integer b3 = 128;
System.out.println(a3 == b3); //Line 23

Integer a4 = new Integer(10);
Integer b4 = new Integer(10);
System.out.println(a4==b4); //Line 27

解析

Line 15 输出true

这里从结果上看应该是b1隐式类型转换为int了,所以比较结果就是ture,可以看一下byteCode分析:

LINENUMBER 15 L1
GETSTATIC java/lang/System.out : Ljava/io/PrintStream;
BIPUSH 10
ALOAD 1
INVOKEVIRTUAL java/lang/Integer.intValue ()I
IF_ICMPNE L2
ICONST_1
GOTO L3

可以看到,第15行其实是b1.intValue()然后在做了比较。

Line 19 输出true

这是因为Integer对小整数做了缓存,也就是说其实a2,b2指向了Integer的缓存,并不是比较的内存地址,详见java.lang.Integer.IntegerCache.
代码如下:

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) {
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);
}
high = h;

cache = new Integer[(high - low) + 1];
int j = low;
for(int k = 0; k < cache.length; k++)
cache[k] = new Integer(j++);
}

private IntegerCache() {}
}

Line 23 输出False

Line 19的例子中其实已经有解释了,IntegerCache的范围是-128~127所以128就没有缓存了,a3,b3是实例化出来后赋值的,所以比较的就是两个变量的内存地址。

Line 27 输出false

这个没有什么争议,如果这个你都能答错,建议重新补充一下基础。其实这个是跟Line 23一样的,而且这个写的更名想,实例化两个Integer,直接比较的话就是比较的是两个内存地址,他们hashCode也是不同的,比较他们的值,需要用a4.equal(b4)来比较

最后

  • 可以思考一下如下代码,这个后面有空可以一起讨论一下
String a5 = "10";
String b5 = "10";
String c5 = new String("10");
System.out.println(a5 == b5); //true
System.out.println(a5 == c5); //false

关于我

  • @Author:Zemo
  • @Email:zemochen#126.com
  • J2EE 两年多研发经验,日常公司打杂,处于迷茫期
  • 欢迎转载,让更多的人学到东西