笨蛋小贼- -| 回首页 | 2004年索引 | - -“教父”离开了

Autoboxing surprises- -

                                      

来看几段Java 1.5的代码??听说Sun有计划把Java 1.5改成叫Java 5.0,因为这个版本的改变实在太大。不管这些,先来看代码:
 
  Integer i1 = new Integer( 2);
  Integer i2 = new Integer( 2);
  System.out.println( i1==i2);
 
唔,这段实际上不是1.5的代码,Thinking in Java里面也能看到。答案是false。再看下一段:
 
  Integer j1 = 150;
  Integer j2 = 150;
  System.out.println( j1==j2);

这个嘛……从直觉来说好象应该是true。但是细想想,autoboxing应该是在背后调用了一次Integer.valueOf(int)方法,这个方法当然只能创建新的对象。所以,尽管有autoboxing,还是跟上面那段代码结果一样。答案也是false。可是,下面这段……
 
  Integer k1 = 2;
  Integer k2 = 2;
  System.out.println( k1==k2);
 
答案居然是true。其实想想道理也很清楚:Integer.valueOf(int)方法不能缓存所有的int值,但可以缓存一些比较小的值。在autoboxing的规范里有这样两段话:
 
If the value p being boxed is true, false, a byte, an ASCII character, or an integer or short number between -127 and 128, then let r1 and r2 be the results of any two boxing conversions of p. It is always the case that r1 == r2.


Ideally,  boxing a given primitive value p, would always yield an identical reference. In practice, this may not be feasible using existing implementation techniques. The rules above are a pragmatic compromise. The final clause above requires that certain common values always be boxed into indistinguishable objects. The implementation may cache these, lazily or eagerly.
 
 
所以,第二段代码的结果其实是undefined,取决于JDK实现缓存多少int值。如果在内存充裕的环境下,可以将全部int值(-32K~32K)都缓存起来,这样就可以保证同一个int值经过autobox之后得到同一个Integer对象(即:第二段代码结果也为true)。而在现在的实现下,就多少有些违反直觉,正如我们前面看到的。看起来,虽然autoboxing简化了代码,对于Integer对象,仍然应该用equals()方法判断它的相等性。另外,这部分内容是在Beta 2中加入的。在Beta 1里面,同一个primitive值两次autobox之后得到的肯定是不同的对象(即:第三段代码结果也为false)??我倒觉得这个简单明了的规则更舒服些。

- 作者: gigix 2004年07月7日, 星期三 09:32

Trackback

你可以使用这个链接引用该篇日志 http://publishblog.blogdriver.com/blog/tb.b?diaryID=231146

博客手拉手

回复

- 评论人:eyjezgld

Thu Oct 12 04:29:18 CST 2006  作者邮箱  作者Blog

ouxwxwmecs[url=http://www.koolpages.com/kkjlehl/index.html]推广技巧[/url][url=http://www.koolpages.com/kkjlehl/26198047.htm]网站建设策划方案[/url][url=http://www.koolpages.com/kkjlehl/47348973.htm]引擎排名[/url][url=http://www.koolpages.com/kkjlehl/00157846.htm]网站推广mail[/url][url=http://www.koolpages.com/kkjlehl/95187597.htm]网站推广工具下载[/url][url=http://www.powow.com/oxvhseh/index.html]网站推广的方法[/url][url=http://www.powow.com/oxvhseh/80303016.htm]网站推广群发软件[/url][url=http://www.powow.com/oxvhseh/63576814.htm]网站排名榜[/url][url=http://www.powow.com/oxvhseh/46504715.htm]电子邮件群发[/url][url=http://www.powow.com/oxvhseh/90790388.htm]qq无限群发器[/url][url=http://www.pagerealm.com/qoitojq/index.html]如何建立网站[/url][url=http://www.pagerealm.com/qoitojq/40480876.htm]什么网站赚钱[/url][url=http://www.pagerealm.com/qoitojq/93765714.htm]qq消息群发工具[/url][url=http://www.pagerealm.com/qoitojq/13671137.htm]论坛自动发帖工具[/url][url=http://www.pagerealm.com/qoitojq/45301112.htm]进出口企业名录[/url]

- 评论人:卡

Thu Apr 28 10:42:24 CST 2005  作者Blog

为什么要这么写呢?
有什么好处吗?
这不是增加不确定~?

不懂只是问问~

- 评论人:java初学者

Tue Apr 05 11:25:31 CST 2005  作者Blog

各位GG们,第六题可以那样写吗?不会有问题吗?是不是JDK1.5就能那样写啊?现在用JDK1.22不能那样写啊!

- 评论人:看不懂

Thu Mar 24 09:06:59 CST 2005  作者邮箱  作者Blog

我看不 懂 谁知道什么时候内存够大 什么时候不够

- 评论人:re

Fri Feb 18 18:20:33 CST 2005  作者邮箱  作者Blog

看懂了,谢谢,啊,刚才看CSDN的emag的最后一道题目,郁闷得要死。
总算找到答案了。

- 评论人:透明

Wed Jul 14 14:59:10 CST 2004 

也不见得。因为对于Integer这样的wrapper类型,原本就应该用equals()来判断相等性的。虽然==操作符的行为是undefined,但equals()的行为总是确定的。
要解决==操作符的undefined,只能寄希望于算符重载了。

- 评论人:zzeric

Wed Jul 14 13:03:22 CST 2004 

分明在制造一些不确定因素,何苦呢

- 评论人:femto

Thu Jul 08 16:07:29 CST 2004  作者邮箱 

autobox 的话我用idea的插件的,那用什么java 1.5。

- 评论人:jjx

Thu Jul 08 11:36:21 CST 2004 

相比这个,dotnet的value type机制好很多,valuetype首先就阻止了new 操作
  Int32 i1 = 77777;
            Int32 i2 = 77777;
            System.Diagnostics.Debug.Assert(i1.Equals(i2));
            Object o1, o2;
            o1 = i1;
            o2 = i2;
            System.Diagnostics.Debug.Assert(o1.Equals(o2));
            System.Diagnostics.Debug.Assert(o1.Equals(i1));

- 评论人:匿名

Thu Jul 08 10:18:11 CST 2004 

这样的机制真是让人狂吐不止!看来还是C语言好!

- 评论人:玻璃雨衣

Wed Jul 07 17:09:07 CST 2004 

写个代码象说书似的。

评论内容: