当前位置: 首页 > 面试题库 >

Java中用于记忆的不同技术有哪些?

宗政卓
2023-03-14
问题内容

我知道这一个http://onjava.com/pub/a/onjava/2003/08/20/memoization.html,但是还有别的吗?


问题答案:

使用普通的简单类型安全Java来进行记忆也很容易。

您可以使用以下可重复使用的类从头开始。

我将它们用作缓存,其寿命是Web应用程序上的请求。

当然,MapMaker如果您需要驱逐策略或更多功能(例如同步),请使用Guava 。

如果您需要记住一个带有许多参数的方法,只需将两种方法都将参数放在一个列表中,然后将该列表作为单个参数传递即可。

abstract public class Memoize0<V> {
    //the memory
    private V value;
    public V get() {
        if (value == null) {
            value = calc();
        }
        return value;
    }
    /**
     * will implement the calculation that 
     * is to be remembered thanks to this class
     */
    public abstract V calc();
}

abstract public class Memoize1<P, V> {
    //The memory, it maps one calculation parameter to one calculation result
    private Map<P, V> values = new HashMap<P, V>();

    public V get(P p) {
        if (!values.containsKey(p)) {
            values.put(p, calc(p));
        }
        return values.get(p);
    }

    /**
     * Will implement the calculations that are
     * to be remembered thanks to this class
     * (one calculation per distinct parameter)
     */
    public abstract V calc(P p);
 }

这是这样使用的

    Memoize0<String> configProvider = new Memoize0<String>() {
        @Override
        public String calc() {
            return fetchConfigFromVerySlowDatabase();
        }
    };
    final String config = configProvider.get();

    Memoize1<Long, String> usernameProvider = new Memoize1<Long, String>() {
        @Override
        public String calc(Long id) {
            return fetchUsernameFromVerySlowDatabase(id);
        }
    };
    final String username = usernameProvider.get(123L);


 类似资料:
  • 请问,用于解耦的技术有哪些? 比如: 1、暴露扩展点的方式,可以将依赖关系反转 是否还有哪些技术可以实现解耦合呢?

  • 研发岗一面群面是什么东西啊,没搞懂,有自我介绍,专业相关领域前景,追问深一点的了解,对记忆科技的了解,产品,规划什么的理解建议。摆烂了,随便面了,应该无了#面经##秋招#

  • 问题内容: 我想使用Java开发Web应用程序。但是我很困惑所有这些不同的技术是什么以及它们如何协同工作: HTTP 的HTML 的CSS Java脚本 jQuery的 网络容器 小程序 JSP JSTL 表达语言(EL) 在网上可以找到关于这些主题的大量资源,并且每个主题似乎都需要阅读几本书才能理解。您可以解释这些技术,以便在开始开发Web应用程序时对它们有一个基本的了解吗? 问题答案: 请注意

  • 这个问题以前可能已经回答过了,但是由于这个问题的复杂性,我需要一个确认。所以我重新措辞这个问题 问题1:当一个线程进入一个同步块时,内存屏障将包括被触摸的任何字段,而不仅仅是我同步的对象的字段?因此,如果在一个同步块中修改了许多对象,那么在线程内存缓存之间会有大量内存移动。 问题 2 : 在线程 1 中隐式地是“发生前”关系的一部分? 我希望是这样,但可能不是这样。如果没有,有没有一个技巧可以让它

  • 我们正在使用Firebase Firestore进行数据存储。当用户创建一个新房间时,我们希望引用易于记忆,这样一个用户就可以与其他用户共享房间ID/代码。 目前Firestore将创建一个唯一的引用,如:DvfTMYED5cWdo5qIraZg 这太长了,很难记住或分享。我们可以手动设置不同的引用,但它们必须是唯一的。另一点是,用户可以创建多个房间,因此每次都必须更改引用。 有没有办法为这个用例

  • java和spring MVC/spring Boot中有哪些不同的客户端可用于弹性搜索?它们之间的区别和各自的优点是什么?哪一个更好地与spring boot一起用于查询和源代码过滤?