JAVA自动装箱/拆箱

作者: 冬天里的懒喵 | 来源:发表于2017-07-24 16:40 被阅读0次

在“java常量与常量池”
http://www.jianshu.com/p/baa035d9841b
中已经介绍过一些java自动装箱与拆箱的例子。现在单独对自动装箱/拆箱进行总结。

1.JAVA数据类型

JAVA数据类型

java基本数据类型和其包装类对应如下:

基础数据类型 长度 包装类型
int 4字节 Integer
byte 1字节 Byte
short 2字节 Short
long 8字节 Long
float 4字节 Float
double 8字节 Double
char 2字节 Character
boolean 不同虚拟机取值不同 Boolean

2.定义

自动装箱:把基本类型用其包装类替代,使其具有对象的特性。可以调用toString()、hashCode()、getClass()、equals()等方法。
如:

Integer a = 4;

其实编译器调用的是static Integer valueOf(int i)这个方法,valueOf(int i)返回一个表示指定int值的Integer对象,反编译后如下:

Integer a =Integer.valueOf(4);

自动拆箱:将包装类转换为基本类型。
如:

int a = new Integer(4);

实际上编译器内部会调用int intValue()返回该Integer对象的int值。
反编译后如下:

int a = new Integer(4).intValue();

3.发生时机

当出现赋值运算、算数表达式、方法调用等情况时,会触发自动装箱/拆箱操作。

 Integer a = 1;
 Integer b = 2;
 Long c = 3L;
 System.out.println(c == (a + b));
 System.out.println(c.equals(a + b));

上述问题输出结果:

true
false

说明:
c==(a+b),算数表达式先运算 a+b 拆箱操作,得到数值为3。Long与int比较,会自动拆箱,因此最终是 3==3 ,得到值为true。
c.equals(a+b), a+b 拆箱操作,得到数值为 3 int类型。Long与int进行equals,由于不是同一个对象,因此会返回false。
可以查看 Long对象源码,equals 首先需要判断 instanceof 是否为同一对象。

 public boolean equals(Object obj) {
        if (obj instanceof Long) {
            return value == ((Long)obj).longValue();
        }
        return false;
    }

4.包装类缓存

查看包装类源码,对于 int byte short long char boolean 这些类型的包装类都实现了一个字节的缓存,(Boolean 只有true和false两种)。float double这两种类型没有缓存。因此在缓存范围内的包装类,使用==时实际是同一对象。

Integer i1 = 127;
Integer i2 = 127;
Integer i3 = 128;
Integer i4 = 128;
System.out.println(i1 == i2); //true  满足缓存访问
System.out.println(i3 == i4);//false 在缓存范围之外

Double d1 = 127.0;
Double d2 = 127.0;
Double d3 = 128.0;
Double d4 = 128.0;
System.out.println(d1 == d2);//false 没有缓存
System.out.println(d3 == d4);//false 没有缓存

相关文章

  • (Note) Java-autoBoxing-unBoxing

    0. Thanks Java中的自动装箱与拆箱 Java 自动装箱与拆箱的实现原理 Integer.java 1....

  • Java自动装箱和拆箱,包装类缓存机制和JVM调节

    关于Java自动装箱和拆箱 基本数据(Primitive)类型的自动装箱(autoboxing)、拆箱(unbox...

  • Java中的自动装箱与拆箱

    自动装箱和拆箱从Java 1.5开始引入,目的是将原始类型值转自动地转换成对应的对象。自动装箱与拆箱的机制...

  • java中的自动装箱和拆箱机制

    java中的自动装箱和拆箱机制 概念 自动装箱:将基本数据类型转换为包装器类型 自动拆箱:将包装器类型转换为基本数...

  • 装箱与拆箱详解笔记

    1、什么是自动装箱与拆箱 //自动装箱Integer integer = 100;//自动拆箱int i = in...

  • java 自动装箱与自动拆箱

    自动装箱和拆箱从Java 1.5开始引入,目的是将原始类型值转自动地转换成对应的对象。自动装箱与拆箱的机制可以让我...

  • Java中的自动装箱与拆箱

    自动装箱和拆箱从Java 1.5开始引入,目的是将原始类型值转自动地转换成对应的对象。自动装箱与拆箱的机制可以让我...

  • java基础整理01--可变参数、枚举类

    本文总结了java基础的可变参数、自动装箱拆箱以及枚举类的基本内容,并且从自动装箱和拆箱延伸了享元设计模式;而枚举...

  • jdk5新特性

    自动装箱与拆箱 // 自动装箱:值转对象Integer n = 1;// 自动拆箱:对象转值int m = n; ...

  • Java中的自动装箱与拆箱

    自动装箱和拆箱从Java1.5开始引入,目的是将原始类型值转自动地转换成对应的对象。自动装箱与拆箱的机制可以让我们...

网友评论

    本文标题:JAVA自动装箱/拆箱

    本文链接:https://www.haomeiwen.com/subject/zmybkxtx.html