Java-装箱拆箱

包装类(Wrapper Class)

八个和基本数据类型对应的类统称为包装类(Wrapper Class)

基本数据类型 包装类
byte Byte
boolean Boolean
short Shrot
char Character
int Integer
long Long
float Float
double Double

包装类的缓存

包装类 缓存范围
Integer [-128, 127]
Long [-128, 127]
Short [-128, 127]
Byte [-128, 127]
Character [0, 127]
Boolean True,False

具体可以查看对应包装类的valueOf代码实现。

    // Integer valueOf代码实现
    public static Integer valueOf(int i) {
        if (i >= IntegerCache.low && i <= IntegerCache.high)
            return IntegerCache.cache[i + (-IntegerCache.low)];
        return new Integer(i);
    }

因此会有如下现象:

        Integer i1 = 100;
        Integer i2 = 100;
        Integer i3 = 200;
        Integer i4 = 200;

        System.out.println(i1 == i2); // true
        System.out.println(i3 == i4); // false

代码

        Integer i = 10; // 装箱使用Integer.valueOf()
        int n = i;      // 拆箱使用Integer.intValue()

        Integer i1 = 100;
        Integer i2 = 100;
        Integer i3 = 200;
        Integer i4 = 200;

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

        Long l1 = 200L;
        Long l2 = 300L;

        // 包装类的+、-、*、/都会先进行拆箱后再进行运算。
        Long l3 = i1 + l1;                      // 100 + 200L = 300L -> Long
        System.out.println(l1.equals(i1 + i2)); // false i1 + i2 => Integer
        System.out.println(l2.equals(i1 + l1)); // true  i1 + l1 => Long
        Integer i5 = 50 + 50;
        System.out.println(i1 == (50 + 50));    // true
        System.out.println(i1 == i5);           // true

推荐阅读更多精彩内容