论坛首页 Java企业应用论坛

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

浏览 9587 次
精华帖 (0) :: 良好帖 (0) :: 新手帖 (2) :: 隐藏帖 (0)
作者 正文
   发表时间:2009-11-15  
OO
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来比较
*/
/**
* 总之:当可以选择的时候,基本类型要优先于装箱类型,基本类型更加简单和快速;如果必须使用装箱的基本类型,要小心;自动装箱
* 减少了使用装箱的繁琐 但也带来了风险;当程序使用==操作符比较两个装箱基本类型的时候,几乎肯定不是你要的结果;
* 当涉及到混合类型计算时,他会执行拆箱。当拆箱时 会有空指针异常;最后 当程序装箱了基本类型时,会导致高开销和不必要的对象
* 创建;
*/
}

}
   发表时间: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) 不一样的情况?
0 请登录后投票
   发表时间: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
看下这帖子就知道了
0 请登录后投票
   发表时间:2009-11-16  
就像 Stirng s1 = "1111"; String s2="111"; System.out.println(s1 == s2); 问题本身需要明白Java虚拟机是怎样做的。Java有些复杂了。
0 请登录后投票
   发表时间:2009-11-16   最后修改:2009-11-16
xuloveqi 写道
就像 Stirng s1 = "1111"; String s2="111"; System.out.println(s1 == s2); 问题本身需要明白Java虚拟机是怎样做的。Java有些复杂了。

这个会返回true?那真要研究java虚拟机是怎么弄的了。
0 请登录后投票
   发表时间:2009-11-16  
archerfrank 写道
xuloveqi 写道
就像 Stirng s1 = "1111"; String s2="111"; System.out.println(s1 == s2); 问题本身需要明白Java虚拟机是怎样做的。Java有些复杂了。

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


s1 = "111";  这个多敲了。
0 请登录后投票
   发表时间:2009-11-16  
String是类 比较大小要用equals方法
0 请登录后投票
   发表时间:2009-11-16  
Effective java 1还是 2?

我在读 Effective java 2
0 请登录后投票
   发表时间:2009-11-16  
我读 Effective java 2    too
0 请登录后投票
   发表时间:2009-11-16  
xuloveqi 写道
就像 Stirng s1 = "1111"; String s2="111"; System.out.println(s1 == s2); 问题本身需要明白Java虚拟机是怎样做的。Java有些复杂了。


String 是虚拟机内部的实现做了优化,而已Integer 是代码内部做的优化,不一样吧。
0 请登录后投票
论坛首页 Java企业应用版

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