java - 具有多个值的 Java 映射:容器类还是多个映射?
问题描述
我正在尝试创建一个映射,其中 UUID 键指向一个对象(例如某个User
类实例)和有关该对象的辅助信息(例如 anint
和 a String
)。有两个明显的实现:
import java.util.Map;
import java.util.HashMap;
import java.util.UUID;
...
Map<UUID, User> main = new HashMap<UUID, User>();
Map<UUID, Integer> aux1 = new HashMap<UUID, Integer>();
Map<UUID, String> aux2 = new HashMap<UUID, String>();
或者
import java.util.Map;
import java.util.HashMap;
import java.util.UUID;
...
private static class UserInfo { // Nested class
public final User user;
public final int aux1;
public final String aux2;
public UserInfo(User user, int aux1, String aux2) {
this.user = user;
this.aux1 = aux1;
this.aux2 = aux2;
}
}
...
Map<UUID, UserInfo> main = new HashMap<UUID, UserInfo>();
就效率和内存使用而言,通常认为哪个性能更高?还是有更有价值的第三种选择?
解决方案
对于内存和效率,我相信第二种选择是更好的解决方案。第一个解决方案是创建更多Maps
使用内存的内容,并存储UUID
使用内存的相同内容。
它对于可维护性和可读性也更好,除非毫秒级的性能很关键,否则它们是更重要的。如果您将相关信息捆绑在一起,则更容易确定您从何处获得信息以及信息描述的内容。
还要考虑项目的未来发展,例如为用户添加另一个描述符,如aux3
. 对于第一个示例,您需要添加另一个 hashmap,记住添加到新的 hashmap,并记住从其中提取数据,就像从其他哈希图中提取数据一样。这将为初始设置和访问创建大量样板。
uuid = //some uuid
Map<UUID, Double> aux3 = new HashMap<UUID, Double>();
// some code
aux3.put(uuid, 1.0);
// some code ...
aux3.get();
但是使用组合方法,您只需要记住添加类属性(带有后继者和修改器),您可以在任何地方自由使用这些属性。每当您从用户地图访问时,您只需要我调用get(uuid)
并且您可以访问所有相关数据。
推荐阅读
- ffmpeg - 来自 ffmpeg 的 H264/MP4 直播延迟
- sql - M:N 关系 SQL 错误 00904 创建表时标识符无效
- python - 如何在 Python 日志记录语句中包含模块的相对路径?
- sas - SAS Enterprise Miner - 无法启动应用程序(在 Mac 上)
- javascript - 使用 Javascript/jQuery 从外部页面获取文档标题?
- mysql - 使用 MySQL 根据另一列中的不同值聚合一列时排除重复行
- bash - 暂时停止重定向以获取用户输入
- python - 正则表达式匹配所有字符,直到 ti 达到一个数字
- terminal - 多路复用器
-x 命令刚刚停止工作 - javascript - 无法使用 rs.add 或 rs.initiate(configObject) 在 MongoDB 中创建副本集