自动装箱规则,引擎盖下的内容是什么?

时间:2011-12-29 13:36:39

标签: java autoboxing

我偶然发现了一种非常奇怪的行为found to be a part of java specs。让我把上述帖子中的相关代码

 Integer a = 1000, b = 1000;
        System.out.println(a == b); //Prints false 

        Integer c = 100, d = 100;
        System.out.println(c == d); //Prints true

这与String文字池非常相似,但有一个例外,即它有一个限制。让我再次引用Jon Skeet对前面提到的帖子的回复。

  

如果被加框的值为真,则为false,一个字节,范围内的char   \ u0000到\ u007f,或者介于-128和127之间的int或短号   让r1和r2是p的任意两次拳击转换的结果。它是   总是r1 == r2。

的情况

现在我的问题是,因为我们对字符串文字池没有限制,为什么其他类型不一样?没有这个的设计/性能考虑是什么?有什么办法可以配置吗?

3 个答案:

答案 0 :(得分:2)

  

有什么方法可以配置吗?

阅读我的回答here

答案 1 :(得分:0)

  

因为我们对String Literal Pool没有限制,为什么不对   其他类型相同吗?

因为一组Java类中的字符串文字的数量是有界的,并且可能相当低。相反,动态加框的Integer实例的数量不受限制(嗯,有2 ^ 32个可能的值)。缓存它们会占用数十亿字节的内存,并且会适得其反。

我甚至没有谈论所有其他类型:char,short,long等。

这个简单的程序会导致OutOfMemoryError:

for (int i = 0; i < Integer.MAX_VALUE; i++) {
    Integer.valueOf(i);
}

答案 2 :(得分:0)

从统计学的角度来看,低数字似乎比大数字更常见。正数出现的次数多于负数(所有0到n次循环)。 128对我来说有点低,但1024可以覆盖99.9%的数字。我在数据库支持的企业系统中工作,我从来没有从数据库中获取超过1024行。因此,我的列表中没有一个超过这个大小,并且循环使用它们是大多数使用的数字(如果我使用数字)。无论如何我使用BigDecimal或BigInteger表示的长ID,只有我使用的其他长数字是可搜索的接口的UNID,这是最终的和长的。

我认为大多数开发人员缓存大型Integer对象是不值得的。 此外,您应该使用equals metod而不是==。我从不使用==,除非我正在处理原语。