java中两个Integer类型的值相比较的问题

今天在做一个算法时,由于为了和其他人保持接口的数据类型一致,就把之前的int换为Integer,前几天测了几组数据,和之前的结果一样,但是今天在测其它数据

的时候,突然出现了一个奇怪的bug,由于之前我的模块所有的数据(就是当时数据类型还是int)都测过,这个算法整体由三个所写的模块构成(包括我在内),所以其他

两位同伴都去检测各自的模块,但是后来发现是我传出来的数据有点问题,当时我也是百思不得其解,就一路打断点,加肉眼查看数据,后来终于发现是两个Integer类型的

值在本应该相等的地方进入相等体系中的逻辑,但却进入了不相等的逻辑流程中,这两个数是412(Integer),然后当时我就直接将一侧的Integer直接换成412后,就可以

进入相等的逻辑中,将另一侧换成Integer后,也可以进入相等的逻辑。

下面以一个例子看一下:


 1 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类型的值,当然也可将其转变为

float(floatValue),double(longValue)类型来比较。

在JDK API 1.6.0中文版中是这样介绍intValue的,

intValue

public int intValue()
int 类型返回该 Integer 的值。

 

指定者:
Number 中的 intValue
返回:
转换为 int 类型后该对象表示的数值。

关于更深入的Integer的底层实现,可查看如下博客:http://blog.csdn.net/snail_rao/article/details/7639194

 

 

posted @ 2016-03-15 16:32  笑哼  阅读(37982)  评论(7编辑  收藏  举报