11享元模式

原理

共享单元
保留一份实例,供不同其他对象复用,减少内存开销
相同对象可以设计成享元,相似对象,也可以将对象中相同的部分(字段),提取出来设计成享元

实现

通过工厂模式通过Map或Listh缓存创建好的享元

享元模式 VS 单例、缓存、对象池

虽然都有复用但实际概念不同

单例,多例:为了控制实例个数
缓存:提高访问效率
池资源:减少创建释放开销

享元模式在Integer中的应用

1
2
3
4
5
6
Integer i1 = 56;
Integer i2 = 56;
Integer i3 = 129;
Integer i4 = 129;
System.out.println(i1 == i2);
System.out.println(i3 == i4);

输出结果:true false

要点:自动装箱,==比较引用地址

1
2
3
4
5
6
7
8
9
10
Integer i1 = 56; -->> Integer i1 = Integer.valueOf(56);

public static Integer valueOf(int i) {
if (i >= IntegerCache.low && i <= IntegerCache.high)
return IntegerCache.cache[i + (-IntegerCache.low)];
return new Integer(i);
}

IntegerCache类加载时默认缓存-128~127
所以56装箱后是同一个对象,被缓存了;129没有被缓存是不同对象

享元模式在String中的应用

1
2
3
4
5
String s1 = "小争哥";
String s2 = "小争哥";
String s3 = new String("小争哥");
System.out.println(s1 == s2);
System.out.println(s1 == s3);

输出结果:true,false