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() 方法提升性能。

时间: 2024-07-30 10:12:18

Integer.valueOf的相关文章

Integer.parseInt(String s) 和 Integer.valueOf(String s) 的区别

通过查看java.lang.Integer的源码可以发现, 它们最终调用的都是 /** * Parses the string argument as a signed integer in the radix * specified by the second argument. The characters in the string * must all be digits of the specified radix (as determined by * whether {@link

Integer.valueOf(String)方法字符串转整型- 你肯定不知道的疑惑!

有个仁兄在 StackOverflow 上发起了一个问题,是这么问的: " 我被下面的代码搞晕了,为什么它们会返回不同的值?" 1 2 3 System.out.println(Integer.valueOf("127")==Integer.valueOf("127")); System.out.println(Integer.valueOf("128")==Integer.valueOf("128"));

Integer.parseInt vs Integer.valueOf

一直搞不清楚这两个有什么区别.刚才特意查了一下帖子. Integer.parseInt 返回的是 primitive int Integer.valueOf  返回的是 Integer Object Reference: http://stackoverflow.com/questions/7355024/integer-valueof-vs-integer-parseint

Integer.valueof(String s)和Integer.parseInt(String s)的具体区别是什么?

Integer.valueof(String s)是将一个包装类是将一个实际值为数字的变量先转成string型再将它转成Integer型的包装类对象(相当于转成了int的对象)这样转完的对象就具有方法和属性了.而Integer.parseInt(String s)只是将是数字的字符串转成数字,注意他返回的是int型变量不具备方法和属性. 设有下面两个赋值语句:a=Integer.parseInt(“123”);b=Integer.valueOf(“123”).intValue();下述说法正确的

区分Integer.getInteger和Integer.valueOf使用方法

Integer类有两个看起来很类似的静态方法,一个是Integer.getInteger(String),另外一个是Integer.valueOf(String).如果只看方法名称的话,很容易将这两个方法的功能区分开来,还是让我们来看看Java文档. Integer.getInteger(String)的功能是根据指定的名称得到系统属性的整数值.第一个参数将被认为是系统属性的名称.系统属性可以通过  System.getProperty(java.lang.String)方法访问得到.属性值字符

Integer.parseInt()和Integer.valueOf()有什么区别

他们有本质区别,Integer.valueof(String s)是将一个包装类是将一个实际值为数字的变量先转成string型再将它转成Integer型的包装类对象(相当于转成了int的对象)这样转完的对象就具有方法和属性了. 而Integer.parseInt(String s)只是将是数字的字符串转成数字,注意他返回的是int型变量不具备方法和属性 Integer.parseInt()把String 型转换为Int型, Integer.valueOf()把String 型转换为Integer

区分Integer.getInteger和Integer.valueOf、Integer.parseInt() 的使用方法

Integer类有两个看起来很类似的静态方法,一个是Integer.getInteger(String),另外一个是Integer.valueOf(String).如果只看方法名称的话,很容易将这两个方法的功能区分开来,还是让我们来看看Java文档. Integer.getInteger(String)的功能是根据指定的名称得到系统属性的整数值.第一个参数将被认为是系统属性的名称.系统属性可以通过 System.getProperty(java.lang.String)方法访问得到.属性值字符串

JavaSE8基础 Integer.valueOf 把int类型变为Integer类型

os :windows7 x64    jdk:jdk-8u131-windows-x64    ide:Eclipse Oxygen Release (4.7.0)        code: package jizuiku3; public class Demo1000 { public static void main(String[] args) { Integer i = Integer.valueOf(1234); } } sourceCode: public static Integ

Integer.valueOf(String) 方法之惑

http://www.importnew.com/9162.html 本文由 ImportNew - 靳禹 翻译自 stackoverflow.欢迎加入翻译小组.转载请见文末要求. 有个仁兄在 StackOverflow 上发起了一个问题,是这么问的: “ 我被下面的代码搞晕了,为什么它们会返回不同的值?” 1 2 3 System.out.println(Integer.valueOf("127")==Integer.valueOf("127")); System