新整数与值的对比

2022-08-31 13:30:25

我使用Sonar使我的代码更干净,它指出我正在使用而不是.因为它似乎没有实例化一个新对象,所以对内存更友好。如何无法实例化新对象?它是如何工作的?这是否适用于所有整数?new Integer(1)Integer.valueOf(1)valueOfvalueOf


答案 1

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

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


答案 2

来自 JavaDoc

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

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

这是 Sun JVM 1.5 的实现。查看整个类以查看缓存是如何初始化的。valueOf

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);
}

推荐