今天组里的同学问起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了。