`
原来我就是麦兜
  • 浏览: 9734 次
  • 性别: Icon_minigender_1
  • 来自: 北京
文章分类
社区版块
存档分类
最新评论

[Java5新特性]自动装箱/拆箱

 
阅读更多

自动装箱/拆箱概述

Java中具有基本类型(int,double,float,long,boolean,char,byte,short)和基本类型包装类(Integer,Double,Float,Long,Boolean,Char,Byte,Short),我们实现基本类型与包装类之间的转换基本有两种方式:

  • 一种为JDK5之前的方式,比如Integer i = Integer.valueof(5);(这里5为基本类型int,Integer包装类利用valueof()方法将其转换为Integer类型)或者int i = i.intValue();(这里基本类型利用intValue()方法将Integer类型转换为基本类型int)。
  • 一种为JDK5之后的方式,比如①Integer i = 5;或者②int i = new Integer(100);,这里基本类型与包装类之间可直接操作,而①的操作就是自动装箱,②的操作就是自动拆箱。

自动装箱/拆箱原理

如果我们现在使用第二种方式进行直接赋值操作,代码如下:

public class Demo {
    @Test
    public void demo() {
        Integer integer = 5;

        int i = new Integer(100);
    }
}

编写完成的Java文件,在运行之前会被编译成Class文件。现在我们将编译后的Class文件,进行反编译操作,得到如下代码内容:

public class Demo {
    @Test
    public void demo() {
        Integer integer = Integer.valueOf(5);

        int i = new Integer(100).intValue();
    }
}

通过查看反编译的代码内容,我们得知在Java文件编译后的内容与第一种方式的操作保持一致。这就说明实际上Java中基本类型与包装类之间的转换,在JDK5之后不再由我们手动操作,而是由Java编译器帮助我们来完成,与Java的虚拟机是没有任何关系的。

底层原理分析

到目前为止,我们已经基本掌握了Java5的自动装箱与拆箱的内容。在实际开发中,目前基本使用的都是Java5之后的版本,所以自动装箱与拆箱内容就不是那么重要了。
下面我们来看一个例子:

public class Demo {
    @Test
    public void demo2() {
        Integer i1 = 100;
        Integer i2 = 100;
        boolean b1 = i1 == i2;
        System.out.println(b1);     //output    true

        Integer i3 = 200;
        Integer i4 = 200;
        boolean b2 = i3 == i4;
        System.out.println(b2);     //output    false
    }
}

在上面的例子中,变量Integer类型的i1,i2,i3和i4都是自动装箱,但是最终比较的结果却一个为true一个为false。这让我们比较困惑,原因是什么呢?下面我们来还原一下自动装箱,上面的代码可以改写成如下方式:

public class Demo {
    @Test
    public void demo3() {
        Integer i1 = Integer.valueOf(100);
        Integer i2 = Integer.valueOf(100);
        boolean b1 = i1 == i2;
        System.out.println(b1);     //output    true
        Integer i3 = Integer.valueOf(200);
        Integer i4 = Integer.valueOf(200);
        boolean b2 = i3 == i4;
        System.out.println(b2);     //output    false
    }
}

通过改写之后的代码,我们发现原来是Integer类型的valueOf()方法接收100和200返回的内容是不一样的。那我们就需要看查看一下Integer类型的valueOf()方法的源代码,它到底是怎么样的。

public static Integer valueOf(int i) {
    if (i >= IntegerCache.low && i <= IntegerCache.high)
        return IntegerCache.cache[i + (-IntegerCache.low)];
    return new Integer(i);
}

通过查看源代码我们发现,在Integer类的内部缓存了-128至127之间的256个Integer对象,如果valueOf()方法将这个范围的int类型整数转换成Integer对象时,会直接返回缓存中的内容,否则返回重新创建的Integer对象。
所以,在上面的例子中,整数100在Integer类的缓存之中,所以直接返回缓存内容。而整数200不在Integer类的缓存之中,所以需要重新创建Integer对象返回。而两个Integer类型的对象做比较,是判断对象地址是否相同,所以一个结果为true一个结果为false。


转载说明:请注明本文作者及原文连接,谢谢!

<script type="text/javascript"> $(function () { $('pre.prettyprint code').each(function () { var lines = $(this).text().split('\n').length; var $numbering = $('<ul/>').addClass('pre-numbering').hide(); $(this).addClass('has-numbering').parent().append($numbering); for (i = 1; i <= lines; i++) { $numbering.append($('<li/>').text(i)); }; $numbering.fadeIn(1700); }); }); </script>
分享到:
评论

相关推荐

    kentanvictor#STUDY#java1.5新特性之自动装箱与自动拆箱1

    //这里就是自动的装箱,将3转换成Integer类型并放到集合中自动拆箱包装类自动转为基本类型 Integer &gt;&gt; int面试常见题目:自动拆箱与自动装箱的问

    计算机后端-Java-Java核心基础-第14章 面向对象06 24. 新特性:自动装箱与自动拆箱.avi

    计算机后端-Java-Java核心基础-第14章 面向对象06 24. 新特性:自动装箱与自动拆箱.avi

    java新特性简介.ppt

    自动装箱、拆箱 更优化的循环 可变长参数 枚举 静态引入 范型 Annotation(注解、注释)

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

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

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

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

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

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

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

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

    Java核心编程技术源码

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

    深入理解_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面试+Java学习指南】 一份涵盖大部分Java程序员所需要掌握的核心知识

    Java自动拆箱装箱里隐藏的秘密 Java中的Class类和Object类 Java异常 解读Java中的回调 反射 泛型 枚举类 Java注解和最佳实践 JavaIO流 多线程 深入理解内部类 javac和javap Java8新特性终极指南 序列化和反序列化 ...

    仿知乎java源码-Java2Cpp-Translator:Java到C++转换器

    循环、可变参数、装箱/拆箱、抽象类、同步方法和语句、strictfp、瞬态、 volatile、lambdas 等。 目标语言是 C++ 的受限版本,没有虚方法、继承、模板、lambda 抽象、auto、decltype 等。 翻译器主要对基本翻译建模...

    Java面试题-基础和集合.docx

    通过面试题的逐一解答,读者可以了解到Java语言的一些核心概念,如面向对象的特性、线程安全、性能优化、泛型、自动装箱与拆箱等。此外,文件还详细解释了类型擦除的概念及其优势,以及深浅克隆的区别和实现方式。...

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

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

    Java工程师面试复习指南

    Java自动拆箱装箱里隐藏的秘密 Java中的Class类和Object类 Java异常 解读Java中的回调 反射 泛型 枚举类 Java注解和最佳实践 JavaIO流 多线程 深入理解内部类 javac和javap Java8新特性终极指南 序列化和反序列化 ...

    Java面试技术面知识扩展包第一弹

    也可能会涉及Java的特性,如自动装箱拆箱、泛型、Lambda表达式等。 2. 面向对象编程(OOP):面试官可能会询问您关于面向对象编程的概念和原则,如封装、继承、多态、抽象类、接口等,并要求您应用这些概念解决问题...

    java jdk实列宝典 光盘源代码

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

    实验项目D、Java应用专题编程

    2、掌握包装类及自动装箱拆箱机制。 3、掌握异常的使用。 4、掌握包的使用。 5、理解内部类、泛型、反射和注解等专题技术。 ★专题:常用类和接口★ 1、初步掌握字符串类的常用方法。 2、初步掌握日期和日期格式类...

    数据结构与算法分析Java语言描述(第二版)

    Java51.4.1 使用Object表示泛型1.4.2 基本类型的包装1.4.3 使用接口类型表示泛型1.4.4 数组类型的兼容性1.5 利用Java5泛性实现泛型特性成分1.5.1 简单的泛型类和接口1.5.2 自动装箱/拆箱1.5.3 带有限制的通配符...

Global site tag (gtag.js) - Google Analytics