总结

1-valueOf()缓存使用到设计模式:享元模式

单例模式和享元模式都是为了避免重复创建对象,但是其本质是不一样的:

  • 其实现方式不一样,单例是一个类只有一个唯一的实例,而享元可以有多个实例,只是通过一个共享容器来存储不同的对象。
  • 其使用场景不一样,
    • 单例是强调减少实例化提升性能,因此一般用于一些需要频繁创建和销毁实例化对象或创建和销毁实例化对象非常消耗资源的类中,如连接池、线程池。
    • 享元则是强调共享相同对象或对象属性,节约内存使用空间。

 

2-详细解释

规律:

  • 通过自动装箱Integer i = 1 / Character c = 'p'、或者显示调用valueOf() ,如果在缓存中,就返回同一个对象
  • 如果不在,就new一个新对象返回

 

1.Integer.valueOf缓存范围是[-128,127]

  • 通过integer内部的private static class IntegerCache类的Integer cache[]来缓存
  • 缓存的最小值,不能改变,只能是-128
  • 缓存的最大值,可以通过-XX:AutoBoxCacheMax=<size>来改变。且只有大于127时,改变才有效;配置小于127无效

 

2.Byte,Short,Long类型的缓存范围是[-128,127]

  • 每个包装类都有各自的缓存类ByteCache, ShortCache, LongCache
  • 缓存的上下限,不能改变

 

3.Character缓存[0,127]

  • 缓存类是CharacterCache
  • 缓存的上下限,不能改变

 

4.Double没有缓存,Double.valueOf()都是直接返回new Double (num);

 

5. Boolean缓存TRUE、FALSE, 并没有缓存类。