• Integer.valueOf


    一. 深入代码
     
    在创建数字 1 的对象时, 大多数人会使用 new Integer(1), 而使用 Integer.valueOf(1) 可以使用系统缓存,既减少可能的内存占用,也省去了频繁创建对象的开销。 

    系统默认只缓存 -128~127 之间的整数。下面我们看一下 Integer.valueOf(int) 方法的代码: 

    1 public static Integer valueOf(int i) {  
    2     assert IntegerCache.high >= 127;  
    3     if (i >= IntegerCache.low && i <= IntegerCache.high)  
    4         return IntegerCache.cache[i + (-IntegerCache.low)];  
    5     return new Integer(i);  
    6 }  
    注意到核心 IntegerCache.cache[i + (-IntegerCache.low)], 观察 IntegerCache 类的源码实现:
    为 -128 ~ 127 数值提供自动装箱的缓存服务。  
     1 private static class IntegerCache {  
     2     static final int low = -128;  
     3     static final int high;  
     4     static final Integer cache[];  
     5   
     6     static {  
     7         // high value may be configured by property  
     8         int h = 127;  
     9         String integerCacheHighPropValue =  
    10             sun.misc.VM.getSavedProperty("java.lang.Integer.IntegerCache.high");  
    11         if (integerCacheHighPropValue != null) {  
    12             int i = parseInt(integerCacheHighPropValue);  
    13             i = Math.max(i, 127);  
    14             // Maximum array size is Integer.MAX_VALUE  
    15             h = Math.min(i, Integer.MAX_VALUE - (-low) -1);  
    16         }  
    17         high = h;  
    18   
    19         cache = new Integer[(high - low) + 1];  
    20         int j = low;  
    21         for(int k = 0; k < cache.length; k++)  
    22             cache[k] = new Integer(j++);  
    23     }  
    24   
    25     private IntegerCache() {}  
    26 }  
    static 静态代码块可知缓存的初始化是在第一次使用的时候。 通过 VM 参数-XX:AutoBoxCacheMax=<size> 可以配置缓存的最大值。 在 VM 初始化期间, 缓存最大值 high, 可能被保存在 sun.misc.VM class 的私有系统属性里。      
     
     
    三. 总结
     
    除非是 JDK 1.5 以前的环境, 如果系统不需要新对象, 则推荐使用 Long, Integer, Short, Character, Byte 的 valueOf() 方法提升性能。 
  • 相关阅读:
    js实现粘贴板复制
    oracle分页查询
    [小技巧]window10删除此电脑左侧栏中的非磁盘文件夹
    [web]2019第一起数据泄露事件
    [xml]AttributeError: 'xml.etree.ElementTree.Element' object has no attribute 'getroot'
    [python]Mongodb
    [urllib]urlretrieve在python3
    [flask]邮件配置-20171227
    [PowerShell]Python虚拟环境激活失败
    [git]git入门
  • 原文地址:https://www.cnblogs.com/UniqueColor/p/7131034.html
Copyright © 2020-2023  润新知