Integer c = 3;
Integer d = 3;
Integer e = 321;
Integer f = 321;
System.out.println(c == d);
System.out.println(e == f);
输出 true false
Integer为对象判断是否相等还是使用equals最靠谱,
int为基本类型,判断是否相等就是可以使用==.
其中的原因:
static final Integer cache[] = new Integer[-(-128) + 127 + 1];
static {
for(int i = 0; i < cache.length; i++)
cache[i] = new Integer(i - 128);
}
}
这是源码中的,也就是说cache中已有-128到127,不在这范围的会新new ,这时可以理解比较是内存地址,
也就是是不是同一对象.
所以说当Integer的值不在-128到127的时候使用==方法判断是否相等就会出错,在这个范围之内的就会没有问题!!!
eg:
package intAndInteger;
2
3 public class test {
4 public static void main(String[] args) {
5 // 两个new出来的Integer类型的数据比较,
6 //相当于把new出来的地址作比较
7
8 Integer a0 = new Integer(1);// 普通的堆中对象
9 Integer b0 = new Integer(1);
10 System.out.println("new出来的 " + "a0==b0 :" + (a0 == b0));
11 System.out.println(a0);
12
13 // 调用intValue方法得到其int值
14 System.out.println("调用intValue " + "a0.intValue() == b0.intValue()" +
15 (a0.intValue() == b0.intValue()));
16
17 // 把Integer类型的变量拆箱成int类型
18 int c = 1;
19 System.out.println("将Integer自动拆箱 " + "a0==c: " + (a0 == c));
20
21 // 其实也是内存地址的比较
22 Integer a1 = 30; // 自动装箱,如果在-128到127之间,则值存在常量池中
23 Integer b1 = 30;
24 System.out.println("直接赋值的两个Integer的比较" +
25 "a2 == b2: "+ (a1 == b1));
26
27 Integer a2 = 30;
28 Integer b2 = 40;
29 System.out.println("直接赋值的两个Integer的比较 " +
30 "a6==b6: " + (a2 == b2));
31
32 Integer a3 = 128;
33 Integer b3 = 128;
34 System.out.println("直接赋值的两个Integer的比较 " +
35 "a5 == b5: " + (a3 == b3));
36
37 Integer a4 = 412;
38 Integer b4 = 412;
39 System.out.println("直接赋值的两个Integer的比较 " +
40 "a4 == b4: " + (a4 == b4));
41 // 从这里看出,当给Integer直接赋值时,
42 //如果在-128到127之间相等的话,它们会共用一块内存
43 // 而超过这个范围,则对应的Integer对象有多少个就开辟多少个
44
45 System.out.println("调用intValue " + "a4.intValue() == b4.intValue(): "
46 + (a4.intValue() == b4.intValue()));
47 }
48 }
复制代码
在JDK1.8.0下运行可得:
复制代码
1 new出来的 a0==b0 :false
2 1
3 调用intValue a0.intValue() == b0.intValue()true
4 将Integer自动拆箱 a0==c: true
5 直接赋值的两个Integer的比较a2 == b2: true
6 直接赋值的两个Integer的比较 a6==b6: false
7 直接赋值的两个Integer的比较 a5 == b5: false
8 直接赋值的两个Integer的比较 a4 == b4: false
9 调用intValue a4.intValue() == b4.intValue(): true
复制代码
综上:在用两个Integer对象比较数值的话,如果是整型值的话最好调用intValue方法来得到一个int类型的值或equals,当然也可将其转变为
float(floatValue),double(longValue)类型来比较。
public int intValue()
以 int 类型返回该 Integer 的值。