java自动打包的差异 - mashiguang - BlogJava

导读:
  mashiguang
  小马快跑
  9 随笔 :: 0 文章 :: 13 评论 :: 0 Trackbacks
  自JDK1.0开始就存在包装器类,但是在JDK5.0之前,必须手工地插入打包和拆包的代码.
  JDK5.0中就有了自动打包功能,但在5.0中自动打包时存在一些差异,刚才看《java核心技术第7版》时才发现.
  代码1:
  Integer a=1000Integer b=1000System.out.println(a==b);//false
  代码2:
  Integer a=100Integer b=100System.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被包装到固定的对象中.
  打包和拆包是编译器认可的,而不是虚拟机,编译器在生成类的字节码时,插入必要的方法调用,虚拟机只是执行这些字节码。
  第三段代码不用多说肯定不成立.
  
  mashiguang评论(5)编辑收藏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
  楼上的说的对~~! 回复 更多评论
  
  标题
  姓名
  主页
  验证码 *
  内容(请不要发表任何与政治相关的内容)
  
  Remember Me?
  [使用Ctrl+Enter键可以直接提交]
  
  

本文转自
http://www.blogjava.net/mashiguang/archive/2007/12/13/167549.html

你可能感兴趣的:(java,jdk,虚拟机,web开发,Integer,编译器)