java 缓存设计,实现一个缓存实例的不可变类

it2024-07-16  39

package final_test; //缓存,对应理解包装类Integer public class CacheImmutate { private static int MAX_SIZE=3; //使用数组来缓存已有的实例 private static CacheImmutate[] cache=new CacheImmutate[MAX_SIZE]; //记录缓存实例在缓存中的位置,cache[pos-1]是最新缓存的实例 private static int pos=0; private final String name; private CacheImmutate(String name) { this.name=name; } public String getName() { return this.name; } //静态方法 返回值是该对象 传参:字符串name public static CacheImmutate valueOf(String name) { //遍历已经缓存的对象 for(int i=0;i < cache.length;i++) { //如果缓存中已有相同的实例,则直接返回该缓存的实例 if(cache[i] != null && cache[i].getName().equals(name)) { return cache[i]; } } //下面是缓存中没有,就添加到缓存中,缓存满了就将最新的替换掉最旧的,最新的是cache[pos-1] //如果缓存池已满,清空 if(pos == MAX_SIZE) { //把缓存的第一个对象覆盖,即把刚刚生成的对象放在缓存池的最开始位置 cache[0] = new CacheImmutate(name); pos=1; System.out.println("缓存已满覆盖"); } else { cache[pos++] = new CacheImmutate(name); System.out.println("缓存没有满,存入"); } return cache[pos-1]; } //重写equals方法 public boolean equals(Object obj) { if(this == obj) { return true; } if(obj != null && obj.getClass() == CacheImmutate.class) { CacheImmutate ci=(CacheImmutate)obj; return (name.equals(ci.getName())); } return false; } //重写hashcode方法 public int hashCode() { return name.hashCode(); } public static void main(String[] args) { CacheImmutate c1=CacheImmutate.valueOf("hello1"); System.out.println(c1.getName()); CacheImmutate c2=CacheImmutate.valueOf("hello2"); System.out.println(c2.getName()); //这里缓存里面有,取得到,由于缓存也没有满,也没有清空,所以这里就是直接在缓存中取得的 CacheImmutate c7=CacheImmutate.valueOf("hello2"); System.out.println(c2 == c7); CacheImmutate c3=CacheImmutate.valueOf("hello3"); System.out.println(c3.getName()); CacheImmutate c4=CacheImmutate.valueOf("hello4"); System.out.println(c4.getName()); CacheImmutate c5=CacheImmutate.valueOf("hello5"); System.out.println(c5.getName()); //由于缓存已经被清空,所以这里就不会从缓存中取得,取也取不到,就只能新建,与第一个地址就不同了 CacheImmutate c6=CacheImmutate.valueOf("hello1"); System.out.println(c1 == c6); } }
最新回复(0)