Guava中提供了Cache模块,下面的例子让我很困惑:
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来存也是一样的。
@Test
public void dfasdf(){
Map<String, Person> map = new HashMap<>();
Person kazaff = new Person();
kazaff.setName("kazaff");
map.put("kazaff", kazaff);
Person p = map.get("kazaff");
p.setName("edisondik");
System.out.println(map.get("kazaff").getName()); //get 'edisondik'
}
从cache拿两次得到同一个实例
@Test
public void mainTest() throws Exception {
Person p = cache.get("kazaff");
Person p1 = cache.get("kazaff");
assertTrue(p == p1); // success
}