Java的autobox

目录

 	Integer a = new Integer(1);
        Integer b = new Integer(1);
        System.out.println(a == b); // false
        System.out.println(a == 1); // true
        System.out.println(a .equals(b));   // true


        Integer c = 1;
        Integer d = 1;
        System.out.println(c == d); // true

        Integer e = Integer.valueOf(2883);
        Integer f = Integer.valueOf(2883);

        System.out.println(e == f); // false

        Integer g = 23321;
        Integer h = 23321;
        System.out.println(g == h); // false

今天组里的同学问起Integer能不能直接用==比较,直觉是不行的。但是发现java在autobox的时候,貌似用的是有cache?通过autobox出来的对象是同一个,估计是放在常量池的?Integer.valueOf是把128以内的放在了cache里面,这个倒是比较明确的。

输出字节码,能发现Integer g = 23321; 在生成字节码的时候是:

       126: sipush        23321
       129: invokestatic  #8                  // Method java/lang/Integer.valueOf:(I)Ljava/lang/Integer;
       132: astore        7
       134: sipush        23321
       137: invokestatic  #8                  // Method java/lang/Integer.valueOf:(I)Ljava/lang/Integer;

所以实际上是调用的Integer.valueOf(),因此大于127的自然都是新对象而不是cache了。