为了账号安全,请及时绑定邮箱和手机立即绑定

Java中奇怪的整数装箱

Java中奇怪的整数装箱

宝慕林4294392 2019-06-15 18:03:48
Java中奇怪的整数装箱我刚刚看到了类似这样的代码:public class Scratch{     public static void main(String[] args)     {         Integer a = 1000, b = 1000;         System.out.println(a == b);         Integer c = 100, d = 100;         System.out.println(c == d);     }}运行时,这段代码将打印出来:falsetrue我明白为什么第一个是false因为这两个对象是单独的对象,所以==比较引用。但我不知道为什么第二条语句会回来true?当Integer的值在某个范围内时,是否有一些奇怪的自动装箱规则?这里发生了什么事?
查看完整描述

3 回答

?
白猪掌柜的

TA贡献1893条经验 获得超10个赞

这个true实际上,行是由语言规范保证的。从…第5.1.7节:

如果被装箱的值p为真、假、字节、\u0000至\u007f范围内的一个字符、或-128至127之间的int或短数,则让r1和r2是p两个装箱转换的结果。r1=r2的情况总是如此。

讨论还在继续,这表明尽管您的第二行输出是有保证的,但是第一行没有保证(请参阅下面引用的最后一段):

理想情况下,装箱给定的原语值p,总是会产生相同的引用。在实践中,使用现有的实现技术,这可能是不可行的。上述规则是一种务实的妥协。上面的最后一个子句要求某些公共值总是被装箱到不可区分的对象中。实现可能缓存这些,懒惰或急切。

对于其他值,此公式不允许程序员对装箱值的标识进行任何假设。这将允许(但不需要)共享部分或所有这些引用。

这确保了在大多数常见情况下,行为将是理想的行为,而不会造成不适当的性能损失,特别是在小型设备上。例如,内存有限的实现可能会缓存所有字符和短路,以及-32K-+32K范围内的整数和多头。


查看完整回答
反对 回复 2019-06-15
?
ITMISS

TA贡献1871条经验 获得超8个赞

public class Scratch{
   public static void main(String[] args)
    {
        Integer a = 1000, b = 1000;  //1
        System.out.println(a == b);

        Integer c = 100, d = 100;  //2
        System.out.println(c == d);
   }}

产出:

falsetrue

是的,第一个输出是为了比较引用;‘a’和‘b’-这是两个不同的引用。在第1点中,实际上创建了两个引用,类似于-

Integer a = new Integer(1000);Integer b = new Integer(1000);

产生第二个输出是因为JVM尝试节省内存,当Integer跌落在一个范围内(从-128到127)。在第2点,没有为‘d’创建新的Integer类型引用。它不是为Integer类型引用变量‘d’创建一个新的对象,而是只分配由‘c’引用的先前创建的对象。所有这些都是由JVM.

这些内存保存规则不仅适用于Integer。为了节省内存,以下包装器对象的两个实例(通过装箱创建)总是=它们的原始值相同的地方-

  • 布尔型
  • 字节
  • 零万

    \u007f

    (小数点7F为127)
  • 短小和整数

    -128

    127


查看完整回答
反对 回复 2019-06-15
?
潇潇雨雨

TA贡献1833条经验 获得超4个赞

某些范围内的整数对象(我认为可能是-128到127)被缓存和重用。该范围以外的整数每次都会得到一个新对象。


查看完整回答
反对 回复 2019-06-15
  • 3 回答
  • 0 关注
  • 440 浏览

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号