New Integer vs valueOf

LB4*_*B40 69 java sonarqube

我正在使用Sonar使我的代码更清洁,它指出我正在使用new Integer(1)而不是Integer.valueOf(1).因为它似乎valueOf没有实例化一个新对象所以更加内存友好.怎么valueOf不能实例化一个新对象?它是如何工作的?对所有整数都是如此吗?

Bre*_*ail 71

Integer.valueOf为值-128到+127实现缓存.请参阅Java语言规范的最后一段,第5.1.7节,其中解释了装箱的要求(通常根据.valueOf方法实现).

http://docs.oracle.com/javase/specs/jls/se7/html/jls-5.html#jls-5.1.7

  • 为了完整起见,还要注意在Sun VM上,使用`-XX:AutoBoxCacheMax = ...可以用户配置缓存的最大值. (21认同)
  • @MarkPeters提供额外的完整性;-)该功能仅在最近更新Sun Java 6(我认为更新14左右)后才可用. (5认同)

pgr*_*ras 26

来自JavaDoc:

public static Integer valueOf(int i)返回表示指定int值的Integer实例.如果不需要新的Integer实例,通常应优先使用此方法,而不是构造函数Integer(int),因为此方法可能通过缓存频繁请求的值来显着提高空间和时间性能.

ValueOf 通常用于自动装箱,因此(当用于自动装箱时)缓存至少-128到127的值以遵循自动装箱规范.

以下是valueOfSun JVM 1.5 的实现.查看整个类以了解如何初始化缓存.

public static Integer valueOf(int i) {
    final int offset = 128;
    if (i >= -128 && i <= 127) { // must cache 
        return IntegerCache.cache[i + offset];
    }
    return new Integer(i);
}
Run Code Online (Sandbox Code Playgroud)