Integer的缓存

2019-01-14 21:34:57
  1. ByteShortIntegerLongCharacter类都具有缓存机制,由相应的类中的一个静态内部类实现。
  2. 缓存范围:ByteShortIntegerLong是[-128, 127],Character是[0, 127]
  3. 除了Integer可以指定缓存范围,其它类都不行,Integer类可以通过JVM参数-XX:AutoBoxCacheMax=size来指定缓存上界,如果指定值比127小,则取127,如果比127大,则取指定值与Integer.MAX_VALUE - (-low) -1的最小值(考虑到数组长度最大为Integer.MAX_VALUE,而且还要缓存128个负数)
  4. Boolean也有缓存,只不过不是用数组,而是直接两个变量实现的:

    1. public static final Boolean TRUE = new Boolean(true);
    2. public static final Boolean FALSE = new Boolean(false);
  5. 当调用这些类的valueOf方法,或发生自动装箱时,缓存会生效,直接new不生效
    Integer中的缓存类:
  1. @HotSpotIntrinsicCandidate
  2. public static Integer valueOf(int i) {
  3. if (i >= IntegerCache.low && i <= IntegerCache.high)
  4. return IntegerCache.cache[i + (-IntegerCache.low)];
  5. return new Integer(i);
  6. }
  7. private static class IntegerCache {
  8. static final int low = -128;
  9. static final int high;
  10. static final Integer cache[];
  11. static {
  12. // high value may be configured by property
  13. int h = 127;
  14. String integerCacheHighPropValue =
  15. VM.getSavedProperty("java.lang.Integer.IntegerCache.high");
  16. if (integerCacheHighPropValue != null) {
  17. try {
  18. int i = parseInt(integerCacheHighPropValue);
  19. i = Math.max(i, 127);
  20. // Maximum array size is Integer.MAX_VALUE
  21. h = Math.min(i, Integer.MAX_VALUE - (-low) -1);
  22. } catch( NumberFormatException nfe) {
  23. // If the property cannot be parsed into an int, ignore it.
  24. }
  25. }
  26. high = h;
  27. cache = new Integer[(high - low) + 1];
  28. int j = low;
  29. for(int k = 0; k < cache.length; k++)
  30. cache[k] = new Integer(j++);
  31. // range [-128, 127] must be interned (JLS7 5.1.7)
  32. assert IntegerCache.high >= 127;
  33. }
  34. private IntegerCache() {}
  35. }
  1. public static void main(String[] args) {
  2. Integer a = new Integer(3);
  3. Integer b = new Integer(3);
  4. System.out.println(a == b); // false 直接new不使用缓存
  5. a = 3; b = 3;
  6. System.out.println(a == b); // true 自动装箱,使用缓存
  7. a = 128; b = 128;
  8. System.out.println(a == b); // false 超出缓存范围,无法使用缓存的对象,而是每次新建一个对象
  9. a = Integer.valueOf(127);
  10. b = Integer.valueOf(127);
  11. System.out.println(a == b); // true valueOf方法,使用缓存
  12. a = Integer.valueOf(128);
  13. b = Integer.valueOf(128);
  14. System.out.println(a == b); // false 超出缓存范围
  15. }

设置虚拟机参数-XX:AutoBoxCacheMax=256

  1. public static void main(String[] args) {
  2. Integer a = 128, b = 128;
  3. System.out.println(a == b); // true
  4. }

0
3
0

添加评论

正在回复:
取消
1
0
3
0