原理 共享单元 保留一份实例,供不同其他对象复用,减少内存开销 相同对象可以设计成享元,相似对象,也可以将对象中相同的部分(字段),提取出来设计成享元
实现 通过工厂模式通过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