精华帖 (0) :: 良好帖 (0) :: 新手帖 (2) :: 隐藏帖 (0)
|
|
---|---|
作者 | 正文 |
发表时间:2009-11-15
/** * 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来比较 */ /** * 总之:当可以选择的时候,基本类型要优先于装箱类型,基本类型更加简单和快速;如果必须使用装箱的基本类型,要小心;自动装箱 * 减少了使用装箱的繁琐 但也带来了风险;当程序使用==操作符比较两个装箱基本类型的时候,几乎肯定不是你要的结果; * 当涉及到混合类型计算时,他会执行拆箱。当拆箱时 会有空指针异常;最后 当程序装箱了基本类型时,会导致高开销和不必要的对象 * 创建; */ } } 声明:ITeye文章版权属于作者,受法律保护。没有作者书面许可不得转载。
推荐链接
|
|
返回顶楼 | |
发表时间: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) 不一样的情况? |
|
返回顶楼 | |
发表时间: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 看下这帖子就知道了 |
|
返回顶楼 | |
发表时间:2009-11-16
就像 Stirng s1 = "1111"; String s2="111"; System.out.println(s1 == s2); 问题本身需要明白Java虚拟机是怎样做的。Java有些复杂了。
|
|
返回顶楼 | |
发表时间:2009-11-16
最后修改:2009-11-16
xuloveqi 写道 就像 Stirng s1 = "1111"; String s2="111"; System.out.println(s1 == s2); 问题本身需要明白Java虚拟机是怎样做的。Java有些复杂了。
这个会返回true?那真要研究java虚拟机是怎么弄的了。 |
|
返回顶楼 | |
发表时间:2009-11-16
archerfrank 写道 xuloveqi 写道 就像 Stirng s1 = "1111"; String s2="111"; System.out.println(s1 == s2); 问题本身需要明白Java虚拟机是怎样做的。Java有些复杂了。
这个会返回true?那真要研究java虚拟机是怎么弄的了。 s1 = "111"; 这个多敲了。 |
|
返回顶楼 | |
发表时间:2009-11-16
String是类 比较大小要用equals方法
|
|
返回顶楼 | |
发表时间:2009-11-16
Effective java 1还是 2?
我在读 Effective java 2 |
|
返回顶楼 | |
发表时间:2009-11-16
我读 Effective java 2 too
|
|
返回顶楼 | |
发表时间:2009-11-16
xuloveqi 写道 就像 Stirng s1 = "1111"; String s2="111"; System.out.println(s1 == s2); 问题本身需要明白Java虚拟机是怎样做的。Java有些复杂了。
String 是虚拟机内部的实现做了优化,而已Integer 是代码内部做的优化,不一样吧。 |
|
返回顶楼 | |