自动拆箱和自动装箱

一开始想学学自动拆箱和自动装箱是被这个名字吸引到,听上去好像很高端的样子,其实自动拆箱、自动装箱是很简单的内容。

自动拆箱和自动装箱

Java为每种基本数据类型都提供了对应的包装器类型。举个例子:

1 public class TestMain
2 {
3     public static void main(String[] args)
4     {
5         Integer i = 10;
6     }
7 }

这个过程中会自动根据数值创建对应的Integer对象,这就是自动装箱。再看另外一段代码:

1 public class TestMain
2 {
3     public static void main(String[] args)
4     {
5         Integer i = 10;
6         int n = i;
7     }
8 }

这个过程中会根据包装器类型自动将数据转换为基本类型,这就是自动拆箱

至于自动装箱和自动拆箱的原理也很简单。通过命令行程序,进入CLASSPATH(也就是bin目录下.class文件所在的路径),javap反编译查看一下生成的字节码:

反编译出来的内容有很多,我们只关注重点部分:

看到在自动装箱的时候,Java虚拟机会自动调用Integer的valueOf方法;在自动拆箱的时候,Java虚拟机会自动调用Integer的intValue方法,这就是自动拆箱和自动装箱的原理。

小陷阱

看两段代码,第一段代码为:

public class TestMain
{
    public static void main(String[] args)
    {
        Integer i1 = 100;
        Integer i2 = 100;
        Integer i3 = 200;
        Integer i4 = 200;

        System.out.println(i1 == i2);
        System.out.println(i3 == i4);
    }
}

运行结果为:

true
false

第二段代码为:

public class TestMain
{
    public static void main(String[] args)
    {
        Double d1 = 100.0;
        Double d2 = 100.0;
        Double d3 = 200.0;
        Double d4 = 200.0;

        System.out.println(d1 == d2);
        System.out.println(d3 == d4);
    }
}

运行结果为:

false
false

产生这样的结果的原因是:Byte、Short、Integer、Long、Char这几个装箱类的valueOf()方法是以128位分界线做了缓存的,假如是128以下且-128以上的值是会取缓存里面的引用的,以Integer为例,其valueOf(int i)的源代码为:

public static Integer valueOf(int i) {
    final int offset = 128;
    if (i >= -128 && i <= 127) { // must cache
        return IntegerCache.cache[i + offset];
    }
        return new Integer(i);
    }

而Float、Double则不会,原因也很简单,因为byte、Short、integer、long、char在某个范围内的整数个数是有限的,但是float、double这两个浮点数却不是。关于这个小知识点,个人提出两点意见:

1、不重要,除了面试考察求职者对于知识的掌握程度,没多大用

2、脑子里要有缓存这个概念,对于提高程序运行效率是有很大帮助的

时间: 2024-10-25 16:14:06

自动拆箱和自动装箱的相关文章

自动装箱和自动拆箱

http://www.cnblogs.com/xrq730/p/4869065.html 自动拆箱和自动装箱 Java为每种基本数据类型都提供了对应的包装器类型.举个例子: public class TestMain { public static void main(String[] args) { Integer i = 10; } } 这个过程中会自动根据数值创建对应的Integer对象,这就是自动装箱.再看另外一段代码: public class TestMain { public st

java中的自动装箱和自动拆箱

/* JDK5.0新特性: 以下的特性适合JDK1.5版本之后的.包括1.5 jdk1.4,包括1.4在内之前的所有版本不能使用以下特性. 自动装箱(auto_boxing)和自动拆箱(auto_unboxing) */ public class IntegerTest05{ public static void main(String[] args){ //JDK5.0之前的. //int-->Integer (装箱) Integer i1 = new Integer(10); //Integ

Java语法糖2:自动装箱和自动拆箱

一开始想学学自动拆箱和自动装箱是被这个名字吸引到,听上去好像很高端的样子,其实自动拆箱.自动装箱是很简单的内容. 自动拆箱和自动装箱 Java为每种基本数据类型都提供了对应的包装器类型.举个例子: public class TestMain { public static void main(String[] args) { Integer i = 10; } } 这个过程中会自动根据数值创建对应的Integer对象,这就是自动装箱.再看另外一段代码: public class TestMain

11、自动拆箱和装箱

什么是自动拆箱和自动装箱? //自动装箱:把基本类型转换为包装类类型 Integer s1 = 123; //自动拆箱:把包装类类型转换为基本类型 Integer s2 = new Integer(10); int i2 = s2; 以上特性是jdk5中加入的,也就是说在jdk5版本之前是不支持自动装箱和自动拆箱的. 注意:在判断两个Integer类型是否相等时,要使用equals方法,不能使用"==",Integer已经重写了Object中的equals方法. Integer s2

自动装箱/自动拆箱/注释之反编译示例

下面是源码: 1 package test; 2 3 import java.util.ArrayList; 4 import java.util.List; 5 6 public class Test { 7 public static void main(String[] args) { 8 List<Integer> list = new ArrayList<>(); 9 //下面会触发编译器自动装箱 10 list.add(1); 11 //下面会触发编译器自动拆箱 12

自动装箱(boxing)和自动拆箱(unboxing)

摘自:http://www.codeceo.com/article/java-boxing-unboxing.html Java的四类八种基本数据类型 基本类型 占用空间(Byte) 表示范围 包装器类型 boolean 1/8 true|false Boolean char 2 -128~127 Character byte 1 -128~127 Byte short 2 -2ˆ15~2ˆ15-1 Short int 4 -2ˆ31~2ˆ31-1 Integer long 8 -2ˆ63~2ˆ

Java的自动拆箱和装箱

Java 1.5中引入了自动装箱和拆箱机制 自动装箱:(看代码) <span style="font-family:SimSun;font-size:18px;color:#000000;">//自动装箱:把基本类型用它们所对应的引用类型包装起来,使它们具有对象的属性 Integer integer_a = 8; </span> 自动拆箱:(看代码) <span style="font-family:SimSun;font-size:18px;c

自动装箱,自动拆箱

QUOTE: Integer a=1;//这就是一个自动装箱,如果没有自动装箱的话,需要这样Integer a=new Integer(1)int b=a;//这就是一个自动拆箱,如果没有自动拆箱的话,需要这样:int b=a.intValue() 这样就能看出自动装箱和自动拆箱是简化了基本数据类型和相对应对象的转化步骤. 自动装箱,自动拆箱,布布扣,bubuko.com

java 自动装箱和自动拆箱

自动装箱 java执行Integer i = 100:编译器编译成Integer i = Integer.valueOf(100); 1 Integer i = 100; 2 //编译器编译成Integer i = Integer.valueOf(100); 自动拆箱 java执行 1 Integer i = 100; 2 int j = i; 3 //编译器编译成int j = i.intValue(); 参考: http://www.cnblogs.com/danne823/archive/