何时在LinkedList或ArrayList上使用HashMap,反之亦然



为什么我们不能总是使用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:可以执行跳转到值,使大映射的搜索时间恒定。
比小列表占用更多内存,并且需要更长的时间来查找值。

相关内容

  • 没有找到相关文章

最新更新