mashiguang

小马快跑

  BlogJava :: 首页 :: 新随笔 :: 联系 :: 聚合  :: 管理 ::
  20 随笔 :: 0 文章 :: 60 评论 :: 0 Trackbacks
自JDK1.0开始就存在包装器类,但是在JDK5.0之前,必须手工地插入打包和拆包的代码.
JDK5.0中就有了自动打包功能,但在5.0中自动打包时存在一些差异,刚才看《java核心技术第7版》时才发现.

代码1:
Integer a=1000;
Integer b
=1000;
System.out.println(a
==b);//false
代码2:
Integer a=100;
Integer b
=100;
System.out.println(a
==b);//true
代码3:
Integer a=new Integer(100);
Integer b
=new Integer(100);
System.out.println(a
==b);//false

第一段代码不成立,而第二段代码成立的原因是:自动打包
自动打包规范要求boolean,byte,char≤127,介于-128→127之间的short和int被包装到固定的对象中.
打包和拆包是编译器认可的,而不是虚拟机,编译器在生成类的字节码时,插入必要的方法调用,虚拟机只是执行这些字节码。

第三段代码不用多说肯定不成立.

 

posted on 2007-12-13 17:03 mashiguang 阅读(1328) 评论(6)  编辑  收藏 所属分类: java web开发

评论

# re: java自动打包的差异 2007-12-13 18:18 德德
貌似打包这词看着很不舒服

装箱比较好听点吧


  回复  更多评论
  

# re: java自动打包的差异[未登录] 2007-12-14 09:16 paul
以前没太注意这个,前短时间看了下 java解惑, java内部的事好多都是我们不知道的,也是应该应该注意的  回复  更多评论
  

# re: java自动打包的差异 2007-12-14 10:31 mashiguang
@德德
我也觉得装箱更好听点.

但从这本书上看来java好像更希望我们称之为autowrapping,因为autoboxing源于c#.

其实叫什么都无所谓啦.  回复  更多评论
  

# re: java自动打包的差异 2007-12-14 11:18 隔叶黄莺
这跟自动装箱关系不大,实质上
Integer d1 = 200 ;
调用的是
Integer d1 = Integer.valueOf(200) ;

因为缓存中有 -128~127
所以其中的数字用
Integer.valueOf()
Long.valueOf()
等会反回同一个对象,也因为 Integer/Long等是不变式的,所以可以这么用

总之不应归咎到自动装拆箱的误,首先要检讨的是你有
d1==d2
的形式进行比较的意途是什么,显然去比较它们的引用基本没什么意思,既然是比较数值就用
d1.equals(d2) 或者 d1.intValue()==d2.intValue()
来比较,也是编程习惯要注意的问题。  回复  更多评论
  

# re: java自动打包的差异[未登录] 2007-12-17 01:10 eleven
楼上的说的对~~!  回复  更多评论
  

# re: java自动打包的差异[未登录] 2012-10-19 17:08 王辉
@隔叶黄莺
正解!顶!!!!  回复  更多评论
  


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


网站导航: