一. 概念
jvm的众多池就是利用了享元模式。如串池、IntegerCache等。以及线程池、连接池。
二. 组成
内部状态:抽象享元模式、具体享元
外部状态:非享元
三. 案例
通过实现单例工厂,并在工厂中预先放置具体享元(HashMap存放),且不开放更改HashMap的接口。
四. 优缺点
五. IntegerCache与自动装箱拆箱
首先明确,这是两个截然不同的概念。所谓自动装箱是自动将int类型转变为Integer类型。
有三种情况触发自动装箱,
- Integer a = 10000; //int = 赋值给Integer
- method(10000) //int作为方法形参
- ArrayList.add(10000) //Collection集合类添加int元素
注意new Integer的方式不会触发装箱。
可以通过valueOf方法实现手动装箱。
对于IntegerCache而言,Integer对象对-128到127之间的数值进行了预缓存。在任何装箱操作时,都会尝试获取缓存作为Integer变量的指向。如果获取不到才会尝试去new一个Integer对象。
实际上自动装箱操作的底层都是调用valueOf方法。
注意:装箱没有数值范围限制,任何范围都可以装箱。