Flyweight 在JDK中的应用

之所以想到这个问题是在想到Integer是否可以用==来直接比较值,想当然的认为是不可以.不过写了测试程序之后,结果确让我吓了一跳

		Integer a = 10;
		Integer b = 10;
		System.out.println(a==b);

输出的竟然是true, 这个就让我丈二和尚摸不着头脑了, 难道JDK里面重载了Integer的==操作符?.显然不是啊, 清楚的记得jdk中唯一被重载的操作符就只有String的'+'.这个是怎么回事呢, 于是乎看了看上述程序片段对应的字节码. 

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. 果然不出所料~

之前就看过享元模式了,当初咋就没想到这个模式竟然这么有用呢~反省反省


你可能感兴趣的:(jdk,c,String,测试,Integer,编译器)