为什么整数包装器实例的范围为-128到127

时间:2014-05-15 07:53:17

标签: java wrapper

这里他们是同一个实例:

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。我的问题是为什么建筑师决定维持这个范围的案例?

2 个答案:

答案 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:如果有人想在这个套管想法背后添加更多理由,你可以编辑我的答案。这将在以后帮助像我这样的人。