介绍
享元模式(Flyweight Pattern)主要用于减少创建对象的数量,以减少内存占用和提高性能。
Integer 类
Integer i = new Integer(10)
int i1 = 10;
System.out.println(i==i1);//true
原因很好理解,基本类型不可以比较地址,所以Integer 转成基本类型去比较值。
Integer i1 = 10;
Integer i2 = 10;
System.out.println(i2==i);//true
对于这个比较判断,需要知道的几点,形如:Integer i2 = 10,会自动调用valueof方法。
if (i >= IntegerCache.low && i <= IntegerCache.high)
return IntegerCache.cache[i + (-IntegerCache.low)];
return new Integer(i);
这种申明-128 到127的数会存放到缓冲池,他们就会共用一个内存地址。如果超过的话,就会返回一个Integer 普通对象。
Integer i2 = 200;
Integer i3 = 200;
System.out.println(i2==i3);//false
验证上面,这回产生两个不同的对象。
Integer i = new Integer(10);
Integer i2 = 10;
System.out.println(i2==i);//false
new分配的是在堆空间上,就会和刚才缓冲池的一样了。
String
其实享元模式,在String也有应用,就是字符串常量区。根据上面讲。
String s = "9999";
String s2 = new String("9999");
String s1="9999";
System.out.println(s2==s1);//false 一个是在堆空间,一个是在字符串常量区
System.out.println(s==s1);//true 两种在字符串常量区,指向同一个对象。