列表<地图<字符串,字符串>&GT; vs List <object>

时间:2017-08-01 11:59:53

标签: java

在使用和效果方面使用List<Map<String, String>>List<Object>之间的区别。 假设我必须创建一个只有3种键值对的映射列表,我可以创建一个只有3个属性的对象并创建一个对象列表。

这里的问题是在哪种场景中应该使用哪两种方法?

2 个答案:

答案 0 :(得分:27)

让我们首先澄清一下我们在谈论的内容:它是

List<Map<String, String>> 

List<Foo>

其中Foo对象有许多“属性”,它们将存储在地图中(作为键值对)和选项一。

在这种情况下,你绝对选择两个。仅仅因为良好的OOP是关于创建有用的抽象,又名模型。含义:当你拥有属于一起的属性时,使用一个类来包裹它们是自然的方法。

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

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

可能会在运行时失败 - 您不知道map是否包含该键,如果这是一个Integer。

但是

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

可以由编译器检查! (是的,那些 get()调用在运行时仍然会失败,但这是你无法解决的问题)

除此之外:不要担心关于此级别的性能:首先,您必须了解在编写Java代码时真正会影响您的性能。因为你绝对想避免“这段代码很难看但可能会提供更好的性能”的想法潜入你的设计中。专注于编写干净的代码,以直接的方式完成工作。 从不编写不那么富有表现力的代码,因为假设它更快。遇到性能问题时 - 查看代码,找出根本原因并解决问题。

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

答案 1 :(得分:4)

如果您的课程看起来像这样:

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

    // constructor and getters
}

使用List<Foo>会导致:

<强>性能

使用类的性能可能与地图非常相似。大多数地图实现,例如HashMap,提供O(1) get put 操作。它不会比为对象调用getter方法慢得多。

用法,如果3&#34;键&#34;总是一样的:

该课程可能更容易使用。如果你有一个Map<String, String>,则没有简单的方法可以强制执行每张地图正好包含3个按键&#34; A&#34;,&#34; B&#34;和&#34; C&#34;。如果有人添加密钥&#34; D&#34 ;?如果有人删除密钥A怎么办?

使用自定义类,这很容易通过构造函数强制执行 - 编译时检查。

用法,如果3&#34;键&#34;不一样:

如果没有多个类,可能还有某种类层次结构,您就无法轻松实现这一目标。地图可能更好。