【问题标题】:Autoboxing Question [duplicate]自动装箱问题[重复]
【发布时间】:2011-07-27 16:21:34
【问题描述】:

可能重复:
Wrapper class and == operator

当我学习自动装箱时,在一个网站上看到了这段代码..

Integer i1 = 1;  
Integer i2 = 1;  
// true 
System.out.println(i1 == i2);  


Integer i3 = -200;  
Integer i4 = -200;  
// false
System.out.println(i3 == i4);   

我可以理解为什么第二次比较给出错误(它的比较参考)。但是为什么第一个是真实的呢?

【问题讨论】:

标签: java autoboxing


【解决方案1】:

因为前几个Integer 对象(准确地说是从-128 到127,包括)被JVM 缓存和重用,所以i1i2 是对同一个物理对象的引用。

LongShortByte 顺便说一句,这也是如此。更详细的解释见this article

【讨论】:

  • 您能进一步解释一下吗?如果缓存了前几个 Integer 对象,为什么 i3 和 i4 不指向同一个物理对象?
  • @Kyle,用更多细节和文章参考扩展了我的答案。
  • 是否缓存了其他类的对象,如字符串(因为我刚刚尝试了“a”==“a”..它给了我真实的结果)?你能指点我一篇文章或与缓存相关的东西吗?
  • @raj:这是 string literals 被拘留的情况。再次,请参阅规范 - 如果您愿意,我可以找到一个部分编号。
  • 谢谢..我刚下载完..
【解决方案2】:

装箱保证对一系列值使用相同的缓存对象。

JVM可以使用更大的缓存,但不能保证。来自JLSsection 5.1.7

如果被装箱的值 p 是 true、false、一个字节、一个在 \u0000 到 \u007f 范围内的字符,或者一个介于 -128 和 127 之间的 int 或 short 数,那么让 r1 和 r2 是任意的结果p的两次拳击转换。 r1 == r2 总是如此。

【讨论】:

  • 整数文档says可能会缓存频繁请求的值。
  • @Brian:确实。只是不能保证除了规范中的值。
  • +1: Long 在 Sun/Oracle JVM 中也有一个缓存值 -128 到 127,尽管它没有被提及。
猜你喜欢
  • 2018-06-20
  • 1970-01-01
  • 2011-05-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-07-29
  • 2011-05-29
相关资源
最近更新 更多