具有多个值的 Java 映射 : container class or multiple maps?

标签 java performance dictionary

我正在尝试创建一个映射,其中 UUID 键同时指向一个对象(例如某些 User 类实例)和有关该对象的辅助信息(例如 int 和一个 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>();

就效率和内存使用而言,通常认为哪个性能更高?或者还有更值得的第三种选择吗?

最佳答案

无论是内存还是效率,我相信第二种选择是更好的解决方案。第一个解决方案是创建更多使用内存的Map,并存储使用内存的相同UUID

它的可维护性和可读性也更好,除非毫秒级的性能至关重要,否则这是其中更重要的。如果将相关信息捆绑在一起,就可以更轻松地确定您从何处获得信息以及它所描述的内容。

还要考虑项目的 future 开发,例如为用户添加另一个描述符,如 aux3。对于第一个示例,您需要添加另一个 HashMap ,记住添加到新的 HashMap ,并记住在从其他 HashMap 中提取数据时从中提取数据。这将为初始设置和访问创建大量样板。

uuid = //some uuid
Map<UUID, Double> aux3 = new HashMap<UUID, Double>();

// some code
aux3.put(uuid, 1.0);

// some code ...
aux3.get();

但是使用组合方法,您只需要记住添加类属性(带有后继者和变更者),并且您可以在任何地方自由使用它们。每当您从用户 map 访问时,您只需要调用get(uuid),您就可以访问所有关联的数据。

关于具有多个值的 Java 映射 : container class or multiple maps?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63571653/

相关文章:

c# - C#中字典的内存使用

java - 优化循环中数组的选择

java - 执行堆排序时出现错误

java - 从字节数组创建损坏的 PDF

java - 如何从 Document 或 Node 创建 InputStream

mysql - 使用 like vs group by 聚合函数的 SQL 查询 - 性能

performance - 你能同时使用百分之一百的IO和CPU吗?

c++ - 打印 map 中的所有对

Python - 实现二进制补码的最有效方法?

python - 如何按键对字典进行排序?