`

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) 不一样的情况?

相关推荐

    Effective Java读书笔记.pdf

    "Effective Java读书笔记" Effective Java是一本关于Java编程语言的经典书籍,本笔记主要总结了Java语言的发展历程、静态工厂方法的应用、构造器模式的使用等重要知识点。 一、Java语言的发展历程 Java语言的发展...

    jonykchen#effective-java-3rd-chinese#82. 文档应包含线程安全属性1

    如果这些假设是错误的,生成的程序可能缺少足够的同步(详见 78 条)或过度的同步(详见 79 条)。无条件线程安全 — 该类的实例是可变的,但是该类具有足够的内

    Effective Objective-C 2.0 学习笔记目录

    Effective Objective-C是本学习Objective-C的好书,没有见pdf版,亚马逊上的这儿本书的价格不菲。让我们来看看书里的内容和完整的学习笔记吧。

    Effective-Java-2nd-Edition-(May-2008).zip_effective java

    以上只是《Effective Java》一书的部分主题,全书涵盖了大量Java编程的最佳实践和深度解析,是每个Java开发者案头必备的参考书。通过理解和应用这些知识点,开发者能够提升代码质量,降低维护成本,同时也能更好地...

    effective-java-3rd-chinese

    effective-java-3rd-chinese前51条:文章翻译来源地址:about this repository本来以为只是个直接搬运的活,实际上不是。主要工作如下:改进排版,原有博文排版不太优秀,根据markdown 排版指北重新排版。内容修改,...

    effective-java.pdf

    标题《effective-java.pdf》表明本文档是关于Java编程语言的实践指南,而描述说明了这是一份根据...文档《effective-java.pdf》详细地探讨了静态工厂方法在设计和实现上的优势,强调了其在现代Java编程实践中的重要性。

    java翻牌源码-effective-java-3rd-chinese:有效的java-3rd-chinese

    effective-java-3rd-chinese 前51条:文章翻译来源地址: 现在全部章节已经更新完成 :提供更好的在线阅读版本 : 提供更快的访问速度 写在最前面 本 repo 从来没有授权过任何公众号进行发布转载,所有公众号的引流...

    effective java 读书笔记

    《Effective Java》是Java开发领域的经典著作,作者Joshua Bloch深入浅出地阐述了编写高效、健壮的Java代码的技巧和最佳实践。以下是对该书部分内容的详细解释: 1. **产生和销毁对象** - Item1:静态工厂方法相比...

    Effective-Java读书笔记

    《Effective Java》是Java...以上仅是《Effective Java》一书中部分核心知识点的概述,实际的读书笔记中会更详细地解释这些概念,并给出具体的示例代码。通过深入学习和实践,开发者可以极大地提升其Java编程的水平。

    effective-java 配套代码

    配套代码`effective-java-examples-master`是书中示例代码的集合,用于直观地展示书中的各种编程技巧和原则。 在`effective-java-examples-master`中,你可以找到以下知识点: 1. **枚举(Enums)**: 书中强调了...

    Effective Objective-C 2.0&Obj;-C高级编程

    "Effective Objective-C 2.0&Obj-C高级编程"这个压缩包文件包含了关于这个语言的深入学习资料,旨在帮助开发者提升他们的编程技能和理解。下面我们将详细探讨其中涉及的一些关键知识点。 1. **内存管理**: - ...

    Effective Objective-C(原版)

    2. **协议(Protocols)**:Objective-C的协议机制类似于Java和C#的接口,允许定义一组方法签名而不必强制实现。书中会探讨如何利用协议进行多继承模拟,以及在设计模式中使用协议的重要性。 3. **类别(Categories...

    Effective Objective-C 2.0.pdf

    《Effective Objective-C 2.0》是一本由Mattt Thompson编著的面向Objective-C程序员的指南书籍,旨在帮助开发者写出更高效、更可靠、更具可维护性的代码。这本书深入探讨了Objective-C编程语言的最佳实践和设计模式...

    Effective Objective-C 2.0

    《effective objective-c 2.0:编写高质量ios与os x代码的52个有效方法》是世界级c++开发大师scott meyers亲自担当顾问编辑的“effective software development series”系列丛书中的新作,amazon全五星评价。...

    Effective Objective-C 2.0 epub版

    Effective Objective-C 2.0 epub版, 排班较好, 非常适合在kindle上阅读. 教我们如何编写高质量的iOS代码.

    Effective-Robotics-Programming-with-ROS——中文学习笔记

    以上就是从《Effective Robotics Programming with ROS》的学习笔记中提取的关键知识点和操作步骤,涵盖了ROS环境的配置以及TurtleBot的基础操作。这些基础知识对于初学者来说非常重要,能够帮助他们快速上手并深入...

    java逻辑思维笔试题-effective-java-3rd-edition:有效的Java第3版注释

    java逻辑思维笔试题Effective Java - 第三版笔记 章节索引 02 - 创建和销毁对象 03 - 所有对象通用的方法 04 - 类和接口 05 - 泛型 06 - 枚举和注释 07 - Lambda 和流 08 - 方法 09 - 通用编程 10 - 例外 11 - 并发 ...

    Effective Java第三版1

    《Effective Java》是Java编程领域的一本经典著作,由Joshua Bloch撰写,它提供了许多最佳实践和设计原则,帮助开发者写出更高效、更可维护的代码。第三版延续了这一传统,对Java语言的新特性进行了更新,并给出了...

Global site tag (gtag.js) - Google Analytics