利用数组作为缓存池实现对象的缓存
来源:互联网 发布:质谱软件 编辑:程序博客网 时间:2024/06/15 09:21
首先在此介绍不可变类的概念,不可变类是指创建了该类的实例以后,该实例的实例变量是不可改变的。在Java中,常见的不可变类有8个基本类型的包装类,以及String类。不可变类的实例状态不可改变,可以很方便地被多个对象所共享。
在日常的工作,如果我们需要使用相同的不可变类实例,那么反复的创建将会加大系统的开销,因此我们可以缓存需要经常用到的对象,以此来节省因重复创建而带来的系统开销。缓存是软件中经常用到的一个模式,缓存的方式有很多种,不同的实现方式可能会存在比较大的性能差别,本次将以数组作为缓存池,实现一个缓存实例的不可变类。
看下面的例子:
/**
* 利用数组作为缓存池实现对象的缓存
* Created by Administrator on 2015/1/31 0031.
*/
class CacheImmutale {
private static final int MAX_SIZE = 10;
private static CacheImmutale[] cacheImmutales = new CacheImmutale[MAX_SIZE];
private static int pos = 0;
private final String name;
public CacheImmutale(String name){
this.name = name;
}
public String getName(){
return name;
}
/**
* 从该方法中得到对象,并且使用数组作为缓存池,
* 缓存之前生成的对象,假如有相同的对象,
* 那么直接从数组中获取该对象并返回
* @param name
* @return
*/
public static CacheImmutale valueOf(String name){
//如果数组中有缓存好的对象,那么直接在缓存池中取出并返回
for(int i =0;i<MAX_SIZE;i++){
if(cacheImmutales[i] != null && cacheImmutales[i].getName().equals(name)){
return cacheImmutales[i];
}
}
/*
如果缓存池存满,把最初存进来的对象替换掉
把pos设置为1,下次的存储从1开始,并且在取对象的时候可以pos-1找到下标
*/
if(pos == MAX_SIZE){
cacheImmutales[0] = new CacheImmutale(name);
pos = 1;
}else{
cacheImmutales[pos++] = new CacheImmutale(name);
}
return cacheImmutales[pos - 1];
}
@Override
public boolean equals(Object obj) {
if(obj == this){
return true;
}
if(obj != null && obj.getClass() == CacheImmutale.class){
CacheImmutale c = (CacheImmutale)obj;
return name.equals(c.getName());
}
return false;
}
@Override
public int hashCode() {
return name.hashCode();
}
}
public class CacheImmutaleTest{
public static void main(String[] args){
CacheImmutale c1 = CacheImmutale.valueOf("hello");
CacheImmutale c2 = CacheImmutale.valueOf("hello");
CacheImmutale c3 = new CacheImmutale("hello");
CacheImmutale c4 = new CacheImmutale("hello");
//c1和c2是缓存池中的同一个对象,因此相等
System.out.println(c1 == c2);
//重写了equals方法,因此c3和c4的equals方法对比也相等
System.out.println(c3.equals(c4));
//但是c3和c4指向的不是同一个对象,因此返回false
System.out.println(c3 == c4);
}
}
输出结果是:
true
true
false
摘自《疯狂Java讲义》
- 利用数组作为缓存池实现对象的缓存
- 利用数组实现缓存实例的不可变类
- Android利用sharedpreferences缓存对象和数组数据与文件传输
- Android利用sharedpreferences缓存对象和数组数据
- 使用走_Unix_Sockets_的_Redis_作为对象缓存
- 利用LinkedHashMap实现的LUR缓存
- 对象缓存 类实现
- PHP 文件缓存数组的实现
- PHP 文件缓存数组的实现
- java对象本地缓存机制的实现
- 利用NSURLProtocol实现webView缓存
- 利用ReentrantReadWriteLock实现缓存系统
- 利用Ajax实现分页缓存
- 对象的强、软、弱和虚引用 利用软引用实现java对象的高缓存
- 利用Spring aop 自带的ehcache来缓存对象
- java对象的缓存
- 使用数组实现缓存例子
- Glide作为图片缓存,清除缓存的合理方法
- POJ 2337 Catenyms (有向图欧拉通路)
- C#操作配置文件(一)
- 架构师
- C#操作配置文件(二)
- uva 10759(数论)
- 利用数组作为缓存池实现对象的缓存
- 深入解析NoSQL数据库的分布式算法
- pip 在windows下的更新升级
- 刷新和加载
- 【HDOJ 2031】 进制转换
- 在已有Windows 7/8/8.1的PC上装Ubuntu14.04双系统的安装指南及常见问题
- 调用Android系统相册并裁剪图片
- python win32 Workbooks.Open path error
- Zookeeper(一)简介