7、缓存、不可变类
来源:互联网 发布:java模板引擎 编辑:程序博客网 时间:2024/05/22 16:14
不可变类的实例不可改变(变量全是private,只有getter没有setter),这种类的实例经常被多个对象使用,所以做成缓存可以提高性能。
class cacheImmu{private static int MAX_SIZE = 10;private static int pos = 0;//当前将要存放的位置private static cacheImmu[] cache = new cacheImmu[MAX_SIZE];private final String name;private cacheImmu(String name){this.name = name;}public static cacheImmu createImmutale(String name){for(int i = 0; i<MAX_SIZE; i++){if(cache[i] != null && cache[i].name.equals(name))//检查是否已经存在同名实例{return cache[i];}}if(pos == MAX_SIZE)//如果pos=10即表示0到9已存满,所以从0开始从头覆盖{pos = 0;}cache[pos++] = new cacheImmu(name);return cache[pos - 1];}public boolean equals(Object obj){if(this == obj){return true;}if(obj != null && obj.getClass() == cacheImmu.class){cacheImmu cachetemp = (cacheImmu)obj;return this.name.equals(cachetemp);}return false;}public int hashCode(){return name.hashCode();}}public class CacheImmutale{public static void main(String[] args){cacheImmu c1 = cacheImmu.createImmutale("immu1");cacheImmu c2 = cacheImmu.createImmutale("immu1");System.out.println(c1 == c2);}}
结果输出true,c1和c2引用(指向)的是同一个实例。
这个类只有一个变量name,即是唯一的标识。
要注意一些细节:首先,判断是否已经存在相同name的实例时,必须判断cache[i]是否为空,而且必须用短路的与(&&)因为在第一次存满之前都是空的,如果为空则执行
cache[i].name.equals(name)会出错。
最开始写了一个错误的
<pre name="code" class="java">class cacheImmutale{private static int MAX_SIZE = 10;private static int pos = 0;private static cacheImmutale[] cache = new cacheImmutale[MAX_SIZE];private final String name;private cacheImmutale(String name){this.name = name;}public static cacheImmutale createImmutale(String name){for(int i = 0; i<MAX_SIZE; i++){if(name == cache[i].name){return cache[i];}}this(name);pos++;}}
就是没有判断cache[i]是否为空。同时
if(name == cache[i].name)也是不可以的,这里要判断的是字符串是否一样,应该用equals。
第二个问题是
<span style="font-family: Arial, Helvetica, sans-serif;">this(name);</span>
错误提示告诉我,用this()来调用自己的构造器,只能在另一个构造器中的第一行。而且单单写一个this(name),没有返回实例,也是没用的。
0 0
- 7、缓存、不可变类
- 不可变类的缓存
- 缓存实例的不可变类
- 缓存实例的不可变类
- java 不可变类 缓存实例
- 缓存实例的不可变类
- java 不可变类 缓存实例
- 缓存实例的不可变类
- java 不可变类 缓存实例
- 缓存不可变类的实例
- 缓存实例的不可变类:
- Java_final关键字,不可变类,缓存不可变类实例(缓存池技术)
- Java_final关键字,不可变类,缓存不可变类实例(缓存池技术)
- 6.4.7 不可变类
- 缓存不可变类实例的不可变类【参考疯狂Java讲义】
- JAVA中具有实例缓存的不可变类
- JAVA中具有实例缓存的不可变类
- java一个实现实例缓存的不可变类
- Qt基本特性
- KNN算法详解
- Struts2.0国际化
- Cocos2d-JS屏幕适配(NO-BORDER模式)
- 保持边缘的滤波函数————Guided Image Filtering
- 7、缓存、不可变类
- 第3周项目找对象--三角形类
- iOS开发中 常用的SQLite函数
- 新技术再次提升了Chrome的JavaScript载入效率
- 【数位DP】POJ 3252 Round Numbers
- JavaWeb中的绝对路径和相对路径问题
- PocketSphinx语音识别系统的编译、安装和使用
- cocos2dx --- 按钮点击居中放大
- POJ 1504 Adding Reversed Numbers