张元Won的空间
张元Won的空间间
BlogJava
首页
新随笔
联系
聚合
管理
随笔-15 评论-79 文章-0 trackbacks-0
关于Integer大小比较的问题
昨天跟朋友一起吃饭,他说到两个Integer类型值比较是否相等的问题。经理也在这里把java的Integer值比较的问题拿出来说一说。因为在面试的时候这个是经常遇到的问题。
首先给大家看一个例子:
1
public
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
当是当我们变换一下值
1
public
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)这个方法。
1
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
}
我们来看看ValueOf(int i)的代码,可以发现他对传入参数i做了一个if判断。在-128<=i<=127的时候是直接用的int原始数据类型,而超出了这个范围则是new了一个对象。我们知道"=="符号在比较对象的时候是比较的内存地址,而对于原始数据类型是直接比对的数据值。那么这个问题就解决了。
至于为什么用int型的时候值会在-128<=i<=127范围呢呢?我们知道八位二进制的表示的范围正好就是-128到127。大概就是因为这吧。
把平时出现的问题记录下来,自己就可以一点一点进步了。
posted on 2010-07-24 16:03
张元Won
阅读(24783)
评论(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来说, 就是引用了. 这样大大减少对象的数量.
回复
更多评论
新用户注册
刷新评论列表
只有注册用户
登录
后才能发表评论。
网站导航:
博客园
IT新闻
Chat2DB
C++博客
博问
管理
相关文章:
JAVA拦截器原理及Struts2扩展
关于Integer大小比较的问题
JAVA读取配置文件
欢迎BI、数据挖掘爱好者共同学习进步
<
2011年2月
>
日
一
二
三
四
五
六
30
31
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
1
2
3
4
5
6
7
8
9
10
11
12
常用链接
我的随笔
我的评论
我的参与
最新评论
留言簿
(2)
给我留言
查看公开留言
查看私人留言
随笔分类
Cognos(4)
Database(2)
Flex(2)
Java(3)
Myeclipse(3)
随笔档案
2011年6月 (1)
2011年5月 (1)
2010年11月 (1)
2010年9月 (2)
2010年8月 (3)
2010年7月 (4)
2010年5月 (2)
搜索
最新评论
1. re: Myeclipse配置插件
我写的和你的一模一样就是不可以,可以教我一下吗?302933397这是我的QQ
--罗永樟
2. re: JAVA拦截器原理及Struts2扩展
评论内容较长,点击标题查看
--打破沙锅问到底
3. re: Cognos SDK 研究学习手册(二)之[java读取report报表返回XML][未登录]
@匿名
补充
ParmValueItem[] p1 = new ParmValueItem[1];
p1[0] = item1;
--匿名
4. re: Cognos SDK 研究学习手册(二)之[java读取report报表返回XML][未登录]
第5项中 int index=0 应该放在循环外面 还有参数名称要和cognos报表中的参数名称对应 带参报表终于解析出来了 。
--匿名
5. re: Cognos SDK 研究学习手册(二)之[java读取report报表返回XML]
请问一下如果报表的列项是合并的单元格,xml里面是否会展示出来?
--黑蝙蝠
阅读排行榜
1. Myeclipse配置插件(32502)
2. Myeclipse 8.5 配置SVN(31290)
3. 关于Integer大小比较的问题(24783)
4. MyEclipse8.5优化(18451)
5. Cognos SDK 研究学习手册(二)之[java读取report报表返回XML](6192)
评论排行榜
1. Cognos SDK 研究学习手册(二)之[java读取report报表返回XML](16)
2. Myeclipse 8.5 配置SVN(13)
3. Myeclipse配置插件(13)
4. 关于Integer大小比较的问题(12)
5. Cognos SDK 研究学习手册(一)(8)