在使用和性能方面,使用List<Map<String, String>>
与List<Object>
有何区别。
假设我需要创建一个仅包含3种键值对的映射列表,我可以创建一个具有3个属性的对象,并创建对象列表。
这里的问题是,在两种方法中应该在哪种情况下使用哪种方法?
在使用和性能方面,使用List<Map<String, String>>
与List<Object>
有何区别。
假设我需要创建一个仅包含3种键值对的映射列表,我可以创建一个具有3个属性的对象,并创建对象列表。
这里的问题是,在两种方法中应该在哪种情况下使用哪种方法?
首先让我们澄清一下我们正在谈论的是什么:它是
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代码时真正影响性能的因素。因为你绝对不想让“这段代码很丑陋,但可能会提供更好的性能”这种想法潜入你的设计中。专注于编写干净简单的代码以完成工作。永远不要编写表达不清的代码,因为你认为它更快。当你遇到性能问题时-剖析你的代码,找出根本原因并进行修复。
但是不要让过早优化的想法影响你代码的质量。
假设你的类看起来像这样:
class Foo
{
private final String a;
private final String b;
private final String c;
// constructor and getters
}
List<Foo>
会导致以下结果:
性能
使用类的性能可能与 map 非常相似。大多数映射实现(例如,HashMap
)提供 O(1) 的 get 和 put 操作。它不会比调用对象的 getter 方法慢得多。
如果 3 个“键”始终相同,则使用:
使用该类可能要容易得多。如果你有一个 Map<String, String>
,没有简单的方法来强制执行每个 map 包含正好 3 个键“A”,“B”和“C”。如果某人添加键“D”会怎样?如果某人删除了键 A 会怎样?