刚转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: edisondikcache: edisondik
可以看到,我并没有在修改完对象后重新保存到缓存中,它是如何做到的?
给我的感觉就好像是cache.get直接返回的引用一样!
谁能给我解释一下呢?
解决方案
这个。。。 你从cache里拿到的是一个 对象实例的引用,始终指向同一个对象实例。
拿HashMap来存也是一样的。
@Testpublic 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拿两次得到同一个实例
@Testpublic void mainTest() throws Exception { Person p = cache.get("kazaff"); Person p1 = cache.get("kazaff"); assertTrue(p == p1); // success}