这里他们是同一个实例:
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。我的问题是为什么建筑师决定维持这个范围的案例?
答案 0 :(得分:1)
查看此答案https://stackoverflow.com/a/20948389/1897572
只是想知道,为什么介于-128和127之间?
可以缓存更大范围的整数,但至少可以缓存这些整数 必须缓存-128和127,因为它是由Java语言规范强调的(强调我的):
If the value p being boxed is true, false, a byte, or a char in the range \u0000 to \u007f, or an int or short number between -128 and
127(含),然后让r1和r2成为任意两个拳击的结果 转换p。始终是r1 == r2。
的情况此要求的基本原理在同一段中解释:
Ideally, boxing a given primitive value p, would always yield an identical reference. In practice, this may not be feasible using
现有的实施技术。上述规则是务实的 妥协。上面的最后一个条款要求某些共同的价值 总是被装入无法区分的物体。 [...]
This ensures that in most common cases, the behavior will be the desired one, without imposing an undue performance penalty, especially
在小型设备上。对于内存限制较少的实现可能 例如,缓存所有char和short值,以及int和long 值范围为-32K至+ 32K。
如何缓存此范围之外的其他值。?
您可以使用-XX:AutoBoxCacheMax JVM选项,但实际上并非如此 记录在可用的Hotspot JVM选项列表中。不过确实如此 在第590行的Integer类中的注释中提到:
The size of the cache may be controlled by the -XX:AutoBoxCacheMax=<size> option.
请注意,这是特定于实现的,可能会也可能不会 可以在其他JVM上使用。
答案 1 :(得分:0)
我搜索了这个并从其他来源和@nos中发现,就像许多算法在计算中使用小整数一样,因此避免这些值的对象创建开销往往是值得的。
PS:如果有人想在这个套管想法背后添加更多理由,你可以编辑我的答案。这将在以后帮助像我这样的人。