SJ1*_*J19 -1 java dictionary list arraylist hashmap
我目前对 Map 何时优于 HashMap 或其他方式感到困惑,对于列表/数组列表也是如此...
有人可以请 ELI5 吗?我知道如何使用它们,但我需要有人在应该使用它们时为我清理它,谢谢。
Map是存储键值对的数据结构,此结构允许您快速查找与给定键对应的对象。示例用例是字典 - 其中,对于给定的单词(键),您可以查找其含义(值)。
List是另一种类型的数据结构,您可以在其中存储对象列表。与 不同Map,您通常通过迭代数组来访问列表中的对象——如果您知道对象在列表中的哪个位置,您也可以访问该对象。
在Java 中,Map和List是接口- 它们定义了此类数据结构应该具有的通用方法。可以根据不同的需要选择以多种方式实现这些接口。 HashMap是 的一个这样的实现Map,而ArrayList是List接口的实现。
要找出Map和的不同实现List,您可以分别查看Java Docs 中的所有已知实现类Map和所有已知实现类List
当您决定使用 a 时Map,您必须选择Map将用于创建Map对象的接口的具体实现-HashMap是常用的Map接口实现(除非有特殊需要,在这种情况下他们可以选择更合适的实现)。
同样,当您决定使用 a 时List,您必须选择List将用于创建List对象的接口的具体实现-ArrayList通常是List接口的实现(除非有特殊需要,在这种情况下他们可以选择更合适的实现)。
在面向对象设计中,还有一个Program to Interface的概念。这表明应该将它们的变量声明为由接口表示的类型,而不是具体的实现。
# This is preferred (return interface type)
public Map function() {
return new HashMap();
}
# This should be avoided (do not return implementation type)
public HashMap function() {
return new HashMap();
}
Run Code Online (Sandbox Code Playgroud)
这样做的原因是,如果为function后来开发代码的人觉得Map返回的 byfunction应该对其键进行排序(如现实世界的字典中所见),那么她可能决定使用TreeMap(Map其中键排序的实现) ) 而不是HashMap。
当函数被定义为public Map function(),那么,所有的调用者都function不会意识到这个变化,他们的代码不会有任何变化。但是,当函数定义为 时public HashMap function(),则必须更改为public TreeMap function(),并将强制所有用户function更改其代码。
Program to Interface允许开发人员将实现选择更改的影响保持在最低限度。
本着同样的精神,Java 有很多接口(Map、Set、List等),程序员在函数调用中传递对对象的引用时应该使用它们,而实例化具体对象的代码可以选择基于程序的需要。