随笔-15  评论-79  文章-0  trackbacks-0
昨天跟朋友一起吃饭,他说到两个Integer类型值比较是否相等的问题。经理也在这里把java的Integer值比较的问题拿出来说一说。因为在面试的时候这个是经常遇到的问题。
首先给大家看一个例子:
 1public class Test {
 2
 3    /**
 4     * 关于Integer大小比较问题
 5     * @author 经理
 6     */

 7    public static void main(String[] args) {
 8        Integer a = 10;
 9        Integer b = 10;
10        System.out.println("a==b : " + String.valueOf(a==b));
11        System.out.println("a.equals(b) : " + String.valueOf(a.equals(b)));
12    }

13}

14
运行一下,在控制台得到的结果是这样的
a==b : true
a.equals(b) : 
true

当是当我们变换一下值
 1public class Test {
 2
 3    /**
 4     * 关于Integer大小比较问题
 5     * @author 经理
 6     */

 7    public static void main(String[] args) {
 8        Integer a = 1000;
 9        Integer b = 1000;
10        System.out.println("a==b : " + String.valueOf(a==b));
11        System.out.println("a.equals(b) : " + String.valueOf(a.equals(b)));
12    }

13}

运行一下,控制台的结果又是
a==b : false
a.equals(b) : 
true

这是什么原因呢?我当时也有点犯糊涂。有点冲动就直接开源码看了。
实际上在我们用Integer a = 数字;来赋值的时候Integer这个类是调用的public static Integer valueOf(int i)这个方法。
1public static Integer valueOf(int i) {
2        if(i >= -128 && i <= IntegerCache.high)
3            return IntegerCache.cache[i + 128];
4        else
5            return new Integer(i);
6    }
我们来看看ValueOf(int i)的代码,可以发现他对传入参数i做了一个if判断。在-128<=i<=127的时候是直接用的int原始数据类型,而超出了这个范围则是new了一个对象。我们知道"=="符号在比较对象的时候是比较的内存地址,而对于原始数据类型是直接比对的数据值。那么这个问题就解决了。
至于为什么用int型的时候值会在-128<=i<=127范围呢呢?我们知道八位二进制的表示的范围正好就是-128到127。大概就是因为这吧。

把平时出现的问题记录下来,自己就可以一点一点进步了。
posted on 2010-07-24 16:03 张元Won 阅读(24782) 评论(12)  编辑  收藏 所属分类: Java

评论:
# re: 关于Integer大小比较的问题 2010-07-24 21:22 | bokix
第一次看到这种问题,自己以后写代码要注意了。
不过,“教科书”上教我们,两个不同对象之间用“==”操作应该是false,因为内存地址不同,如果真这么写的,那应该问问自己,究竟想比较什么?内存地址还是数值?  回复  更多评论
  
# re: 关于Integer大小比较的问题 2010-07-24 22:52 | え经理え
@bokix
是啊~
推荐多看看源码,看源码才能知道问题的根本所在。  回复  更多评论
  
# re: 关于Integer大小比较的问题 2010-07-25 11:26 | rox
恩,这个问题,同事曾经讲过,不拿出来单独说就很容易忘记。
所以,原则上,应该还是用==比基本类型值。  回复  更多评论
  
# re: 关于Integer大小比较的问题 2010-07-25 11:39 | 文温
java Integer比较的妙用 http://www.wenhq.com/article/view_392.html  回复  更多评论
  
# re: 关于Integer大小比较的问题[未登录] 2010-07-25 14:11 | xxx
要养成好的习惯,不用随便用==来判断对象的相等。java不支持操作符重载,所以要用equal来判断2个对象是否逻辑相等。  回复  更多评论
  
# re: 关于Integer大小比较的问题[未登录] 2010-07-25 14:12 | xxx
java不是纯OO语言。基本类型默认不是对象,因此对于基本类型要用==来判断。  回复  更多评论
  
# re: 关于Integer大小比较的问题 2010-07-26 14:28 | 蒂亚戈——侯赛因
博主你是用什么方法怎么“直接开源码看” 看到这些的?

public static Integer valueOf(int i) {
2 if(i >= -128 && i <= IntegerCache.high)
3 return IntegerCache.cache[i + 128];
4 else
5 return new Integer(i);
6 }
  回复  更多评论
  
# re: 关于Integer大小比较的问题 2010-07-27 16:20 | え经理え
@蒂亚戈——侯赛因
你装个jad就可以看到了~ 多看看源码!  回复  更多评论
  
# re: 关于Integer大小比较的问题 2010-07-27 16:22 | え经理え
对象还是用eqauls()比较稳妥,eqauls前要判断是否为空@rox
  回复  更多评论
  
# re: 关于Integer大小比较的问题 2010-07-27 16:29 | え经理え
说的很对啊,要养成好习惯,对象比较内容要用equals @xxx
  回复  更多评论
  
# re: 关于Integer大小比较的问题 2011-02-12 16:19 | 风清月明
细节处见真功夫!!!赞。  回复  更多评论
  
# re: 关于Integer大小比较的问题 2013-12-04 16:17 | 武汉-后来者-存在感
究其原因, 应该是java对小整形对象的优化, 打个比方: 程序中有1亿个-128-127之间的integer, 如果按照正常我们的OO, 每个都是个对象的话, 就有1亿个integer, 可以java来说, 就是引用了. 这样大大减少对象的数量.  回复  更多评论
  

只有注册用户登录后才能发表评论。


网站导航: