您跳过了预期的解决方案:
Integer p = Integer.valueOf(1);
此模式称为Factory方法模式。有人可能会问这种方法有什么好处。幸运的是,class
Integer的实现是开源的,因此让我们看一下:
public static Integer valueOf(int i) { if (i >= IntegerCache.low && i <= IntegerCache.high) return IntegerCache.cache[i + (-IntegerCache.low)]; return new Integer(i); }似乎存在某种
Integer-value缓存。如果请求一个
Integer具有缓存范围内的值的Java,则Java不会创建新对象,而是返回先前创建的对象。这
Integer是可行的,因为s是不可变的。甚至可以使用system属性来控制高速缓存上限
java.lang.Integer.IntegerCache.high=...。
为什么其他两种创建
Integer警告的方法也会产生警告?因为它们已被Java 9弃用。
Integer#Integer(intvalue):
不推荐使用
。很少适合使用此构造函数。valueOf(int)通常,静态工厂是一个更好的选择,因为它可能会产生明显更好的空间和时间性能。[…]
Integer#Integer(Strings):
不推荐使用
。很少适合使用此构造函数。使用parseInt(String)一个字符串转换为int原始的,或使用valueOf(String)一个字符串转换为一个Integer对象。[…]
仅出于完整性考虑,以下是用于
Integer.valueOf(inti):
返回
Integer表示指定int值的实例。如果Integer不需要新实例,则通常应优先于构造方法使用Integer(int)此方法,因为通过缓存经常请求的值,此方法可能会产生明显更好的空间和时间性能。此方法将总是在范围内的缓存值-128到127,包容性,并可以外接高速缓存的这个范围以外的值。
编辑1:感谢@VGR提到
Integer p = 1;
等同于
Integer p = Integer.valueOf(1);
但是,这仅适用于和
int之间的
-128-值
127。该行为在JLS§5.1.7中定义:
[…]如果该值
p被装箱是评价类型的常量表达式(§15.28)的结果boolean,char,short,int,或long,其结果是true,false在的范围内的字符'u0000',以'u007f'包容,或在范围内的整数-128以127包容性的,然后让a和b是任意两个装箱转换的结果p。总是这样的a== b。
虽然不在JLS中,但
javac我正在使用(
9.0.4)的版本确实将装箱压缩到了AdamRosenfield
Integer.valueOf(...);在此答案中所示的位置。



