你的位置:首页 > Java教程

[Java教程]java 自动装箱自动拆箱


 1.Java数据类型

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

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

 

 

Java基本数据类型
INDEX基本类型 大小数值范围默认值包装类型
1boolean   ---true,falsefalseBoolean
2byte8bit-2^7 -- 2^7-10Byte
3char16bit
\u0000 - \uffff
\u0000Character
4short16bit-2^15 -- 2^15-10Short
5int 32bit-2^31 -- 2^31-10Integer
6long64bit-2^63 -- 2^63-10Long
7float 32bitIEEE 7540.0fFloat
8double 64bitIEEE 7540.0dDouble
9void    ---    ------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

 

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




到越南游费用报价大全越南自助游攻略2015怎样去越南旅游特价越南游深圳到越南旅游报价雁苍山漂流小孩可以漂吗?宁海雁苍山漂流有年龄限制吗? 雁苍山漂流门票2015-5-7月宁海雁苍山漂流门票价格 山东章丘三王峪怎么样?章丘三王峪旅游景点有哪些? 济南章丘三王峪好玩吗?章丘三王峪图片介绍? 泰国大皇宫对外开放吗?需要门票吗? 泰国金沙岛上有什么美食? 泰国曼谷有地铁吗? 迪拜有哪些旅游景点? 朱家角大千生态园几岁的孩子免费?大千生态园孩子免费吗? 黄山杨家寨五一有什么好玩的?黄山杨家寨佘河溪河漂流怎么样? 2015宁陕汶水河漂流多少钱?汶水河漂流票价? 汶水河峡谷漂流多少钱?秦岭汶水河峡谷漂流要门票吗? 桂林甲天下广场到神龙水世界怎么走?桂林甲天下广场到神龙水世界有多远? 广州塔蜡像馆五一有什么活动?广州塔世界名人蜡像馆五一门票优惠吗? 桂林到神龙水世界在哪坐车?桂林到神龙水世界有直达车吗? 桂林汽车站到神龙水世界有直达车吗?桂林汽车站到神龙水世界坐几路车? 1812AA122JATME Datasheet 1812AA122JATME Datasheet 06035J3R9ABTTR Datasheet 06035J3R9ABTTR Datasheet 1812AA122JATMQ Datasheet 1812AA122JATMQ Datasheet 北京欢乐谷营业时间 北京欢乐谷营业时间 北京欢乐谷营业时间 长沙野生动物园 长沙野生动物园 长沙野生动物园 重庆加勒比海水世界门票 重庆加勒比海水世界门票 重庆加勒比海水世界门票