Integer缓存

Integer缓存问题

规约: [强制] 所有整型包装类对象之间值的比较, 全部使用equals方法比较

What

Integer 默认缓存区: [-128 —127]

public class IntTest {
	public static void main(String[] args) {
	    Integer a = 100, b = 100, c = 150, d = 150;
	    System.out.println(a == b);
	    System.out.println(c == d);
	}
}

Why

  • Integer 默认缓存区: [-128 —127]

    • 如何知道Integer var = ?会缓存-128—127的赋值?
    看源码
    
    • 那么为什么会缓存这一段区间的数值?
    是为了自动装箱时可以复用这些对象 , 提高性能
    
    • 缓存的区间可以修改吗?
    最小值是固定值 -128, 最大值并不是固定值,
    缓存的最大值是可以通过虚拟机参数 -XX:AutoBoxCacheMax=<size>} 或
    -Djava.lang.Integer.IntegerCache.high=<value> 来设置的
    
    • 其它的包装类型有没有类似缓存?
    在 -128 到 127 (含)之间的 int 类型的值,或者 boolean 类型的 true 或 false, 以及范围在’\u0000’和’\u007f’ (含)之间的 char 类型的数值 p, 自动包装成 a 和 b 两个对象时, 可以使用 a == b 判断 a 和 b 的值是否相等。
    

How

  • 我们如何学习和分析类似的问题?

源码分析法

//源码分析法
public final class Integer extends Number implements Comparable<Integer> {
    //Integer a = 100; ---> Integer a = Integer.valueOf(100);(自动装箱)
    public static Integer valueOf(int i) {
   	    if (i >= IntegerCache.low && i <= IntegerCache.high)
            return IntegerCache.cache[i + (-IntegerCache.low)];
        return new Integer(i);
    }
	//内部类IntegerCatch
    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");
               // 省略其它代码
        }
          // 省略其它代码
    }
    
}

反汇编法

编译源代码: javac LongTest.java

对编译后的类文件进行反汇编: javap -c LongTest

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值