Java 9的一个新特性是取消包装器对象的构造函数。创建新包装器对象的唯一方法是使用它们的valueOf()静态方法。例如,对于Integer对象,Integer.valueOf为-128到127之间的值实现了一个缓存,并在每次调用它时返回相同的引用。
正如Integer类的API所指出的,“静态工厂valueOf(int)通常是一个更好的选择,因为它可能产生更好的空间和时间性能。”JLS说:“给定对应的原语类型的值,通常不需要构造这些box类的新实例。建议的构造替代方法是自动装箱或valueOf静态工厂方法。在大多数情况下,自动装箱将有效,因此可以在需要box类的位置使用其类型为原语的表达式。”
但是,这个范围之外的值会发生什么呢?例如,每次执行类时,Integer = Integer.valueOf(456)是一个新对象吗?
发布于 2017-11-22 12:36:12
两者都有
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。
发布于 2017-11-22 13:33:25
首先,为什么要费心处理这些细节--比较Integer对象的正确方法是使用以下两种方法:
if (x.intValue() == y.intValue())或更好的x.equals(y)
不要依赖于在任何情况下都存在缓存这一事实,因为可以将此缓存的上限更改为属性,您可以通过以下方法查看它:
java -XX:+PrintFlagsFinal | grep AutoBoxCacheMaxhttps://stackoverflow.com/questions/47434850
复制相似问题