先看如下一段代码,这是进行Integer数值比较的几种方法,第一种是直接使用==逻辑运算符进行比较,第二种是使用equals方法进行比教,第三种方法是利用Integer对象的intValue()方法将类型转变为int类型进行比较。
public class test {
public static void main(String[] args) {
Integer a = 127;
Integer b = 127;
Integer c = 128;
Integer d = 128;
if(a==b){
System.out.println(true);
}else{
System.out.println(false);
}
if(c==d){
System.out.println(true);
}else{
System.out.println(false);
}
if(c.equals(d)){
System.out.println(true);
}else{
System.out.println(false);
}
if(c.intValue()==d.intValue()){
System.out.println(true);
}else{
System.out.println(false);
}
}
}
比较结果如下:
我们发现了一个有趣的现象,当Integer的值为127时使用“==”进行比较时,结果为true,而当用该方法进行数值128的比较时,结果就为false了。
到底是什么原因呢?
来通过dubug进行探寻
我们发现a和b的值不仅相同,而且地址也相同,但是c和d只有值是相同的,但是地址却是完全不同的。由于“==”是进行地址的比较,这就解释了为啥c和d比较结果为false了。
JVM的基本类型的常量池中,int初始化-128~127的范围,所以当为Integer i=127时,在自动装箱过程中是取自常量池中的数值,而当Integer 为128时,128不在常量池范围内,所以在自动装箱过程中需new Integer(128)操作,所以地址不一样。