浅析自动装箱、自动拆箱

浅析自动装箱、自动拆箱

  1. 我们知道,在java中有基本类型和类类型,基本类型有:char、byte、short、int、double、float、long、boolean这8种,在需要将基本类型打包成对象来进行操作的时候,这时,就用到了打包这一操作,该操作的自动行为就叫做自动装箱、自动拆箱。

package demo;

public class IntegerDemo {

    public static void main(String[] args) {

        int data1=10;
        int data2=20;//基本数据类型

        Integer warpper1 = new Integer(data1); //将基本类型打包成对象类型
        Integer warpper2 = new Integer(data2);  

        System.out.println(data1/3);
        System.out.println(warpper1.doubleValue()/3); //Integer对象进行转换成double类型
        System.out.println(warpper1.compareTo(warpper2));//比较warpper1和warpper2的大小,-1后者大
    }
}
  • 这些打包类的目的就是提供对象实例作为“壳”,将基本类型打包在对象之中,这样就可以操作对象了,将基本类型当作对象使用。

  1. 自动装箱、自动拆箱
    在J2SE5.0之后提供了自动装箱、自动拆箱的功能。
    上面的代码可以写成这样:

package demo;

public class AutoIntegerDemo {

    public static void main(String[] args) {

        Integer warpper1 = 10;
        Integer warpper2 = 20;
        System.out.println(warpper1 / 3);
        //自动拆箱,对象转成了基本类型进行运算                                 System.out.println(warpper1.compareTo(warpper2));
    }
}
结果:
3
-1

  • warpper1、warppper2运行时会参考Integer实例,自动装箱和自动拆箱的功能实现,实际上是编译程序蜜糖,让你在编写程序的时候尝点甜头,程序视情况决定是否进行拆箱、装箱。
  • 以上例来说,在warpper1在参考Integer实例时。实际使用的是Integer.valueOf()方法。
package demo;

public class AutoIntegerDemo {

    public static void main(String[] args) {

        Integer w1 = 100;
        Integer w2 = 100;

        if (w1 == w2) {
            System.out.println("第一次比较 w1 =w2");
        } else {
            System.out.println("第一次比较 w1 != w2");
        }

        w1 = 200;
        w2 = 200;
        if (w1 == w2) {
            System.out.println("第二次比较 w1 =w2");
        } else {
            System.out.println("第二次比较 w1 != w2");
        }
    }
}
结果:
第一次比较 w1 =w2
第二次比较 w1 != w2
  • 看看为什么都是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);
    }
  • 如果传入的int i 在IntegerCache.low与IntegerCache.high之间,看看前面缓存中没有打包相同的值,如果有,直接返回;否则创建一个新的实例。
  • 但是IntegerCache.low的默认值-128,IntegerCache.high的默认值是127,所以我们回去看看代码,当w1、w2=100的时候,因为有了w1的缓存,w2在参考Integer实例的时候,直接引用缓存,所以w1=w2相同。
  • w1、w2=200时,在valueOf的判定条件为false,两个参数参考的两个不同的Integer实例,所以==比较的时候是false。
  • 最后一点,在比较两个对象是否相等,别用== 或者!=进行比较,请使用equals()方法。谢谢

    业精于勤,荒于嬉;行成于思,毁于随

时间: 2024-10-26 00:14:30

浅析自动装箱、自动拆箱的相关文章

Java JDK之自动装箱和拆箱

基本数据(Primitive)类型的自动装箱(autoboxing).拆箱(unboxing)是自J2SE 5.0开始提供的功能.虽然为您打包基本数据类型提供了方便,但提供方便的同时表示隐藏了细节,建议在能够区分基本数据类型与对象的差别时再使用. autoboxing和unboxing 在Java中,所有要处理的东西几乎都是对象 (Object),例如之前所使用的Scanner是对象,字符串(String)也是对象,之后还会看到更多的对象.然而基本(Primitive)数据类型不是对象,也就是您

Java自动装箱与拆箱

  自动装箱与拆箱机制在实际使用中非常常见,不过也特别容易出错,博主在面对下面一道题的时候自信满满,可还是没有能够全对,所以写下这篇博文,给自己对自动装箱与拆箱机制做一下知识巩固,也给各位朋友做一下参考.   首先有这样一道题,给出下面代码的输出结果: public class AutoBoxing { public static void main(String[] args) { Integer a = 1; Integer b = 2; Integer c = 3; Integer d =

自动装箱与拆箱引发的享元设计模式

/** * 自动装箱与拆箱 */ public class Autoboxing { public static void main(String[] args) { Integer num1 = 20; //自动装箱 int num2 = new Integer(20); //自动拆箱 System.out.println(num2 == num1); //true //-128~127之间的同一个Intege对象相比为true Integer num3 = 128; Integer num4

java基础:合法转换与自动装箱、拆箱

问题描述 java基础:合法转换与自动装箱.拆箱 Short y = 100; int z = y; 这两句代码编译正确,但为什么呢?是y先拆箱成short,然后合法转换成int吗? short y1 = 100; Integer z1 = y1; 而这两句代码编译报错,如果按照上面的逻辑,可以y1先合法转换int,然后自动装箱成Integer呀? 解决方案 涉及到隐式转换. 对非引用类型赋值的时候,对基本数据类型会进行自动拆箱,然后可以隐式转换为大类型: 如第一种. 而引用类型则是先装箱再赋值

JDK5.0新特性系列---1.自动装箱和拆箱

/**  * 基本类型的数据值可以直接赋给基本数据对象,基本数据的对象也可以直接赋给基本数据变量  * 在表达式中,基本类型的数据值可以和基本数据对象进行运算  * 基本数据类型的数组不能实现自动装箱和拆箱,即int[]不能当成Integer[]使用  */ /**  * 演示基本数据类型的自动拆箱和装箱  */ public class AutoBox {        /**整数类型的自动拆箱和装箱*/        public static void intAutoBox(){     

Java装箱和拆箱详解

自动装箱和拆箱问题是Java中一个老生常谈的问题了,今天我们就来一些看一下装箱和拆箱中的若干问题.本文先讲述装箱和拆箱最基本的东西,再来看一下面试笔试中经常遇到的与装箱.拆箱相关的问题. 以下是本文的目录大纲: 一.什么是装箱?什么是拆箱? 二.装箱和拆箱是如何实现的 三.面试中相关的问题 若有不正之处,请谅解和批评指正,不胜感激. 请尊重作者劳动成果,转载请标明原文链接: http://www.cnblogs.com/dolphin0520/p/3780005.html 一.什么是装箱?什么是

深入剖析Java中的装箱和拆箱

自动装箱和拆箱问题是Java中一个老生常谈的问题了,今天我们就来一些看一下装箱和拆箱中的若干问题.本文先讲述装箱和拆箱最基本的东西,再来看一下面试笔试中经常遇到的与装箱.拆箱相关的问题. 一.什么是装箱?什么是拆箱? 在前面的文章中提到,Java为每种基本数据类型都提供了对应的包装器类型,至于为什么会为每种基本数据类型提供包装器类型在此不进行阐述,有兴趣的朋友可以查阅相关资料.在Java SE5之前,如果要生成一个数值为10的Integer对象,必须这样进行: Integer i = new I

深入剖析Java中的装箱和拆箱(转)

自动装箱和拆箱问题是Java中一个老生常谈的问题了,今天我们就来一些看一下装箱和拆箱中的若干问题.本文先讲述装箱和拆箱最基本的东西,再来看一下面试笔试中经常遇到的与装箱.拆箱相关的问题. 以下是本文的目录大纲: 一.什么是装箱?什么是拆箱? 二.装箱和拆箱是如何实现的 三.面试中相关的问题 一.什么是装箱?什么是拆箱? 在前面的文章中提到,Java为每种基本数据类型都提供了对应的包装器类型,至于为什么会为每种基本数据类型提供包装器类型在此不进行阐述,有兴趣的朋友可以查阅相关资料.在Java SE

Java中的装箱与拆箱

在J2SE5.0后推出了自动装箱和拆箱的功能,以提高我们的开发效率,然而自动装箱和拆箱实际上是通过编译器来支持的(并非语言本身,或者说虚拟机),因而这种支持也隐藏了部分内部实质,再加上某些类的优化(比如Integer里面的缓存等,参看关于缓存节),就更加容易在特定的环境下产生问题,并且如果不知道原来还无法调试.以下先是简单的介绍了编译器对装箱和拆箱的实现,并根据实现简单介绍一下可能会遇到的几个问题. 装箱和拆箱实现 以下装箱和拆箱代码:        Object value = 10;    

Java中的装箱和拆箱深入理解_java

自动装箱和拆箱问题是Java中一个老生常谈的问题了,今天我们就来一些看一下装箱和拆箱中的若干问题.本文先讲述装箱和拆箱最基本的东西,再来看一下面试笔试中经常遇到的与装箱.拆箱相关的问题. 一.什么是装箱?什么是拆箱? 在前面的文章中提到,Java为每种基本数据类型都提供了对应的包装器类型,至于为什么会为每种基本数据类型提供包装器类型在此不进行阐述,有兴趣的朋友可以查阅相关资料.在Java SE5之前,如果要生成一个数值为10的Integer对象,必须这样进行: 复制代码 代码如下: Intege