2017-08-01 135 views
12

在使用和性能方面使用List<Map<String, String>>List<Object>有何区别。 假设我必须创建一个只有3种类型的键值对的地图列表,我可以创建一个只有3个属性的对象并创建一个对象列表。List <Map <String,String >> vs List <Object>

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

+0

为什么问题会重新打开?它仍然是基于意见的。 –

+0

@MuratK。当用于不同场景时,可以从语法和性能角度考虑目标(即基于非意见的)差异。但是整个“我应该使用哪一个”往往是基于意见的最佳实践,并可能更适合[softwareengineering.se]。它似乎可以去任何一个方面。 – Dukeling

回答

26

让我们先澄清一下,我们都在谈论:这是

List<Map<String, String>> 

List<Foo> 

其中foo对象有一些“属性”,将被存储在一个地图(如键值对)与选项一。

在这种情况下,你绝对选择两个。简单地说,因为良好的面向对象是关于创建有用的抽象,又名模型。意思是:当你有属于的属性,那么使用一个类来环绕它们是一种自然的方式。

这给你的性能略有优势(因为你避免了地图访问),但核心的一点是:它允许你编写编译时间检查代码。你看:

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

可以在运行失败 - 你不知道,如果地图包含的关键,如果这是一个整数。

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

可以被编译器检查! (是的,那些的get()呼叫仍然在运行时失败,但是这是你没有得到周围反正)

除此之外:做有关性能不担心在这个层面上:首先,您必须了解在编写Java代码时,真的会影响您的性能。因为你绝对想避免“这段代码很丑,但可能会提供更好的性能”,所以想法会潜入你的设计中。专注于编写干净的代码,以简单明了的方式完成工作。做从来没有较少表达代码因为你假设它更快。当出现性能问题时 - 分析您的代码,找出根本原因并解决问题。

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

+0

小小的一天开始新的一天! – davidxxx

4

前提是你的类看起来是这样的:

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

    // constructor and getters 
} 

使用List<Foo>将导致:

性能

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

使用,如果3“键”始终是相同的:

类是可能更容易使用。如果您有Map<String, String>,则没有简单的方法可以强制每个地图包含3个“A”,“B”和“C”键。如果有人添加关键“D”会怎么样?如果有人删除关键字A会怎样?

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

使用,如果3个“钥匙”是不一样的:

而不必多个类,可能还有一些类型的类层次的,你不能轻易做到这一点。地图可能会更好。

相关问题