从JDK 1.5开始Java增加为每种基本数据类型都提供了对应的包装器类型,具有了装箱和拆箱的特性。

装箱 : 将基本数据类型转换成引用类型
拆箱 : 与装箱相反,将引用类型转换成基本数据类

装箱示例

1
Integer c = 200 ; //Integer.valueOf(int i)

拆箱示例

1
int a = 200 ; //Integer.intValue();

关于拆箱

引用类.valueOf(类型) 特性

在基本数据类型的装箱操作上面:

Integer、Short、Byte、Character、Long这几个类的valueOf方法的实现是类似的,但是不完全相同。

Integer为例:

1
2
3
4
5
public static Integer valueOf(int i) {
if (i >= IntegerCache.low &amp;&amp; i <= IntegerCache.high)
return IntegerCache.cache[i + (-IntegerCache.low)];
return new Integer(i);
}

Double、Float的valueOf方法的实现是类似的。
Double为例:

1
2
3
public static Double valueOf(double d) {
return new Double(d);
}

根据上面的源代码就会发现,在Integer、Short、Byte、Character、Long类的valueOf方法会使用Cache类,当值在一定范围内,不返回new对象的值,而采用缓存的值。通常默认值在-128~127之间。

示例代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
package com.devnp.core;

public class AutoUnboxing {

public static void main(String[] args) {
// TODO Auto-generated method stub
int a = 100 ; //Integer.intValue();
int b = 100 ;

Integer c = 100 ; //Integer.valueOf(int i)
Integer d = 100 ;

Integer e = 200 ;
Integer f = 200 ;

Long l1 = 100L ;
Long l2 = 100L ;

Long l3 = 200L ;
Long l4 = 200L ;

Double double1 = 100.11D ;
Double double2 = 100.11D ;


System.out.println(a == b);
System.out.println(c == d);
System.out.println(e == f);

System.out.println(l1 == l2);
System.out.println(l3 == l4);

System.out.println(double1 == double2);

}

}

运行结果:

1
2
3
4
5
6
true
true
false
true
false
false

基本数据类型与引用类型

*int(4字节) Integer
*byte(1字节) Byte
*short(2字节) Short
*long(8字节) Long
*float(4字节) Float
*double(8字节) Double
*char(2字节) Character
*boolean(未定) Boolean