为什么我们不能总是使用HashMap,即使它在添加,删除操作方面比ArrayList或LinkedList更有效,也不管元素的数量。
我在谷歌上搜索了一下,发现了一些原因,但总有一个使用HashMap的解决方案,其优势仍然存在。
列表表示元素的顺序。映射用于表示键/值对的集合。
虽然您可以将map用作列表,但这样做有一些明显的缺点。
维持秩序:- 按定义排序的列表。您添加项,然后可以按照插入项的顺序遍历列表。当您向HashMap添加项时,不能保证按照您放入项的顺序检索这些项。有HashMap的子类,如LinkedHashMap,将维护顺序,但在一般情况下,顺序不能保证与Map。
键/值语义:
- 映射的目的是基于键来存储项,该键可用于在以后的某个点检索该项。类似的功能只能在有限的情况下通过列表实现,其中键恰好是列表中的位置。
代码可读性考虑下面的例子:
// Adding to a List
list.add(myObject); // adds to the end of the list
map.put(myKey, myObject); // sure, you can do this, but what is myKey?
map.put("1", myObject); // you could use the position as a key but why?
// Iterating through the items
for (Object o : myList) // nice and easy
for (Object o : myMap.values()) // more code and the order is not guaranteed
<<p> 收藏功能/strong>列表可以通过Collections类获得一些很棒的实用函数。例如:
// Randomize the list
Collections.shuffle(myList);
// Sort the list
Collections.sort(myList, myComparator);
列表和映射是不同的数据结构。映射用于当您希望将键与值相关联并且列表是有序集合时。
Map是Java Collection Framework中的一个接口,HashMap是Map接口的一种实现。HashMap对于基于键定位值以及基于键插入和删除值是有效的。HashMap的表项是无序的
ArrayList和LinkedList是List接口的实现。LinkedList提供顺序访问,通常在插入和删除列表中的元素时更有效,然而,它在访问列表中的元素时效率较低。ArrayList提供随机访问,在访问元素时效率更高,但在插入和删除元素时通常较慢。
我将在这里给出一些实际的例子和场景,当使用一个或另一个时,它可能对其他人有帮助:
HashMap
当您必须在应用程序中使用缓存时。Redis和membase是某种类型的扩展HashMap。(与元素的顺序无关,您需要快速(O(1))读取访问(一个值),使用键)。
LinkedList
当顺序很重要时(它们在添加到LinkedList时被排序),元素的数量是未知的(不要浪费内存分配),并且您需要快速插入时间(O(1))。一个可以在添加时按顺序列出的待办事项列表就是一个很好的例子。
ArrayList和LinkedList的缺点在于,当迭代它们时,根据搜索算法的不同,查找项所需的时间随着列表的大小而增长。
哈希的美妙之处在于,尽管您牺牲了一些额外的时间来搜索元素,但所花费的时间不会随着映射的大小而增长。这是因为HashMap通过将您正在搜索的元素直接转换为索引来查找信息,因此它可以进行跳转。
长话短说……LinkedList:比ArrayList占用更多内存,插入成本低(add &删除)ArrayList:消耗较少的内存,但与LinkedList相似,并且在较大时需要额外的搜索时间。HashMap:可以执行跳转到值,使大映射的搜索时间恒定。