java - 多个 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?
解决方案
在这种情况下,如果您需要能够通过 UUID 和 Wallet 检索您的对象,那么替代 2 将是正确的。的确,您使用了更多内存,但缓存的整个想法是快速访问。因此,当您需要通过钱包检索对象时,第一种选择不会给您。如果您需要节省内存,可以使用一些算法来缩短缓存。例如,仅将经常使用的值保存在缓存中。或者从没有被请求的缓存值中逐出,然后超时等等。
推荐阅读
- r - 使用 fct_relevel 按组重新排序因子仅更改第一组中的因子顺序
- cakephp - 在 CakePHP 3x 中根据城市显示数据
- sql - 列的不同数据源
- html - 不能让这些 div 内联显示?
- python - 在 Django 中训练 AI 模型,如何以 JSON 格式返回结果?
- python - django、node js、php网站托管和域信息
- java - 如何平均 ArrayList 中的内容?
- python - 如何使用正则表达式查询 pymongo 以获取仅包含数字的值
- python - Django URLField ErrorDetail“请输入有效的URL”
- python - 不能腌制生成器对象