20180326 java java面向对象-包装类中的缓存设计(享元模式)

20180326 java java面向对象-包装类中的缓存设计(享元模式)




eg:


//包装类中的缓存设计
class CacheDemo
{
  public static void main()
  {




    Integer i1 = new Integer(123);
    Integer i2 = new Integer(123);


    System.out.println(i1 == i2);  //输出false
    //每new一个对象,就新增加一个地址,对于引用类型比较,
    //比较的就是地址




    Integer i3 = Integer.valueOf(123);
    Integer i4 = Integer.valueOf(123);//123在[-128,127]之间,所取的
                                      //数据就是缓存中的数据,并没有开辟新的内                                      //存空间, 详情解释见下面的
                                      //"Integer的valueOf内部函数(源代码)"


    System.out.println(i3 == i4);//输出true




    Integer i5 = 123;
    Integer i6 = 123;自动装箱的底层就是通过Integer.valueOf实现的,解释同上


    System.out.println(i5 == i6);//输出true




/**************************分割线**********************************/


    Integer i7 = new Integer(456);
    Integer i8 = new Integer(456);


    System.out.println(i7 == i8);  //输出false
 




    Integer i9 = Integer.valueOf(456);
    Integer i10 = Integer.valueOf(456);//456不在[-128,127]之间,就不能使用
                                      //缓存的数据,所以要new一个新的数据空间


    System.out.println(i9 == i10);//输出false


    Integer i11 = 456;
    Integer i12 = 456;//自动装箱的底层就是通过Integer.valueOf实现的,解释同上


    System.out.println(i11 == i12);//输出false


  }
}














Integer的valueOf内部函数(源代码):
public static Integer valueOf(int i){
  assert IntegerCache.high >=127;
  if(i >= IntegerCache.low && i<= IntegerCache.high)
    return IntegerCache.cache[i + (-IntegerCache.low)];
  return new Integer(i);
}


IntegerCache是Integer的一个内部类,表示Integer的缓存。缓存的范围是[-128,127],即IntegerCache.low = -128,IntegerCache.high = 127












java语言中的静态代码块,即由static修饰的一段代码块是加载资源,做初始化操作的代码块,eg:
static {
  int high = 3;
  ...
}


包装类的设计(这种设计在java中,又叫享元模式(flyweight )):
1)Byte、Short、Integer、Long均的缓存[-128,127]区间的数据;
2)Character缓存(0,127]区间的数据.


享元模式:Flyweight Pattern,设计原理就是缓存设计,一个元素让大家共用,共用的目的就是节省内存空间,提高性能。












为了防止出现以下情况:


    Integer i11 = 456;
    Integer i12 = 456;//自动装箱的底层就是通过Integer.valueOf实现的,解释同上


    System.out.println(i11 == i12);//输出false


即i11 与 i12 不等的情况,可用 equals()函数 处理(equals()函数内部是通过数值进行的比较),即:


    Integer i11 = 456;
    Integer i12 = 456;


    System.out.println(i11.equals(i12));//输出true












/***************************************************************/
/****         强烈建议,以后包装类型对象之间的               ***/
/****            比较,使用equals()函数比较                  ***/
/***************************************************************/


equals()函数比较的是包装的数据。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值