zoukankan      html  css  js  c++  java
  • java 自动装箱自动拆箱

     1.Java数据类型

           在介绍Java的自动装箱和拆箱之前,我们先来了解一下Java的基本数据类型。

           在Java中,数据类型可以分为两大种,Primitive Type(基本类型)和Reference Type(引用类型)。基本类型的数值不是对象,不能调用对象的toString()、hashCode()、getClass()、equals()等方法。所以Java提供了针对每种基本类型的包装类型。如下:

    Java基本数据类型
    INDEX 基本类型  大小 数值范围 默认值 包装类型
    1 boolean    --- true,false false Boolean
    2 byte 8bit -2^7 -- 2^7-1 0 Byte
    3 char 16bit
    u0000 - uffff
    u0000 Character
    4 short 16bit -2^15 -- 2^15-1 0 Short
    5 int  32bit -2^31 -- 2^31-1 0 Integer
    6 long 64bit -2^63 -- 2^63-1 0 Long
    7 float  32bit IEEE 754 0.0f Float
    8 double  64bit IEEE 754 0.0d Double
    9 void     ---     --- --- Void

    2.Java自动装箱和拆箱定义

       Java 1.5中引入了自动装箱和拆箱机制:

           (1)自动装箱:把基本类型用它们对应的引用类型包装起来,使它们具有对象的特质,可以调用toString()、hashCode()、getClass()、equals()等方法。

            如下:

    Integer a=3;//这是自动装箱

            其实编译器调用的是static Integer valueOf(int i)这个方法,valueOf(int i)返回一个表示指定int值的Integer对象,那么就变成这样: 

    Integer a=3;   =>    Integer a=Integer.valueOf(3);

            (2)自动拆箱:跟自动装箱的方向相反,将Integer及Double这样的引用类型的对象重新简化为基本类型的数据。

             如下:

     int i = new Integer(2);//这是拆箱

             编译器内部会调用int intValue()返回该Integer对象的int值

             注意:自动装箱和拆箱是由编译器来完成的,编译器会在编译期根据语法决定是否进行装箱和拆箱动作。

     3.基本数据类型与对象的差别 

    • 基本数据类型不是对象,也就是使用int、double、boolean等定义的变量、常量。
    • 基本数据类型没有可调用的方法
     eg:  int t = 1;     t.  后面是没有方法。
    
     Integer t =1; t.  后面就有很多方法可让你调用了。

    4.什么时候自动装箱

    Integer i = 10; //装箱 
    int t = i; //拆箱,实际上执行了 int t = i.intValue();

       在进行运算时,也可以进行拆箱。 

    Integer i = 10; 
    System.out.println(i++);

    5.什么时候自动装箱

    //在-128~127 之外的数
     Integer i1 =200;  
     Integer i2 =200;          
     System.out.println("i1==i2: "+(i1==i2));                   
     // 在-128~127 之内的数
     Integer i3 =100;  
     Integer i4 =100;  
     System.out.println("i3==i4: "+(i3==i4));
    输出的结果
     i1==i2: false
     i3==i4: true

    说明

      equals() 比较的是两个对象的值(内容)是否相同。

      "==" 比较的是两个对象的引用(内存地址)是否相同,也用来比较两个基本数据类型的变量值是否相等。

      前面说过,int 的自动装箱,是系统执行了 Integer.valueOf(int i),先看看Integer.java的源码:

    public static Integer valueOf(int i) {
        if(i >= -128 && i <= IntegerCache.high)  // 没有设置的话,IngegerCache.high 默认是127
            return IntegerCache.cache[i + 128];
        else
            return new Integer(i);
    }

      对于–128到127(默认是127)之间的值,Integer.valueOf(int i) 返回的是缓存的Integer对象(并不是新建对象)

      所以范例中,i3 与 i4实际上是指向同一个对象。

      而其他值,执行Integer.valueOf(int i) 返回的是一个新建的 Integer对象,所以范例中,i1与i2 指向的是不同的对象。

      当然,当不使用自动装箱功能的时候,情况与普通类对象一样,请看下例:

    Integer i3 =new Integer(100); 
    Integer i4 =new Integer(100); 
    System.out.println("i3==i4: "+(i3==i4));//显示false

      致谢:感谢您的耐心阅读!

  • 相关阅读:
    FJNU 1151 Fat Brother And Geometry(胖哥与几何)
    FJNU 1157 Fat Brother’s ruozhi magic(胖哥的弱智术)
    FJNU 1159 Fat Brother’s new way(胖哥的新姿势)
    HDU 3549 Flow Problem(最大流)
    HDU 1005 Number Sequence(数列)
    Tickets(基础DP)
    免费馅饼(基础DP)
    Super Jumping! Jumping! Jumping!(基础DP)
    Ignatius and the Princess IV(基础DP)
    Keywords Search(AC自动机)
  • 原文地址:https://www.cnblogs.com/0201zcr/p/4769782.html
Copyright © 2011-2022 走看看