下面是相同的实例:
Integer integer1 = 127;
Integer integer2 = 127;
System.out.println(integer1 == integer2); // outputs "true"但这里是不同的实例:
Integer integer1 = 128;
Integer integer2 = 128;
System.out.println(integer1 == integer2); // outputs "false"为什么包装器类要区分这个范围内的对象的大小写?我已经读过JLS 5.1.7 Boxing Conversion了。我的问题是,为什么架构师决定为这个范围进行维护?
发布于 2014-05-15 16:07:30
看一下这个答案https://stackoverflow.com/a/20948389/1897572
只是想知道,为什么在-128和127之间?
可以缓存更大范围的整数,但至少必须缓存-128到127之间的整数,因为它是Java语言规范(强调我的)的强制要求:
如果要装箱的值p是true、false、\u0000到\u007f范围内的字节或字符,或者是-128和\u007f之间的整数或短数
127 (含),则设r1和r2是p的任意两个装箱转换的结果。r1 == r2总是这样。
这项要求的理由在同一段中作了解释:
理想情况下,装箱给定的原始值p将始终产生相同的引用。在实践中,这可能不可行,使用
现有的实现技术。上面的规则是一种务实的妥协。上面的最后一个子句要求始终将某些公共值装箱到无法区分的对象中。..。
这确保了在大多数常见情况下,行为将是所需的行为,而不会造成不适当的性能损失,尤其是
在小型设备上。例如,内存较少的实现可能会缓存-32K到+32K范围内的所有char和short值,以及int和long值。
如何缓存此范围之外的其他值。?
您可以使用Hotspot JVM选项,该选项并未在可用-XX:AutoBoxCacheMax JVM选项列表中真正记录。但是,在Integer类中590行附近的注释中提到了它:
高速缓存的大小可以由-XX:AutoBoxCacheMax=选项控制。
请注意,这是特定于实现的,并且可能在其他JVM上可用,也可能不可用。
发布于 2014-05-15 17:12:22
我搜索了一下,并从其他来源和@nos中发现,就像许多算法在计算中使用小整数一样,因此避免这些值的对象创建开销往往是值得的。
PS :如果任何人想在这个案例背后添加更多的理由,你可以编辑我的答案。这将在以后帮助像我这样的人。
https://stackoverflow.com/questions/23672279
复制相似问题