Java中泛型可以看做是一种伪泛型,使用Java泛型时,必须保证响应类型可以转化为Object类,这就使得int、double这样的原始数据类型不能于Java泛型配合使用,包装类的出现使得这一问题得到了解决。

包装类解决了基本数据类型无法做到的事情
– 泛型类型参数
– 序列化
– 类型转换
– 高频区间数据缓存

1.装箱与拆箱

1)装箱:把基本数据类型转换成包装类

    //1.自动装箱
    int pack1=2;
    Integer pack2=pack1;
    //2.手动装箱
    Integer pack3=new Integer(pack1);

2)拆箱:把包装类转换成基本数据类型

    Integer pack3=new Integer(pack1);
    //1.自动拆箱
    int open1=pack3;
    //2.手动拆箱
    int open2=pack3.intValue();

注意:要避免无意的装箱和拆箱行为,否则在一定数量级的场景下软件的性能会受到影响,主要表现在内存使用和处理速度上。使用原始数据类型在性能极度敏感的场景具有比较大的优势。

2.Integer

从Integer的源码中我们可以得知,Integer继承Number类,同时Integer提供的value方法使用了final关键字,使得其不可以被重写。

private static class IntegerCache {
        static final int low = -128;
        static final int high;
        static final Integer cache[];

        static {
            // high value may be configured by property
            int h = 127;
            String integerCacheHighPropValue =
                sun.misc.VM.getSavedProperty("java.lang.Integer.IntegerCache.high");
            if (integerCacheHighPropValue != null) {
                try {
                    int i = parseInt(integerCacheHighPropValue);
                    i = Math.max(i, 127);
                    // Maximum array size is Integer.MAX_VALUE
                    h = Math.min(i, Integer.MAX_VALUE - (-low) -1);
                } catch( NumberFormatException nfe) {
                    // If the property cannot be parsed into an int, ignore it.
                }
            }
            high = h;
            ......
    }

注意事项:

Integer会缓存-128~127之间的赋值,当再次出现时会复用已有对象,此时两个Integer对象==会输出true。所以当我们在进行包装类比较时都使用equals方法。

2.字符串与基本数据类型

1)toString方法

int st1=2;
String st2=Integer.toString(st1);

2)parse方法

String st2=Integer.toString(st1);
//parse
int st3=Integer.parseInt(st2);

3)valueOf方法

String st2=Integer.toString(st1);
//包装类的valueOf 先将字符串转换为包装类,再通过自动拆箱完成基本类型转换
int st4=Integer.valueOf(st2);