首页 > 解决方案 > 多个 HashMap 用于缓存存储,还是一个 HashMap?

问题描述

我对 Java 中的最佳实践和 RAM 使用有疑问。

如果我有对象:

public class UserObject {

    private final UUID uuid;
    private final double wallet;

    public UserObject(UUID uuid, double wallet) {
        this.uuid = uuid;
        this.wallet = wallet;
    }

    public UUID getUuid() {
        return uuid;
    }

    public double getWallet() {
        return wallet;
    }
}

我想从他们的 UUID 和 Wallet 中获取特定的 UserObject 引用。哪个被认为是最佳实践?

备选方案 1:

public class UserManager {

    private final Map<UUID, UserObject> userUUIDMap = new HashMap<>();

    public UserObject getUserByUUID(UUID uuid) {
        return userUUIDMap.get(uuid);
    }

    public UserObject getUserByWallet(double wallet) {
        for(UserObject user : userUUIDMap.values()) {
            if(user.getWallet() == wallet)
                return user;
        }
        return null;
    }

}

备选方案 2(在这种情况下,每个用户的钱包也是唯一的):

public class UserManager {

    private final Map<UUID, UserObject> userUUIDMap = new HashMap<>();
    private final Map<Double, UserObject> userByWallet = new HashMap<>();

    public UserObject getUserByUUID(UUID uuid) {
        return userUUIDMap.get(uuid);
    }

    public UserObject getUserByWallet(double wallet) {
        return userByWallet.get(wallet);
    }
}

在备选方案 2 中,我将在这两种方法中实现 O(1),但是我还需要记住在添加/删除元素时更新两个映射。此外,使用替代方案 2 是否需要更多 RAM?

标签: java

解决方案


在这种情况下,如果您需要能够通过 UUID 和 Wallet 检索您的对象,那么替代 2 将是正确的。的确,您使用了更多内存,但缓存的整个想法是快速访问。因此,当您需要通过钱包检索对象时,第一种选择不会给您。如果您需要节省内存,可以使用一些算法来缩短缓存。例如,仅将经常使用的值保存在缓存中。或者从没有被请求的缓存值中逐出,然后超时等等。


推荐阅读