知识大全 Java进阶 Java中具有实例缓存的不可变类

Posted

篇首语:赋料扬雄敌,诗看子建亲。本文由小常识网(cha138.com)小编为大家整理,主要介绍了知识大全 Java进阶 Java中具有实例缓存的不可变类相关的知识,希望对你有一定的参考价值。

Java进阶 Java中具有实例缓存的不可变类  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!

  不可变类的实例的状态不会变化 这样的实例可以安全地被其他与之关联的对象共享 还可以安全地被多个线程共享 为了节省内存空间 优化程序的性能 应该尽可能地重用不可变类的实例 避免重复创建具有相同属性值的不可变类的实例

  在JDK 的基本类库中 对一些不可变类 如Integer类做了优化 它具有一个实例缓存 用来存放程序中经常使用的Integer实例 JDK 的Integer类新增了一个参数 为int类型的静态工厂方法valueOf(int i) 它的处理流程如下

  if(在实例缓存中存在取值为i的实例)  直接返回这个实例  else  用new语句创建一个取值为i的Integer实例  把这个实例存放在实例缓存中  返回这个实例  

  在以下程序代码中 分别用new语句和Integer类的valueOf(int i)方法来获得Integer实例

  Integer a=new Integer( );  Integer b=new Integer( );  Integer c=Integer valueOf( );  Integer d= Integer valueOf( );  System out println(a==b); //打印false  System out println(a==c); //打印false  System out println(c==d); //打印true

  以上代码共创建了 个Integer对象 每个new语句都会创建一个新的Integer对象 而Integer valueOf( )方法仅在第一次被调用时 创建取值为 的Integer对象 在第二次被调用时 直接从实例缓存中获得它 由此可见 在程序中用valueOf()静态工厂方法获得 Integer对象 可以提高Integer对象的可重用性

  到底如何实现实例的缓存呢?缓存并没有固定的实现方式 完善的缓存实现不仅要考虑何时把实例加入缓存 还要考虑何时把不再使用的实例从缓存中及时清除 以保证有效合理地利用内存空间 一种简单的实现是直接用Java集合来作为实例缓存

  下面的例程 它拥有实例缓存和相应的静态工厂方法valueOf() Name类的实例缓存中可能会加入大量Name对象 为了防止耗尽内存 在实例缓存中存放的是Name对象的软引用(SoftReference) 如果一个对象仅仅持有软引用 Java虚拟机会在内存不足的情况下回收它的内存

  例程 Name java

  import java util Set;  import java util HashSet;  import java util Iterator;  import java lang ref *;  public class Name   …  //实例缓存 存放Name对象的软引用  private static final Set> names=new HashSet>();  public static Name valueOf(String firstname String lastname) //静态工厂方法  Iterator> it=names iterator();  while(it hasNext())  SoftReference ref=it next();//获得软引用  Name name=ref get();//获得软引用所引用的Name对象  if(name!=null&& name firstname equals(firstname)&& name lastname equals(lastname))  return name;    //如果在缓存中不存在Name对象 就创建该对象 并把它的软引用加入到实例缓存  Name name=new Name(firstname lastname);  names add(new SoftReference(name));  return name;    public static void main(String args[])  Name n =Name valueOf( 小红 王 );  Name n =Name valueOf( 小红 王 );  Name n =Name valueOf( 小东 张 );  System out println(n );  System out println(n );  System out println(n );  System out println(n ==n ); //打印true    

cha138/Article/program/Java/hx/201311/27247

相关参考

知识大全 Java进阶 Java应用程序中动态分配CPU资源[1]

Java进阶Java应用程序中动态分配CPU资源[1]  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧

知识大全 Java进阶 Java应用程序中动态分配CPU资源[3]

Java进阶Java应用程序中动态分配CPU资源[3]  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧

知识大全 java里面如何创建一个内部类的实例?

  要想使用new生成一个内部类的实例需要先指向一个外部类的实例也就是先生成外部类的实例因为内部类可以调用外部类的人员成员当没有外部类实例的时候也就没有这些成员的内存空间内部类在实例化的时候调用外部类

知识大全 Java进阶:Java编写通过代理访问的应用程序

Java进阶:Java编写通过代理访问的应用程序  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  

知识大全 Java技术进阶 基于Java的IDEA加密算法探讨

Java技术进阶基于Java的IDEA加密算法探讨  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧! 

知识大全 Java进阶 关于Java Socket编程的详细介绍[2]

Java进阶关于JavaSocket编程的详细介绍[2]  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下

知识大全 Java进阶 关于Java Socket编程的详细介绍[1]

Java进阶关于JavaSocket编程的详细介绍[1]  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下

知识大全 进阶教程——Java网络编程

进阶教程——Java网络编程  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  Java最初是作为一

知识大全 JAVA 可变参数使用

JAVA可变参数使用  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  java增加了新特性可变参数

知识大全 进阶教程——Java性能优化通用篇

进阶教程——Java性能优化通用篇  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  一通用篇  通