List<Map<String,String>>与List<Object>的区别

12

在使用和性能方面,使用List<Map<String, String>>List<Object>有何区别。 假设我需要创建一个仅包含3种键值对的映射列表,我可以创建一个具有3个属性的对象,并创建对象列表。

这里的问题是,在两种方法中应该在哪种情况下使用哪种方法?


为什么这个问题被重新开放了?它仍然是基于观点的。 - Murat Karagöz
@MuratK。在不同的场景下,可以从语法和性能方面来看待客观(即非基于意见的)差异。但整个“我应该使用哪一个”倾向于是基于最佳实践的意见,可能更适合在[softwareengineering.se]上讨论。这似乎可以两者兼顾。 - Bernhard Barker
2个回答

27

首先让我们澄清一下我们正在谈论的是什么:它是

List<Map<String, String>> 

对比

List<Foo>

如果Foo对象有许多“属性”,这些属性将存储在一个map中(作为键值对),则应选择选项一。

在这种情况下,你一定要选择选项。这是因为良好的面向对象编程是关于创建有用的抽象,即模型。意思是:当你有一些属性是相关联的时,使用类来包装它们是自然而然的方式。

这给你带来了轻微的性能优势(因为你避免了map访问),但核心问题是:它允许你编写编译时检查的代码。你看:

int foo = list.get(0).map.get("key");

运行时 可能会失败 - 您不知道 map 是否包含该键,以及该键是否是一个整数。

但是

int foo = list.get(0).getFoo(); // resp. ...get(0).fieldName 

编译器可以检查!(是的,这些get()调用在运行时仍然可能失败,但这是无法避免的)

除此之外:不要为这个级别的性能担心:首先,你必须理解编写Java代码时真正影响性能的因素。因为你绝对不想让“这段代码很丑陋,但可能会提供更好的性能”这种想法潜入你的设计中。专注于编写干净简单的代码以完成工作。永远不要编写表达不清的代码,因为你认为它更快。当你遇到性能问题时-剖析你的代码,找出根本原因并进行修复。

但是不要让过早优化的想法影响你代码的质量。


一点点小开胃菜来开始今天的工作吧! - davidxxx

4

假设你的类看起来像这样:

class Foo
{
    private final String a;
    private final String b;
    private final String c;

    // constructor and getters
}

使用 List<Foo> 会导致以下结果: 性能 使用类的性能可能与 map 非常相似。大多数映射实现(例如,HashMap)提供 O(1) 的 getput 操作。它不会比调用对象的 getter 方法慢得多。 如果 3 个“键”始终相同,则使用: 使用该类可能要容易得多。如果你有一个 Map<String, String> ,没有简单的方法来强制执行每个 map 包含正好 3 个键“A”,“B”和“C”。如果某人添加键“D”会怎样?如果某人删除了键 A 会怎样?
使用自定义类,这很容易通过构造函数来强制执行 - 编译时检查。 如果 3 个“键”不相同: 如果没有多个类,并且可能还有某种类层次结构,则很难实现此目标。使用映射可能更好。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接