刚转JAVA,接触Guava,所以可能没有把问题描述的过于清楚,请见谅。
Guava中提供了Cache模块,下面的例子让我很困惑:
package me.kazaff;
import com.google.common.cache.CacheBuilder;
import com.google.common.cache.CacheLoader;
import com.google.common.cache.LoadingCache;
import java.util.concurrent.TimeUnit;
public class Main {
public static LoadingCache<String, Person> cache = CacheBuilder.newBuilder()
.maximumSize(1000)
.expireAfterAccess(10, TimeUnit.MINUTES)
.build(new CacheLoader<String, Person>() {
@Override
public Person load(String s) throws Exception {
Person p = new Person();
p.setName(s);
p.setAge(0);
return p;
}
});
public static void main(String[] args) {
try{
Person p = cache.get("kazaff");
p.setName("edisondik"); //直接修改对象
System.out.println("object: " + p.getName());
System.out.println("cache: " + cache.get("kazaff").getName());
}catch (Exception e){
System.out.println(e.getCause());
}
}
}
终端打印:
Object: edisondik
cache: edisondik
可以看到,我并没有在修改完对象后重新保存到缓存中,它是如何做到的?
给我的感觉就好像是cache.get直接返回的引用一样!
谁能给我解释一下呢?
这个。。。 你从cache里拿到的是一个 对象实例的引用,始终指向同一个对象实例。
拿HashMap来存也是一样的。
从cache拿两次得到同一个实例