在使用和性能方面使用List<Map<String, String>>
和List<Object>
有何区别。 假设我必须创建一个只有3种类型的键值对的地图列表,我可以创建一个只有3个属性的对象并创建一个对象列表。List <Map <String,String >> vs List <Object>
这里的问题是两种方法中哪一种应该在哪种情况下使用?
在使用和性能方面使用List<Map<String, String>>
和List<Object>
有何区别。 假设我必须创建一个只有3种类型的键值对的地图列表,我可以创建一个只有3个属性的对象并创建一个对象列表。List <Map <String,String >> vs List <Object>
这里的问题是两种方法中哪一种应该在哪种情况下使用?
让我们先澄清一下,我们都在谈论:这是
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代码时,真的会影响您的性能。因为你绝对想避免“这段代码很丑,但可能会提供更好的性能”,所以想法会潜入你的设计中。专注于编写干净的代码,以简单明了的方式完成工作。做从来没有写较少表达代码因为你假设它更快。当出现性能问题时 - 分析您的代码,找出根本原因并解决问题。
但是不要让过早的优化想法影响你的代码的质量。
小小的一天开始新的一天! – davidxxx
前提是你的类看起来是这样的:
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个“钥匙”是不一样的:
而不必多个类,可能还有一些类型的类层次的,你不能轻易做到这一点。地图可能会更好。
为什么问题会重新打开?它仍然是基于意见的。 –
@MuratK。当用于不同场景时,可以从语法和性能角度考虑目标(即基于非意见的)差异。但是整个“我应该使用哪一个”往往是基于意见的最佳实践,并可能更适合[softwareengineering.se]。它似乎可以去任何一个方面。 – Dukeling