我偶然发现了一种非常奇怪的行为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。
的情况
现在我的问题是,因为我们对字符串文字池没有限制,为什么其他类型不一样?没有这个的设计/性能考虑是什么?有什么办法可以配置吗?
答案 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而不是==
。我从不使用==
,除非我正在处理原语。