我的蛋壳

倡导自由、开放、分享的Java技术社区 http://www.javaread.com

 

新发现,大家都来试试看,有没有猜对结果

 1 public class AutoBoxingTester {        
 2 public static void judgeEqual(Integer i, Integer j) 
 3 {        
 4 if (i == j) {            
 5 System.out.println("Equal!");        
 6 else {            
 7 System.out.println("Not Equal!");        
 8 }    
 9 }     
10 public static void main(String[] args){        
11 Integer i = 100;        
12 Integer j = 100;        
13 judgeEqual(i, j);                
14 Integer a = 255;        
15 Integer b = 255;        
16 judgeEqual(a, b);    
17 
18 }


结果是怎样呢?两个"Equal"?或者两个"Not Equal"?猜对了没有?
嘿嘿,大家跑一跑的话,可能就会觉得很奇怪了。

 

答案就先不贴出来,大家先猜一猜,免得破坏兴致。
欲知答案以及分析详见:
AutoBoxing与Unboxing细节分析

本文作者:javaread.com

posted on 2008-08-19 17:49 javaread.com 阅读(1832) 评论(14)  编辑  收藏

评论

# re: 新发现,大家都来试试看,有没有猜对结果 2008-08-19 18:13 小笨笨

好像是2个 相等吧  回复  更多评论   

# re: 新发现,大家都来试试看,有没有猜对结果 2008-08-19 18:15 KTOO

去试了下,发现-128到127间的Integer是Equal,其它的就成了Not Equal了  回复  更多评论   

# re: 新发现,大家都来试试看,有没有猜对结果 2008-08-19 18:25

所以,不要使用==,而是使用Equals来判断啦

除了对基本数据类型,==从来是判断指针的
  回复  更多评论   

# re: 新发现,大家都来试试看,有没有猜对结果 2008-08-19 18:29 bjsuo

因为Integer对象把-128到127之间的数字预定义成了静态变量,所以每当生成这个区间的数字的时候,实际上直接返回了预生成的对象,所以
Integer i = 100;
Integer j = 100; 实际上i和j是指向的同一个对象而
Integer i = 255;
Integer j = 255; 是生成了两个不同的对象,比较引用是不等的  回复  更多评论   

# re: 新发现,大家都来试试看,有没有猜对结果[未登录] 2008-08-19 18:46 ytl

第一个不相等第2个相等  回复  更多评论   

# re: 新发现,大家都来试试看,有没有猜对结果 2008-08-19 21:11 Hatter Jiang

这个和JAVA的常量池有关系,有举的同学可以去google一下JAVA的常量池的信息  回复  更多评论   

# re: 新发现,大家都来试试看,有没有猜对结果 2008-08-19 23:13 隔叶黄莺

Integer i = 100;

编译之后实际的操作是
Integer i = Integer.valueOf(100);

再看 valuesOf() 方法就能知道,对于-128到127之间的数字是从缓存中取的,所以==。

所以拆箱装箱是编译器的行为,而非 JVM 的行为。  回复  更多评论   

# re: 新发现,大家都来试试看,有没有猜对结果 2008-08-20 00:00 xbloom

jdk source:
public static Integer valueOf(int i) {
final int offset = 128;
if (i >= -128 && i <= 127) { // must cache
return IntegerCache.cache[i + offset];
}
return new Integer(i);
}  回复  更多评论   

# re: 新发现,大家都来试试看,有没有猜对结果 2008-08-20 00:27 黑蝙蝠

原来是这样~~~ i == j 的时候会调用valueOf吗?  回复  更多评论   

# re: 新发现,大家都来试试看,有没有猜对结果 2008-08-20 00:49 隔叶黄莺

i == j
就是比较,是最基本的操作,不会跑去调用 valueOf()的  回复  更多评论   

# re: 新发现,大家都来试试看,有没有猜对结果 2008-08-20 12:35 aaronhe

Integer i = 100; 这个能编译通过?  回复  更多评论   

# re: 新发现,大家都来试试看,有没有猜对结果 2008-08-20 13:15 々上善若水々

楼上火星人.  回复  更多评论   

# re: 新发现,大家都来试试看,有没有猜对结果 2008-08-23 00:19 飘然

if (i >= -128 && i <= 127) { // must cache
return IntegerCache.cache[i + offset];
}

所以一般情况下,推荐使用integer.valueOf()方法,尽量不要用new Integer().
另外这个cache是jdk5.0之后才有的,1.4版本中是没有的,楼主可以用1.4编译试试看。

注意是用jdk1.4编译,不能用jdk5设置编译选项为1.4.  回复  更多评论   

# re: 新发现,大家都来试试看,有没有猜对结果 2008-08-24 17:09 凌晨风

这个应该是JDK1.5之后的自动装箱、拆箱吧!
-128~127 基本数据类型
大于127 为对象  回复  更多评论   


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


网站导航:
 

导航

统计

常用链接

留言簿(3)

随笔档案

Java

友情链接

搜索

最新评论

阅读排行榜

评论排行榜