之所以想到这个问题是在想到Integer是否可以用==来直接比较值,想当然的认为是不可以.不过写了测试程序之后,结果确让我吓了一跳
Integer a = 10; Integer b = 10; System.out.println(a==b);
line3 : bipush 10 invokestatic java.lang.Integer java.lang.Integer.valueOf(int) astore_2 line9 : bipush 10 invokestatic java.lang.Integer java.lang.Integer.valueOf(int) astore_3
哈哈,原来int值被编译器转为了Integer.valueOf(int)来进行装箱操作,问题肯定出在Integer.valueOf(int)方法上,于是就看了看jdk的Integer源代码
public static Integer valueOf(int i) { if(i >= -128 && i <= IntegerCache.high) return IntegerCache.cache[i + 128]; else return new Integer(i); }这就可以解释刚才的现象了,原来valueOf使用了Flyweight模式的机理来返回Integer对象, 即缓存[-128,127]中的所有数,因为这些数经常被用到,使用缓存可以避免多余的空间浪费(哈哈,怎么感觉有点像lazy load呢)
于是自己又写了个测试来进行验证
public static void main(String args[]){ Integer a = 127; Integer b = 127; System.out.println(a==b); Integer i = 128; Integer j = 128; System.out.println(i==j);//false Integer c = new Integer(10); Integer d = new Integer(10); System.out.println(c==d);//false }输出为 true , false , false. 果然不出所料~
之前就看过享元模式了,当初咋就没想到这个模式竟然这么有用呢~反省反省