java - 疑惑Guava中的Cache是如何做到“直接修改内存副本”的?
PHP中文网
PHP中文网 2017-04-17 11:36:19
[Java讨论组]

刚转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直接返回的引用一样!

谁能给我解释一下呢?

PHP中文网
PHP中文网

认证高级PHP讲师

全部回复(1)
PHPz

这个。。。 你从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
}
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责申明 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送
PHP中文网APP
随时随地碎片化学习
PHP中文网抖音号
发现有趣的

Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号