我正在尝试创建一个映射,其中 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/