注册 登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

等待机遇

这个世界上没有人知道自己到底想要什么,就等着别人来告诉他们。

 
 
 

日志

 
 
关于我

>>>>>>>>>>Apple Watch开发交流群: 313347946 >>>>>>>>>>Android Wear开发交流群:318275279 >>>>>>>>>>>>>智能手表开发者服务平台: http://www.openwatch.cn

网易考拉推荐

Wrap类的享元模式  

2014-03-17 17:13:22|  分类: Java |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |

//享元模式
/**(
看jdk源码可以发现 其他包装器类的内部缓存原理与Integer类的一样

 *  当基本正数数据类型在装箱为Integer类型时,-128~127之间的数字装箱后会被缓存起来,当下次对同样的数字装箱时
 *  两个Integer对象是相等的,即指向同一块内存,而当数字超过127后,自动装箱后不会被缓存,再次装箱同样大于127的数字时
 *  两个Integer对象是不相等的。
 *  
 *  以上事例就是通常所说的享元设计模式,对于那些非常小但是又需要在系统的很多地方都需要用到它的时候,我们需要把它
 *  缓存起来,以便下次再次使用,减少了创建对象的开销。
 * 对于基本数据类型的常量如 int i=2,则也会被缓存在jvm的常量池中
 * 
 */
public class Test {

 /**
  * @param args
  */
 public static void main(String[] args) {
  // TODO Auto-generated method stub
  
  Integer a1 = new Integer(4);
  Integer a2 = new Integer(4);
  System.out.println(a1 == a2); //false
  
  
  Integer i1 = 13;
  Integer i2 = 13;
  System.out.println(i1 == i2); //true
  
  
  
  Integer i3 = 128;
  Integer i4 = 128;
  
  System.out.println(i3 == i4); //false
  
  Integer i5 = Integer.valueOf(3);
  Integer i6 = Integer.valueOf(3);
  System.out.println(i5 == i6); //true
  
  Integer i7 = Integer.valueOf(127);
  Integer i8 = Integer.valueOf(127);
  System.out.println(i7 == i8); //true
 

 }

}



在java中有一种 模式叫做 装箱 和拆箱       flyweight 享元模式

例如 

Integer  i= 55    ;      //那么自动把55 装箱成 Integer  对象  
System.out.println(i) ;  //自动拆箱 将Integer对象拆箱成 int型变量 输出  

 

Integer  i1= 55    ; 
Integer  i2= 55    ; 
Integer  j1= 355    ; 
Integer  j2= 355    ;  

i1==i2    ;//结果为 true  
j1==j2 ;//结果为false      

原因是Java的享元模式 ,-128-127之间的数值 会存在 一个 缓存池中,下次使用的时候 先从缓存池中 取出 这个数据 ,而不会去分配它的内存  。
只有  一个字节以内的  数据才会存在缓存池中 。  
比如word中 我们输入 多个   aaaaa那么 如果为每个a分配一个 内存空间 那么 内存的浪费 很严重 ,这种享元模式
就是在使用的地方引用 同一个 数据 ,就是属性相同的 一字节以内的小对象  引用同一个对象 


不仅在自动拆箱和装箱中会有上述结果 就算我们自己手工创建的对象也有 享元模式 

Integer i1=Integer.valueOf(333);
Integer i2=Integer.valueOf(333) ;
i1==i2 ;//false  只有-128-127之间的数据才可以利用享元模式


Integer i = new Integer(1);
Integer i1 = 1;
int i2 = new Integer(1);



System.out.println(i == i1);
System.out.println(i == i2 );
System.out.println(i1 == i2 );


false
true
true

  评论这张
 
阅读(162)| 评论(0)
推荐 转载

历史上的今天

在LOFTER的更多文章

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2017