初始Java简单缓存实例

初始Java简单缓存实例

​ 缓存在很多场景下都是需要使用的。比如在需要一个值的过程和代价特别高的情况下,而且对这个值的需要不止一次的情况下,我们可能就需要考虑使用缓存了。

代码展示

​ 接下来让我们简单用数组实现缓存实例对象。

package Test;
class Student{                        //声明Student类
    private String name;
    private int age;
    Student(String name,int age){       //Student类的构造器
        this.name=name;
        this.age=age;
    }
    public String getName(){           //用于访问类属性的访问器
        return name;
    }
    @Override
    public String toString(){            //重写Object类的toString方法
        return this.name+"的年龄是:"+this.age;
    }
    @Override
  public boolean equals(Object obj){ //重写Object类的equals方法,用于判断两个Student对象是否相等
        if(obj==this)
            return true;
        if(obj!=null && obj.getClass()==Student.class){
            Student student = (Student) obj;
            if(this.getName().equals(student.getName())){
                return true;
            }
        }
        return false;
    }
}
class StudentCache{              //用于缓存Student的类
    private static int MAX_VALUE=10;    //数组的最大空间
    private static StudentCache[] cache = new StudentCache[MAX_VALUE];  //用于缓存的数组
    private static int pos = 0;
    private final Student stu;
    private StudentCache(Student stu){     //定义缓存类的构造器
        this.stu=stu;
    }
    public Student getStudent(){
        return stu;
    }
    public static StudentCache valueof(Student stu){   //用于查找与存储Student的实例对象
        for(int i =0;i<MAX_VALUE;i++){
         if(cache[i]!=null&&cache[i].getStudent().equals(stu)){ //判断数组中是否已存在同一对象
                return cache[i];
            }
        }
        if(pos==MAX_VALUE){    //判断缓存的实例对象是否已经超过了缓存最大值
            cache[0]=new StudentCache(stu);
            pos=1;
        }
        else{
            cache[pos++]=new StudentCache(stu);  //往缓存数组中添加数据
        }
        return cache[pos-1];
    }
}
public class Demo1 {        //测试类
    public static void main(String[] args) {
        Student s1 = new Student("张三",12);
        Student s2 = new Student("张三",20);
        StudentCache v1 = StudentCache.valueof(s1);
        StudentCache v2 = StudentCache.valueof(s2);
        System.out.println(v1==v2);
        System.out.println(v1.getStudent().toString());
        System.out.println(v2.getStudent().toString());
    }
}
/*
输出结果:
true
张三的年龄是:12
张三的年龄是:12
*/

结果分析

  • :为什么“==”判断时会输出true
  • :当“==”作用于两个引用类型数据,只有他们引用同一对象时,才会返回true。
  • :为什么v1与v2会引用同一对象呢
  • :当v1存储时,缓存数组中还没有元素,所以会把数据保存在cache[0]中,当v2存储时,会检查缓存数组,这时发现数组中存有v1,而这两个对象“姓名”相同,“年龄”不同,而我们重写了equals方法,并且规定当“姓名”时,就可以认为这两个数组相同,所以,直接将v2引用变量指向v1指向的内容。

Integer中的缓存

在Integer中同样存在缓存机制。

package Test;

public class Demo2 {
    public static void main(String[] args) {
        Integer i1 = new Integer(6);
        Integer i2 = new Integer(6);
        Integer j1 = Integer.valueOf(6);
        Integer j2 = Integer.valueOf(6);
        System.out.println(i1==i2);
        System.out.println(j1==j2);
    }
}
/*
结果输出:
false
true
*/

结果发现:

当采用valueof()方法创建对象时,会采用缓存的方法创建对象。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值