精华帖 (0) :: 良好帖 (0) :: 新手帖 (2) :: 隐藏帖 (0)
|
|
---|---|
作者 | 正文 |
发表时间:2009-11-16
String中的所有“111”常量是为了节省内存,统一存放在常量区。s1和s2则都是指向该同一个常量地址,所以s1==s2返回true;
java中-128~127的整型包装类采用了复用机制,也就是说Integer i1=127,i2=127时,这两个实例引用都是指向同一个Integer实例。关于这个你可以看下Integer类的源代码就知道了。 |
|
返回顶楼 | |
发表时间: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)的话,仍然不会复用的。 |
|
返回顶楼 | |
发表时间:2009-11-17
new Integer()是与new String()一样,看清我的回答,我说的是i=127,指的是自动装箱。
|
|
返回顶楼 | |
发表时间:2009-11-17
不用要new Integer(xxx);
这样用 Integer.valueOf(100); Boolean.valueOf(true); |
|
返回顶楼 | |
发表时间:2009-11-17
我也正在看这本书,写的有些抽象,有的地方需要多理解几次~总之感觉中文版翻译的还不错
|
|
返回顶楼 | |
发表时间:2009-11-17
最后修改:2009-11-17
JackAndroid 写道 new Integer()是与new String()一样,看清我的回答,我说的是i=127,指的是自动装箱。
恩,你是说的没错,不过最好告诉新手,自动装箱(编译优化)调用的是哪个方法,否则你叫新人看源代码,别人怎么看? |
|
返回顶楼 | |
发表时间:2009-11-17
zhxing 写道 xuloveqi 写道 就像 Stirng s1 = "1111"; String s2="111"; System.out.println(s1 == s2); 问题本身需要明白Java虚拟机是怎样做的。Java有些复杂了。
String 是虚拟机内部的实现做了优化,而已Integer 是代码内部做的优化,不一样吧。 zhxing说的很对,一个是虚拟机优化,一个是内部代码优化。不要搞混啊。 |
|
返回顶楼 | |
发表时间:2009-11-17
armstrong311 写道 我也正在看这本书,写的有些抽象,有的地方需要多理解几次~总之感觉中文版翻译的还不错
嘻嘻,本人手里也有这本书,挺不错的,2 edition,译者翻译的很用心。 |
|
返回顶楼 | |
发表时间:2009-11-17
记得 c#里有拆箱和装箱
|
|
返回顶楼 | |
发表时间: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)模式优化。 |
|
返回顶楼 | |