import java.lang.reflect.Field;
/**
* @author XCXCXCXCX
* @date 2018/8/31
* @comments
*/
public class Test {
public static void main(String[] args) throws IllegalAccessException, NoSuchFieldException {
Integer i = 1;//缓存中i=1
Integer i2 = 2;//缓存中i2 = 2
Integer i3 = 3;//缓存中i3 = 3
Field field = Integer.class.getDeclaredField("value");
field.setAccessible(true);
System.out.println("i="+i+";i2="+i2+";i3="+i3);
Integer temp = i;
//Integer temp2 = new Integer(i);
//Integer.valueOf(Integer).intValue() 对于Integer对象先装箱再拆箱
field.set(i, i2.intValue());//i2值为2,自动装箱获取缓存中值2的对象,为i2,i2此时的值为2==>i=2
field.set(i2, i3.intValue());//i3值为3,自动装箱获取缓存中值3的对象,为i3,i3此时的值为3==>i2=3
//field.set(i3, temp.intValue());//temp指向i,此时的i的值为2,自动装箱获取缓存中值2的对象,为i2,i2的此时的值为3==>i3=3
field.set(i3, temp);//temp是Integer对象,无需自动装箱,直接拆箱,temp此时的值即为i的值,此时i=2,即==>i3=2
System.out.println("i="+i+";i2="+i2+";i3="+i3+"::"+temp+"::"+temp.intValue());
}
}
知识点1
Integer与int的自动装箱拆箱类似于自动调用方法Integer.valueOf(int)和Integer.intValue()
知识点2
Integer在调用valueOf自动装箱的时候,会使用缓存机制,将-128~127之间的Integer对象地址缓存在常量池中。
valueOf方法注释翻译:
*返回表示指定的{@code int}值的{@code Integer}实例。 如果不需要新的{@code Integer}实例,通常应优先使用此方法,而不是构造函数{@link #Integer(int)},因为此方法可能通过频繁缓存来显着提高空间和时间性能 要求的价值。
*此方法将始终缓存-128到127(包括端点)范围内的值,并可以缓存此范围之外的其他值。
/**
* Returns an {@code Integer} instance representing the specified
* {@code int} value. If a new {@code Integer} instance is not
* required, this method should generally be used in preference to
* the constructor {@link #Integer(int)}, as this method is likely
* to yield significantly better space and time performance by
* caching frequently requested values.
*
* This method will always cache values in the range -128 to 127,
* inclusive, and may cache other values outside of this range.
*
* @param i an {@code int} value.
* @return an {@code Integer} instance representing {@code i}.
* @since 1.5
*/
public static Integer valueOf(int i) {
if (i >= IntegerCache.low && i <= IntegerCache.high)
return IntegerCache.cache[i + (-IntegerCache.low)];
return new Integer(i);
}