Java 自动装箱与拆箱

Java为每种基本数据类型都提供了对应的对象类型。在Java SE5之前,如果要生成一个数值为7的Integer对象,代码示例:Integer i = new Integer(7);;Java SE5之后,Java提供了新的语法,简化了基本数据类型对象的使用,我们称之为自动装箱(autoboxing)与拆箱(unboxing)。之前的代码可以简化为Integer i = 7;。

Java提供的自动装箱盒拆箱,是在编译器层实现的。编译之后的字节码仍然是如Java SE5之前的形态。如自动装箱使用对象的valueOf方法实现的,而拆箱使用对象的 xxxValue方法实现的,xxx代表对应的基本数据类型。

自动装箱与拆箱的原理很简单,通常面试会问对象比较的问题,以考察候选人对源码的了解程度。比较典型的案例是使用==来比较对象是否相等。在实际工作中通常使用对象的equals方法,这是没有问题的。==操作是比较对象的地址是否相同,只要两个地址指向的对象不同,==操作就会返回false。

对于基本数据类型的对象来说,由于考虑到有些对象是会经常使用到的,如果频繁的进行对象的创建和回收,会极大的影响系统效率。因此Java规范也规定需要对于经常使用的对象进行缓存。

对于Integer类型,具体实现中使用了IntegerCache类做缓存,缓存了数值在[-128,127]之间的对象,valueOf方法对于缓存的对象会直接返回对象引用,否则会调用Integer的构造函数创建新对象。因此自动装箱对于[-128,127]之间的数,使用==操作时会返回true,其他情况是false。但有一点需要注意,如果是直接调用构造方法生成的对象,永远都是新对象,也就是说==操作都会返回false。

类似的实现,Short、Long、Byte、Integer都是缓存了数值在[-128,127]之间的相应对象;Character对应char类型,没有负数,因此缓存了[0,127]之间的相应对象;Boolean只有两个数值,都做了缓存。

至于Double和Float,他们没有做任何缓存。其原因可能是:

  1. 由于在某个范围内的整型数值的个数是有限的,而浮点数却不是;
  2. 很难评估哪些数是经常被使用到,或者说没有像整型数值那样的在实际使用过程中被经常用到的数值;

基于之前的讨论,我们知道定义数值类型可以使用Integer i = new Integer(7);或者Integer i = 7;,两者在使用上主要注意:

  1. 前者不会触发自动装箱,而后者会触发自动装箱过程;
  2. 前者直接生成新对象,而后者会根据具体数值,决定是否生成新对象,还是返回缓存对象的引用;
  3. 从执行效率和资源占用上来看,后者的效果更高,推荐使用;

另外,在实际工作中,我们还是尽量使用equals方法吧,实在是想不到什么时候会用==操作啊 (除了面试的时候:))

时间: 2024-12-23 19:32:07

Java 自动装箱与拆箱的相关文章

java自动装箱与拆箱

基本数据(Primitive)类型的自动装箱(autoboxing).拆箱(unboxing)是J2SE 5.0提供的新功能,跟泛型.变长参数等一样,这也是一颗"语法糖",之前介绍jvm早期优化的时候说过,语法糖对运行期的代码没有任何影响,其目的仅仅是方便程序员使用,所有语法糖编译后都将会还原成基础语法.这次介绍的自动装箱和拆箱也不例外.看下头的例子: public class Demo { public static void main(String[] args) { Intege

Java 自动装箱和拆箱

JDK1.5之后的功能 自动装箱:指的是开发人员可以把一个基本数据类型直接赋给对应的包装类 自动拆箱:指开发人员可以把一个包装类对象直接赋给对应的基本数据类型 public static void main(String[] args) { Integer i = 1; //装箱 int j = i ; //拆箱 } public static void main(String[] args) { List list = new ArrayList(); list.add(1); int j=

跟王老师学泛型(二):Java自动装箱与拆箱

Java 自动装箱与拆箱(Autoboxing and unboxing) 主讲教师:王少华 QQ群:483773664 学习目标: 掌握Java 基本数据对应的包装类 掌握Java 自动装箱与拆箱 一.基本数据类型对应的包装类 Java为每一种基本数据类型都提供了一个包装类,而这些包装类就在java.lang包中.Java共有8个包装类.如下图所示: 包装所有数字类型类都继承自Number类,Number类是一个抽象类. 二.什么是自动装箱拆箱 基本数据类型的自动装箱(autoboxing).

【转】java 自动装箱与拆箱

java 自动装箱与拆箱 这个是jdk1.5以后才引入的新的内容,作为秉承发表是最好的记忆,毅然决定还是用一篇博客来代替我的记忆: java语言规范中说道:在许多情况下包装与解包装是由编译器自行完成的(在这种情况下包装成为装箱,解包装称为拆箱): 其实按照我自己的理解自动装箱就可以简单的理解为将基本数据类型封装为对象类型,来符合java的面向对象:例如用int来举例: //声明一个Integer对象 Integer num = 10; //以上的声明就是用到了自动的装箱:解析为 Integer

java 自动装箱、拆箱

# java 自动装箱.拆箱 从 jdk 1.5 版本开始, 引入该功能. 一.自动装箱 将基本数据类型自动封装为对应封装类. 代码示例, Integer i = 100; 100属于基本类型int,会自动装箱,如下: Integer i = Integer.valueOf(100); 相当于, Integer i = new Integer(100); 二.自动拆箱 将封装类自动转换为对应的基本数据类型. 代码示例, Integer i = new Integer(100); int j =

[转]java 自动装箱与拆箱

转自:http://www.cnblogs.com/shenliang123/archive/2012/04/16/2451996.html 这个是jdk1.5以后才引入的新的内容,作为秉承发表是最好的记忆,毅然决定还是用一篇博客来代替我的记忆: java语言规范中说道:在许多情况下包装与解包装是由编译器自行完成的(在这种情况下包装成为装箱,解包装称为拆箱): 其实按照我自己的理解自动装箱就可以简单的理解为将基本数据类型封装为对象类型,来符合java的面向对象:例如用int来举例: //声明一个

Java 自动装箱和拆箱那些事

1.JAVA的基本数据类型 在Java中,数据类型可以分为两大种,Primitive Type(基本类型)和Reference Type(引用类型).基本类型的数值不是对象,不能调用对象的toString().hashCode().getClass().equals()等方法.所以Java提供了针对每种基本类型的包装类型.如下: Java基本数据类型 INDEX 基本类型  大小 数值范围 默认值 包装类型 1 boolean    --- true,false false Boolean 2

[转]JAVA自动装箱和拆箱

1.Java数据类型 装箱和拆箱之前,我们先来了解一下Java的基本数据类型. 在Java中,数据类型可以分为两大种,Primitive Type(基本类型)和Reference Type(引用类型).基本类型的数值不是对象,不能调用对象的toString().hashCode().getClass().equals()等方法.所以Java提供了针对每种基本类型的包装类型.如下: Java基本数据类型 INDEX 基本类型  大小 数值范围 默认值 包装类型 1 boolean    --- t

全面理解java自动装箱和拆箱(转)

自动装箱和拆箱从Java 1.5开始引入,目的是将原始类型值转自动地转换成对应的对象.自动装箱与拆箱的机制可以让我们在Java的变量赋值或者是方法调用等情况下使用原始类型或者对象类型更加简单直接. 如果你在Java1.5下进行过编程的话,你一定不会陌生这一点,你不能直接地向集合(Collections)中放入原始类型值,因为集合只接收对象.通常这种情况下你的做法是,将这些原始类型的值转换成对象,然后将这些转换的对象放入集合中.使用Integer,Double,Boolean等这些类我们可以将原始