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

    • 什么是自动装箱拆箱

    基本数据类型的自动装箱(autoboxing)、拆箱(unboxing)是自J2SE 5.0开始提供的功能。 

    一般我们要创建一个类的对象实例的时候,我们会这样:

     Class a = new Class(parameter);

     当我们创建一个Integer对象时,却可以这样:

     Integer i = 100; (注意:不是 int i = 100; )

    实际上,执行上面那句代码的时候,系统为我们执行了:Integer i = Integer.valueOf(100); (感谢@黑面馒头 和 @MayDayIT 的提醒)

    此即基本数据类型的自动装箱功能。

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

    基本数据类型不是对象,也就是使用int、double、boolean等定义的变量、常量。

    基本数据类型没有可调用的方法。

    eg:  int t = 1;     t.  后面是没有方法滴。

     Integer t =1; t.  后面就有很多方法可让你调用了。

     
    • 什么时候自动装箱

    例如:Integer i = 100;

    相当于编译器自动为您作以下的语法编译:Integer i = Integer.valueOf(100);

     
    • 什么时候自动拆箱

      自动拆箱(unboxing),也就是将对象中的基本数据从对象中自动取出。如下可实现自动拆箱:

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

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

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

     

    • Integer的自动装箱

    复制代码
    //在-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的源码:

    1
    2
    3
    4
    5
    6
    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 指向的是不同的对象。

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

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

    (感谢易之名的提醒O(∩_∩)O~)

    • String 的拆箱装箱

    先看个例子:

    复制代码
    1 String str1 ="abc";
    2 String str2 ="abc";
    3 System.out.println(str2==str1); //输出为 true 
    4 System.out.println(str2.equals(str1)); //输出为 true 
    5   
    6 String str3 =new String("abc");
    7 String str4 =new String("abc"); 
    8 System.out.println(str3==str4); //输出为 false 
    9 System.out.println(str3.equals(str4)); //输出为 true
    复制代码

        这个怎么解释呢?貌似看不出什么。那再看个例子。

    1 String d ="2"; 
    2 String e ="23";
    3 e = e.substring(0, 1);
    4 System.out.println(e.equals(d)); //输出为 true 
    5 System.out.println(e==d); //输出为 false
    第二个例子中,e的初始值与d并不同,因此e与d是各自创建了个对象,(e==d)为false 。
    同理可知,第一个例子中的str3与str4也是各自new了个对象,而str1与str2却是引用了同一个对象。
     
     
     参考:
    http://docs.oracle.com/javase/tutorial/java/data/autoboxing.html 
    http://javarevisited.blogspot.com/2012/07/auto-boxing-and-unboxing-in-java-be.html 
  • 相关阅读:
    OleDbCommand 的用法
    递归求阶乘
    C#重写窗体的方法
    HDU 5229 ZCC loves strings 博弈
    HDU 5228 ZCC loves straight flush 暴力
    POJ 1330 Nearest Common Ancestors LCA
    HDU 5234 Happy birthday 01背包
    HDU 5233 Gunner II 离散化
    fast-IO
    HDU 5265 pog loves szh II 二分
  • 原文地址:https://www.cnblogs.com/huajiezh/p/6404560.html
Copyright © 2011-2022 走看看