我们不能总是使用HashMap的原因是什么,即使它在添加,删除操作方面比ArrayList或LinkedList更有效,也与元素的数量无关。
我用Google搜索并发现了一些原因,但总是有一种使用HashMap的解决方法,优势仍然存在。
答案 0 :(得分:90)
列表表示元素的顺序排序。 地图用于表示键/值对的集合。
虽然您可以将地图用作列表,但这样做有一些明确的缺点。
维护订单 - 按订单定义列表。您添加项目,然后您可以按插入项目的顺序遍历列表。当您向HashMap添加项目时,不能保证按照您放入它们的顺序检索项目.HotMap的子类如LinkedHashMap将维护顺序,但通常顺序不能保证使用Map。 / p>
键/值语义: - 地图的目的是基于可用于稍后检索项目的键来存储项目。类似的功能只能通过列表在有限的情况下实现,其中键恰好是列表中的位置。
代码可读性 请考虑以下示例。
// 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
收藏功能 通过Collections类可以为列表提供一些很棒的实用程序功能。例如......
// Randomize the list
Collections.shuffle(myList);
// Sort the list
Collections.sort(myList, myComparator);
希望这有帮助,
答案 1 :(得分:30)
列表和地图是不同的数据结构。当您想要将键与值相关联并且列表是有序集合时,将使用映射。
Map是Java Collection Framework中的一个接口,HashMap是Map接口的一个实现。 HashMap可以有效地根据键定位值,并根据键插入和删除值。 HashMap的条目不是有序的。
ArrayList和LinkedList是List接口的实现。 LinkedList提供顺序访问,并且通常在列表中插入和删除元素时更有效,但是,访问列表中的元素效率较低。 ArrayList提供随机访问,在访问元素方面效率更高,但插入和删除元素的速度通常较慢。
答案 2 :(得分:0)
ArrayList和LinkedList的缺点是,当遍历它们时,根据搜索算法的不同,查找项目所花费的时间会随着列表的大小而增加。
散列的优点在于,尽管您牺牲了一些额外的时间来搜索元素,但是花费的时间却不会随着地图的大小而增加。这是因为HashMap通过将要搜索的元素直接转换为索引来查找信息,因此可以进行跳转。
长话短说... LinkedList :比ArrayList消耗更多的内存,插入成本低(添加和删除) ArrayList :占用的内存少,但与LinkedList相似,并且大时需要额外的时间进行搜索。 HashMap :可以跳转到该值,从而使大型地图的搜索时间保持不变。与小列表相比,它消耗更多的内存,并且花费更长的时间查找值。
答案 3 :(得分:0)
我将在此处使用一些实际案例和场景,何时使用一个或另一个,这可能对其他人有帮助:
HashMap
当您必须在应用程序中使用缓存时。 Redis和membase是某种扩展的HashMap。 (与元素的顺序无关,您需要使用键快速(O(1))读取访问(一个值)。
LinkedList
当顺序很重要时(它们按照添加到LinkedList的顺序排序),元素的数目是未知的(不要浪费内存分配),并且您需要快速插入时间(O(1))。待办事项列表可以在添加时按顺序列出,这是一个很好的示例。