public class Test1 {
/**
* @param args
*/
public static void main(String[] args){
int a = 1000, b = 1000
;
System.out.println(a ==
b);
Integer c = 1000, d = 1000
;
System.out.println(c==
d);
Integer e = 100, f = 100
;
System.out.println(e ==
f);
}
}
运行结果:
true
false
true
结果分析:
查看Test1.class文件如下:
public class Test1
extends java.lang.Object{
public Test1();
Code:
0
: aload_0
1: invokespecial #1;
//Method java/lang/Object."<init>":()V
4:
return
public static void main(java.lang.String[]);
Code:
0: sipush 1000
3
: istore_1
4: sipush 1000
7
: istore_2
8: getstatic #2;
//Field java/lang/System.out:Ljava/io/PrintStream;
11
: iload_1
12
: iload_2
13: if_icmpne 20
16
: iconst_1
17:
goto 21
20
: iconst_0
21: invokevirtual #3;
//Method java/io/PrintStream.println:(Z)V
24: sipush 1000
27: invokestatic #4;
//Method java/lang/Integer.valueOf:(I)Ljava/lang/Integer;
30
: astore_3
31: sipush 1000
34: invokestatic #4;
//Method java/lang/Integer.valueOf:(I)Ljava/lang/Integer;
37: astore 4
39: getstatic #2;
//Field java/lang/System.out:Ljava/io/PrintStream;
42
: aload_3
43: aload 4
45: if_acmpne 52
48
: iconst_1
49:
goto 53
52
: iconst_0
53: invokevirtual #3;
//Method java/io/PrintStream.println:(Z)V
56: bipush 100
58: invokestatic #4;
//Method java/lang/Integer.valueOf:(I)Ljava/lang/Integer;
61: astore 5
63: bipush 100
65: invokestatic #4;
//Method java/lang/Integer.valueOf:(I)Ljava/lang/Integer;
68: astore 6
70: getstatic #2;
//Field java/lang/System.out:Ljava/io/PrintStream;
73: aload 5
75: aload 6
77: if_acmpne 84
80
: iconst_1
81:
goto 85
84
: iconst_0
85: invokevirtual #3;
//Method java/io/PrintStream.println:(Z)V
88:
return
}
由上述字节码我们可以看出 int a = 1000, b = 1000;System.out.println(a ==
b);执行的是if_icmpne命令,比较的是2个int值是否相等。在此返回为true。
而 Integer c = 1000, d = 1000;System.out.println(c==
d);执行的是if_acmpne命令,比较的是对象引用地址。查看jdk源码
public static Integer valueOf(
int i) {
final int offset = 128
;
if (i >= -128 && i <= 127) {
// must cache
return IntegerCache.cache[i +
offset];
}
return new Integer(i);
}
此时的值为1000,不在-128~127范围内。所以变量c和d是2个不同的对象。因此System.out.println(c==
d);返回结果为false。
而 Integer e = 100, f = 100;System.out.println(e == f); 用的是Integer缓存中的同一对象,因此返回结果为true。
今天又是学习了。。。以前没有注意这个问题
转载与:http://blog.csdn.net/jeamking/article/details/6883623
转载于:https://www.cnblogs.com/huzi007/p/4171146.html