在使用和效果方面使用List<Map<String, String>>
与List<Object>
之间的区别。
假设我必须创建一个只有3种键值对的映射列表,我可以创建一个只有3个属性的对象并创建一个对象列表。
这里的问题是在哪种场景中应该使用哪两种方法?
答案 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;不一样:
如果没有多个类,可能还有某种类层次结构,您就无法轻松实现这一目标。地图可能更好。