首页 > 解决方案 > 具有多个值的 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>();

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

标签: javaperformancedictionary

解决方案


对于内存和效率,我相信第二种选择是更好的解决方案。第一个解决方案是创建更多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)并且您可以访问所有相关数据。


推荐阅读