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