Java中奇怪的整数装箱

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的值在某个范围内时,是否有一些奇怪的自动装箱规则?这里发生了什么事?


宝慕林4294392
浏览 441回答 3
3回答

白猪掌柜的

这个true实际上,行是由语言规范保证的。从…第5.1.7节:如果被装箱的值p为真、假、字节、\u0000至\u007f范围内的一个字符、或-128至127之间的int或短数,则让r1和r2是p两个装箱转换的结果。r1=r2的情况总是如此。讨论还在继续,这表明尽管您的第二行输出是有保证的,但是第一行没有保证(请参阅下面引用的最后一段):理想情况下,装箱给定的原语值p,总是会产生相同的引用。在实践中,使用现有的实现技术,这可能是不可行的。上述规则是一种务实的妥协。上面的最后一个子句要求某些公共值总是被装箱到不可区分的对象中。实现可能缓存这些,懒惰或急切。对于其他值,此公式不允许程序员对装箱值的标识进行任何假设。这将允许(但不需要)共享部分或所有这些引用。这确保了在大多数常见情况下,行为将是理想的行为,而不会造成不适当的性能损失,特别是在小型设备上。例如,内存有限的实现可能会缓存所有字符和短路,以及-32K-+32K范围内的整数和多头。

ITMISS

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

潇潇雨雨

某些范围内的整数对象(我认为可能是-128到127)被缓存和重用。该范围以外的整数每次都会得到一个新对象。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Java