Weird Integer boxing in Java

前端 未结 12 1955
广开言路
广开言路 2020-11-22 00:15

I just saw code similar to this:

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


        
12条回答
  •  盖世英雄少女心
    2020-11-22 00:53

    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);
       }
    }
    

    Output:

    false
    true
    

    Yep the first output is produced for comparing reference; 'a' and 'b' - these are two different reference. In point 1, actually two references are created which is similar as -

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

    The second output is produced because the JVM tries to save memory, when the Integer falls in a range (from -128 to 127). At point 2 no new reference of type Integer is created for 'd'. Instead of creating a new object for the Integer type reference variable 'd', it only assigned with previously created object referenced by 'c'. All of these are done by JVM.

    These memory saving rules are not only for Integer. for memory saving purpose, two instances of the following wrapper objects (while created through boxing), will always be == where their primitive values are the same -

    • Boolean
    • Byte
    • Character from \u0000 to \u007f (7f is 127 in decimal)
    • Short and Integer from -128 to 127

提交回复
热议问题