包装类
Java有基本类型,它们不是对象,为了让基本类型有对象的特征(使其拥有属性和方法,丰富其操作),需要将其包装为对象

1.装箱和拆箱的实现
Integer类举例,Integer是int的包装类,它维护一个final int类型的value,所有操作都是对这个value的操作
装箱:valueOf方法传入一个int值,用Integer的构造方法给value赋值并返回Integer对象
拆箱:intValue方法返回维护的int类型的value

2.装箱的缓存
Integer中定义了static类IntegerCache,static块中编写了代码以供类加载时初始化,使用Integer类型的数组,将-128到常用的127之间都创建Integer对象放入数组作为缓存
-128不可以修改,但是最大值127时可以修改的,在创建对象前使用sun.misc.VM.getSavedProperty(“java.lang.Integer.IntegerCache.high”)获取了配置中的值,这个值可以作为JVM的参数进行配置
装箱使用ValueOf方法,此方法会先判断int是否在-128到127的范围,是的话返回缓存的对象,不是的话创建新Integer对象
所以可以得到结论,int值在-128到127时,使用的Integer对象是缓存中的,一直是同一个对象,不在此范围内时用的是新对象,每次都会重新创建。比较Integer对象时不能用==比较地址,可用equals或者int类型比较
valueOf方法装箱才会涉及缓存,而使用Integer的构造方法会直接创建对象
Long、Short、Byte、Character也有缓存机制,都不可以修改最大值
Long、Short、Byte范围也是-128到127,Byte本身的范围就是如此;Character范围为0-127