论坛首页 Java企业应用论坛

Effective java --读书笔记 -- 拆箱和装箱

浏览 10300 次
精华帖 (0) :: 良好帖 (0) :: 新手帖 (2) :: 隐藏帖 (0)
作者 正文
   发表时间:2009-11-16  
  String中的所有“111”常量是为了节省内存,统一存放在常量区。s1和s2则都是指向该同一个常量地址,所以s1==s2返回true;
  java中-128~127的整型包装类采用了复用机制,也就是说Integer i1=127,i2=127时,这两个实例引用都是指向同一个Integer实例。关于这个你可以看下Integer类的源代码就知道了。
0 请登录后投票
   发表时间:2009-11-17   最后修改:2009-11-17
JackAndroid 写道
  String中的所有“111”常量是为了节省内存,统一存放在常量区。s1和s2则都是指向该同一个常量地址,所以s1==s2返回true;
  java中-128~127的整型包装类采用了复用机制,也就是说Integer i1=127,i2=127时,这两个实例引用都是指向同一个Integer实例。关于这个你可以看下Integer类的源代码就知道了。

那是Integer.valueOf(xxx)方法,如果使用new Integer(xxx)的话,仍然不会复用的。
0 请登录后投票
   发表时间:2009-11-17  
new Integer()是与new String()一样,看清我的回答,我说的是i=127,指的是自动装箱。
0 请登录后投票
   发表时间:2009-11-17  
不用要new Integer(xxx);
这样用
Integer.valueOf(100);
Boolean.valueOf(true);
0 请登录后投票
   发表时间:2009-11-17  
我也正在看这本书,写的有些抽象,有的地方需要多理解几次~总之感觉中文版翻译的还不错
0 请登录后投票
   发表时间:2009-11-17   最后修改:2009-11-17
JackAndroid 写道
new Integer()是与new String()一样,看清我的回答,我说的是i=127,指的是自动装箱。

恩,你是说的没错,不过最好告诉新手,自动装箱(编译优化)调用的是哪个方法,否则你叫新人看源代码,别人怎么看?
0 请登录后投票
   发表时间:2009-11-17  
zhxing 写道
xuloveqi 写道
就像 Stirng s1 = "1111"; String s2="111"; System.out.println(s1 == s2); 问题本身需要明白Java虚拟机是怎样做的。Java有些复杂了。


String 是虚拟机内部的实现做了优化,而已Integer 是代码内部做的优化,不一样吧。

zhxing说的很对,一个是虚拟机优化,一个是内部代码优化。不要搞混啊。
0 请登录后投票
   发表时间:2009-11-17  
armstrong311 写道
我也正在看这本书,写的有些抽象,有的地方需要多理解几次~总之感觉中文版翻译的还不错

嘻嘻,本人手里也有这本书,挺不错的,2 edition,译者翻译的很用心。
0 请登录后投票
   发表时间:2009-11-17  
记得 c#里有拆箱和装箱
0 请登录后投票
   发表时间:2009-11-17   最后修改:2009-11-17
zhengyutong 写道
zhxing 写道
xuloveqi 写道
就像 Stirng s1 = "1111"; String s2="111"; System.out.println(s1 == s2); 问题本身需要明白Java虚拟机是怎样做的。Java有些复杂了。


String 是虚拟机内部的实现做了优化,而已Integer 是代码内部做的优化,不一样吧。

zhxing说的很对,一个是虚拟机优化,一个是内部代码优化。不要搞混啊。

前一个是编译优化,不是虚拟机优化。

自动装箱和拆箱算是编译器自动生成代码的味道,编译期自动生成调用Integer.valueOf()方法,而该方法实际运行时内部使用了享元(蝇量、FlyWeight)模式优化。
0 请登录后投票
论坛首页 Java企业应用版

跳转论坛:
Global site tag (gtag.js) - Google Analytics