Java 9的一个新功能是弃用包装器对象的构造函数。创建新Wrapper对象的唯一方法是使用他们的valueOf()
静态方法。
例如,对于Integer对象,Integer.valueOf
为-128和127之间的值实现缓存,并在每次调用时返回相同的引用。
由于Integer
类的API说“静态工厂valueOf(int)通常是更好的选择,因为它可能会产生明显更好的空间和时间性能。”和JLS说“给定相应基元类型的值,通常不需要构造这些框类的新实例。建议的构造替代方法是自动装箱或valueOf静态工厂方法。在大多数情况下,自动装箱将起作用,因此类型为基元的表达式可用于需要框类的位置“
但是这个范围之外的值会发生什么? 例如,Integer x = Integer.valueOf(456)是每次执行类时都是一个新对象?
答案 0 :(得分:6)
两个
Integer x = Integer.valueOf(456);
和
Integer x = 456;
将始终导致创建Integer
的新实例,因为456
超出了Integer
缓存的范围。
您可以通过编写
进行测试Integer x1 = Integer.valueOf(456);
Integer x2 = Integer.valueOf(456);
System.out.println(x1==x2);
将打印false
。
答案 1 :(得分:1)
首先为什么要烦恼这些细节 - 比较 "babel-preset-env": "^1.6.1",
"babel-preset-react": "^6.24.1",
"webpack": "^3.8.1"
对象的正确方法是使用:
Integer
或更好if (x.intValue() == y.intValue())
在任何情况下都不要依赖有缓存的事实,因为这个缓存的上限可以作为属性更改,你可以通过:
x.equals(y)