`
freesea
  • 浏览: 127555 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
社区版块
存档分类
最新评论

jdk5的拆箱与装箱

    博客分类:
  • JDK
阅读更多

    前几次课的讲解,我们了解了这样几个问题。<nobr oncontextmenu="return false;" onmousemove="kwM(0);" id="key0" onmouseover="kwE(event,0, this);" style="COLOR: #6600ff; BORDER-BOTTOM: #6600ff 1px dotted; BACKGROUND-COLOR: transparent; TEXT-DECORATION: underline" onclick="return kwC();" onmouseout="kwL(event, this);" target="_blank">Java</nobr>的两种数据类型,和一些程序控制语句。今天,我们还是要通过一些例子。对上述东西有一个更深的理解。

    我们现在知道了,所有对象型的数据类型的基类是java.lang.Object .而写java程序的时候非常多的工作都是在写这些类,和实现里面的<nobr oncontextmenu="return false;" onmousemove="kwM(3);" id="key3" onmouseover="kwE(event,3, this);" style="COLOR: #6600ff; BORDER-BOTTOM: #6600ff 1px dotted; BACKGROUND-COLOR: transparent; TEXT-DECORATION: underline" onclick="return kwC();" onmouseout="kwL(event, this);" target="_blank">方法</nobr>。而偏偏就有那么8种基本类型和他们不一样。以至于让你来回在这两种之间转换,这是很让人头疼的事情。Java中int,long,char这样的类型不是对象型。因此java里提供了一种叫做包装类(wrapper)的东西,使基本类型,有着相应的对象类型Integer,Long,Character等。这样就可以,先把基本类型的东西,转成对象来用,然后再转回去。来来回回,千锤百炼。

    到了jdk5.0的时候呢,就不用了。看下面的例子:

<nobr oncontextmenu="return false;" onmousemove="kwM(2);" id="key2" onmouseover="kwE(event,2, this);" style="COLOR: #6600ff; BORDER-BOTTOM: #6600ff 1px dotted; BACKGROUND-COLOR: transparent; TEXT-DECORATION: underline" onclick="return kwC();" onmouseout="kwL(event, this);" target="_blank">实践</nobr>:

java 代码
  1. public class Test1 {   
  2.   
  3.     public static void main(String[] args) {   
  4.   
  5.         // 装箱   
  6.   
  7.         int i = 0;   
  8.   
  9.         Integer integer = i;//i这么一个基本类型的数,可以赋值给Integer型的变量   
  10.   
  11.         // 简单的拆箱   
  12.   
  13.         int j = integer; //integer这种原始类型的数,也能赋值给j这个原始类型的变量   
  14.   
  15.     
  16.   
  17.         Integer counter = 1;        // 装箱   
  18.   
  19.         int counter2 = counter;     // 拆箱   
  20.   
  21.     
  22.   
  23.         while (counter < 100) {   
  24.   
  25.           System.out.println("计数 "+counter++);  //看啊,counter这个对象型的数,还能自动增加   
  26.   
  27.         }   
  28.   
  29.     }   
  30.   
  31. }    

 

 在幕后JVM已经自动执行了转换,同理Boolean和boolean之间也可以,自动拆箱装箱。但是,Integer和int毕竟还是有着不同的。

    看下面例子:

java 代码
  1. public class Test2 {   
  2.   
  3.     public static void main(String[] args) {   
  4.   
  5.        Integer i1 = 256;   
  6.   
  7.         Integer i2 = 256;   
  8.   
  9.         if (i1 = = i2)    
  10.   
  11.         System.out.println("相等!");   
  12.   
  13.         else    
  14.   
  15.         System.out.println("不相等!");   
  16.   
  17.     }   
  18.   
  19. }    
 结果输出的是“不相等!”,两个对象比较,它们在内存中开辟的是两个地址怎么能相等呢?

    警告:你可千万不能依赖这个结果,请把i1和i2的值,改成100.(请看Test3.java)看看什么结果,令人惊讶的是改了个数,居然输出了“相等!”。

    这是因为JVM可以选择要尝试这段代码的最佳优化,并对两个Integer对象使用一个实例,这样的话“= =”就会返回true了。在自动装箱时对于值从–128到127之间的值,使用一个实例。

    这种装箱与拆箱机制对,程序流程控制语句,也有很大影响:

java 代码
  1. public class Test4 {   
  2.   
  3.     public static void main(String[] args) {   
  4.   
  5.         Boolean arriving = true;   
  6.   
  7.         Integer peopleInRoom = 0;   
  8.   
  9.         int maxCapacity = 100;   
  10.   
  11.     
  12.   
  13.         while (peopleInRoom < maxCapacity) {   
  14.   
  15.           if (arriving) {   
  16.   
  17.             System.out.printf("很高兴见到你.%d号先生\n",peopleInRoom);   
  18.   
  19.             peopleInRoom++;}    
  20.   
  21.           else {   
  22.   
  23.             peopleInRoom--;   
  24.   
  25.           }   
  26.   
  27.       }}}    

另外一个从unboxing获得好处的语句是switch.在jdk5.0之前的JVM,switch接受int、short、character或者byte值,而在unboxing的操作中,你现在也可以为它赋予新引入的enum之外的Integer,Short,Char以及Byte值。Enum的值,我们在后面的教程会详细讲述。

分享到:
评论

相关推荐

    全新 Java 初学者实践教程 PDF 电子版.rar

    全新 Java 初学者实践教程 PDF 电子版,内容方面当然不涉及高深理论,都是些挺基础的知识点,比如最新版JDK环境变量的配置、基本语法、基本类型变量和引用类型变量、jdk5 的拆箱与装箱、jdk5 的数组、jdk5 的集合类...

    jdk1.5.0_10

    jdk1.5新特性 1.泛型 2.foreach 3.自动拆箱装箱 4.枚举 5.静态导入(Static import) 6.元数据(Metadata) 7.线程池 8.Java Generics

    Java JDK 7学习笔记(国内第一本Java 7,前期版本累计销量5万册)

    4.2.2 自动装箱、拆箱 92 4.2.3 装箱的内幕 93 4.3 数组对象 96 4.3.1 数组基础 96 4.3.2 操作数组对象 99 4.3.3 数组复制 105 4.4 字符串对象 108 4.4.1 字符串基础 108 4.4.2 字符串特性 111 ...

    JDK6_API_CN.zip

    JDK6_API_CN.zip具有自动装箱和自动拆箱的功能,用于开发

    Java JDK实例宝典

    1 自动装箱和拆箱 16. 2 新的for循环 16. 3 枚举类型 16. 4 静态导入 16. 5 可变长参数Varargs 16. 6 格式化输出 16. 7 使用ProcessBuilder执行本地命令 16. 8 泛型编程 16. 9 ...

    leetcodelrucache-algorithm:算法学习和练习

    自动装箱拆箱 jdk.longaccumulator 计数器 jdk.threadlocal DateFormatService: 如何线程安全的使用 SimpleDateFormat jdk.volatilex VolatileArrays: volatile 例子 jdk.collection.union JDK: javaAPI 方式 ...

    Java企业面试问题2.txt

    型叫做装箱,从封装类型到基本数据类型叫拆箱,自动拆装箱是jdk5.0提供的新特特性 2.3当我们要调用的方法中存在重载的时候,即基本类型数据作为唯一参数的方法与 该基本类型包装类作为唯一参数的方法重载,这时候...

    Java入门教程(微学苑)-part1

    1.9 JDK的安装 5 1.10 环境变量的设置 9 1.11 Eclipse的安装 9 1.12 安装简体中文语言包 11 1.13 第一个Java程序示例 14 1.14 通过Eclipse运行程序 14 1.15 通过命令行运行程序 17 1.16 HelloWorld程序分析 18 1.17 ...

    java基础常识与概念

    基础概念与常识 Java 语言有哪些特点? JVM vs JDK vs JRE JVM JDK 和 JRE 什么是字节码?采用字节码的好处是什么? 为什么说 Java 语言“编译与解释并存”?...Oracle JDK vs OpenJDK ...自动装箱与拆箱了解吗?原理是什么?

    Java语法基础-面试专题及答案

    1.面向对象和面向过程的区别以及...13.自动装箱与拆箱 14.在一个静态方法内调用一个非静态成员为什么是非法的 15.在 Java 中定义一个不做事且没有参数的构造方法的作用 16. import java 和 javax 有什么区别 17.....

    java jdk实列宝典 光盘源代码

    自动装箱和拆箱; 新的for循环; 枚举类型; 静态导入; 格式化输出; 使用ProcessBuilder执行本地命令; 泛型编程; 监控和管理虚拟机;新的线程执行架构; 线程锁; 线程条件; 线程同步装置:semaphore countdownlatch ...

    JAVA基础面试题总结1

    JAVA基础面试题总结1 JVM,JDK,JRE,字节码详解,Java 基本数据类型,装箱和拆箱

    Java虚拟机

    第四部分讲解了程序的编译与代码的优化,阐述了泛型、自动装箱拆箱、条件编译等语法糖的原理;讲解了虚拟机的热点探测方法、HotSpot的即时编译器、编译触发条件,以及如何从虚拟机外部观察和分析JIT编译的数据和结果...

    深入理解_Java_虚拟机 JVM_高级特性与最佳实践

    / 259 10.2.2 解析与填充符号表 / 262 10.2.3 注解处理器 / 264 10.2.4 语义分析与字节码生成 / 264 10.3 Java语法糖的味道 / 268 10.3.1 泛型与类型擦除 / 268 10.3.2 自动装箱、拆箱与遍历循环 / 273 10.3.3...

    Java高手真经 编程基础卷.part1.rar

    Java高级特性:反射、泛型、注释符、自动装箱和拆箱、枚举类、可变参数、可变返回类型、增强循环、静态导入。随书附赠光盘内容为《Java高手真经(编程基础卷):Java核心编程技术》各种原型包、系统源程序。

    Java高手真经 编程基础卷.part3.rar

    Java高级特性:反射、泛型、注释符、自动装箱和拆箱、枚举类、可变参数、可变返回类型、增强循环、静态导入。随书附赠光盘内容为《Java高手真经(编程基础卷):Java核心编程技术》各种原型包、系统源程序。

    Java高手真经 编程基础卷.part4.rar

    Java高级特性:反射、泛型、注释符、自动装箱和拆箱、枚举类、可变参数、可变返回类型、增强循环、静态导入。随书附赠光盘内容为《Java高手真经(编程基础卷):Java核心编程技术》各种原型包、系统源程序。

    Java高手真经 编程基础卷.part2.rar

    Java高级特性:反射、泛型、注释符、自动装箱和拆箱、枚举类、可变参数、可变返回类型、增强循环、静态导入。随书附赠光盘内容为《Java高手真经(编程基础卷):Java核心编程技术》各种原型包、系统源程序。

Global site tag (gtag.js) - Google Analytics