`

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

阅读更多
package chape8;
/**
* 8--49
* 基本数据类型优于装箱基本类型
* java1.5发行中了自动装箱和拆箱;但是这些特性没有完全抹去基本数据类型和引用数据类型的区别
* 基本数据类型和装箱数据类型的区别:
* 第一:基本类型只有值。而装箱基本类型则具有与他们的值不同的同一性;
*  第二:基本类型只有功能完备的值;而每个装箱基本类型处理它对应的基本类型的所有功能外,还有非功能值 null
*  第三:基本类型比装箱类型节省时间和空间;
*
* @author lee
*
*/
public class Chape49 {
static Integer i ;
/**
* 我们看一个方法;
*/
public static int  compare (Integer one , Integer two)
{
return one<two?-1:(one==two?0:1);
}
public static void main(String[] args) {

System.out.println(compare(new Integer(42),new Integer(42)));
/**
* 调用这个方法:发现结果 为1
* 那就是说one > two
* 怎么可能?
* 其实我们都明白 两个integer比较 是一个错误 解决方法就是转换为int类型
* 结论一:在对装箱类型运行==操作几乎总是错误的
*
*/
/**
* 再看一个  这里故意将i的声明放在了main方法外部;
* 你认为运行结果是什么?输出wrong?
* 也许你看出来了 他会报空指针异常
*
*/
if(i==8)
{
System.out.println("worng");
}
/**
* 其实这个谁都能看出来
* 结论2:当在一个操作中混用基本类型和装箱基本类型时。装箱基本类型就会自动拆箱;
* 解决方法就是用int来比较
*/
/**
* 总之:当可以选择的时候,基本类型要优先于装箱类型,基本类型更加简单和快速;如果必须使用装箱的基本类型,要小心;自动装箱
* 减少了使用装箱的繁琐 但也带来了风险;当程序使用==操作符比较两个装箱基本类型的时候,几乎肯定不是你要的结果;
* 当涉及到混合类型计算时,他会执行拆箱。当拆箱时 会有空指针异常;最后 当程序装箱了基本类型时,会导致高开销和不必要的对象
* 创建;
*/
}

}
分享到:
评论
20 楼 icewubin 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)模式优化。
19 楼 whaosoft 2009-11-17  
记得 c#里有拆箱和装箱
18 楼 zhengyutong 2009-11-17  
armstrong311 写道
我也正在看这本书,写的有些抽象,有的地方需要多理解几次~总之感觉中文版翻译的还不错

嘻嘻,本人手里也有这本书,挺不错的,2 edition,译者翻译的很用心。
17 楼 zhengyutong 2009-11-17  
zhxing 写道
xuloveqi 写道
就像 Stirng s1 = "1111"; String s2="111"; System.out.println(s1 == s2); 问题本身需要明白Java虚拟机是怎样做的。Java有些复杂了。


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

zhxing说的很对,一个是虚拟机优化,一个是内部代码优化。不要搞混啊。
16 楼 icewubin 2009-11-17  
JackAndroid 写道
new Integer()是与new String()一样,看清我的回答,我说的是i=127,指的是自动装箱。

恩,你是说的没错,不过最好告诉新手,自动装箱(编译优化)调用的是哪个方法,否则你叫新人看源代码,别人怎么看?
15 楼 armstrong311 2009-11-17  
我也正在看这本书,写的有些抽象,有的地方需要多理解几次~总之感觉中文版翻译的还不错
14 楼 langhua9527 2009-11-17  
不用要new Integer(xxx);
这样用
Integer.valueOf(100);
Boolean.valueOf(true);
13 楼 JackAndroid 2009-11-17  
new Integer()是与new String()一样,看清我的回答,我说的是i=127,指的是自动装箱。
12 楼 icewubin 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)的话,仍然不会复用的。
11 楼 JackAndroid 2009-11-16  
  String中的所有“111”常量是为了节省内存,统一存放在常量区。s1和s2则都是指向该同一个常量地址,所以s1==s2返回true;
  java中-128~127的整型包装类采用了复用机制,也就是说Integer i1=127,i2=127时,这两个实例引用都是指向同一个Integer实例。关于这个你可以看下Integer类的源代码就知道了。
10 楼 zhxing 2009-11-16  
xuloveqi 写道
就像 Stirng s1 = "1111"; String s2="111"; System.out.println(s1 == s2); 问题本身需要明白Java虚拟机是怎样做的。Java有些复杂了。


String 是虚拟机内部的实现做了优化,而已Integer 是代码内部做的优化,不一样吧。
9 楼 leequer 2009-11-16  
我读 Effective java 2    too
8 楼 treblesoftware 2009-11-16  
Effective java 1还是 2?

我在读 Effective java 2
7 楼 leequer 2009-11-16  
String是类 比较大小要用equals方法
6 楼 xuloveqi 2009-11-16  
archerfrank 写道
xuloveqi 写道
就像 Stirng s1 = "1111"; String s2="111"; System.out.println(s1 == s2); 问题本身需要明白Java虚拟机是怎样做的。Java有些复杂了。

这个会返回true?那真要研究java虚拟机是怎么弄的了。


s1 = "111";  这个多敲了。
5 楼 archerfrank 2009-11-16  
xuloveqi 写道
就像 Stirng s1 = "1111"; String s2="111"; System.out.println(s1 == s2); 问题本身需要明白Java虚拟机是怎样做的。Java有些复杂了。

这个会返回true?那真要研究java虚拟机是怎么弄的了。
4 楼 xuloveqi 2009-11-16  
就像 Stirng s1 = "1111"; String s2="111"; System.out.println(s1 == s2); 问题本身需要明白Java虚拟机是怎样做的。Java有些复杂了。
3 楼 leequer 2009-11-16  
得看看 学习了
2 楼 zhxing 2009-11-16  
shadow1582 写道
Integer i1=127;
Integer i2=127; 
    System.out.println(i1==i2);//输出true
Integer i3=128;
Integer i4=128; 
    System.out.println(i3==i4);//输出false
    System.out.println(compare(i1,i2));//0
    System.out.println(compare(i3,i4));//1
    System.out.println(compare(new Integer(127),new Integer(127)));//1
    System.out.println(compare(new Integer(128),new Integer(128)));//1

为什么会出现 compare(i1,i2) 和compare(i3,i4) 不一样的情况?

http://hi.baidu.com/fandywang_jlu/blog/item/c5590b4eae053cc3d1c86a13.html
看下这帖子就知道了
1 楼 shadow1582 2009-11-15  
Integer i1=127;
Integer i2=127; 
    System.out.println(i1==i2);//输出true
Integer i3=128;
Integer i4=128; 
    System.out.println(i3==i4);//输出false
    System.out.println(compare(i1,i2));//0
    System.out.println(compare(i3,i4));//1
    System.out.println(compare(new Integer(127),new Integer(127)));//1
    System.out.println(compare(new Integer(128),new Integer(128)));//1

为什么会出现 compare(i1,i2) 和compare(i3,i4) 不一样的情况?

相关推荐

Global site tag (gtag.js) - Google Analytics