【java基础】Integer的自动装箱拆箱与缓存机制

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);
    }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值