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

Java 何时在LinkedList或ArrayList上使用HashMap,反之亦然,java,arrays,arraylist,linked-list,hashmap,Java,Arrays,Arraylist,Linked List,Hashmap,为什么我们不能总是使用HashMap,即使它在添加、删除操作中比ArrayList或LinkedList更有效,也和元素的数量无关 我在谷歌上搜索了一下,找到了一些原因,但使用HashMap总是有一个变通方法,它的优点仍然存在。列表和映射是不同的数据结构。当您希望将键与值关联并且列表是有序集合时,可以使用映射 Map是Java集合框架中的一个接口,HashMap是Map接口的一个实现。HashMap对于基于键定位值以及基于键插入和删除值非常有效。HashMap的条目没有排序 ArrayList和

为什么我们不能总是使用HashMap,即使它在添加、删除操作中比ArrayList或LinkedList更有效,也和元素的数量无关


我在谷歌上搜索了一下,找到了一些原因,但使用HashMap总是有一个变通方法,它的优点仍然存在。

列表和映射是不同的数据结构。当您希望将键与值关联并且列表是有序集合时,可以使用映射

Map是Java集合框架中的一个接口,HashMap是Map接口的一个实现。HashMap对于基于键定位值以及基于键插入和删除值非常有效。HashMap的条目没有排序


ArrayList和LinkedList是List接口的实现。LinkedList提供顺序访问,通常在插入和删除列表中的元素时效率更高,但在访问列表中的元素时效率较低。ArrayList提供随机访问,在访问元素时效率更高,但在插入和删除元素时通常较慢。

列表表示元素的顺序。 映射用于表示键/值对的集合

虽然可以使用地图作为列表,但这样做肯定有一些缺点

维持秩序: -根据定义,列表是有序的。您可以添加项目,然后可以按照插入项目的顺序在列表中进行迭代。将项添加到HashMap时,不能保证以与放入项相同的顺序检索这些项。HashMap有一些子类,比如LinkedHashMap,它们将维护顺序,但在一般情况下,映射不能保证顺序

键/值语义: -映射的目的是基于一个键存储项目,该键可用于在以后检索项目。类似的功能只能在钥匙恰好位于列表中的位置的有限情况下通过列表实现

代码可读性 考虑下面的例子。
    // 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);  

希望这能有所帮助,

ArrayList和LinkedList的缺点是,根据搜索算法,在遍历它们时,查找项目所需的时间会随着列表的大小而增加

散列的美妙之处在于,尽管您牺牲了一些额外的时间来搜索元素,但所花费的时间不会随着映射的大小而增长。这是因为HashMap通过将正在搜索的元素直接转换为索引来查找信息,因此它可以进行跳转

长话短说。。。 LinkedList:比ArrayList占用更多内存,插入(添加和删除)成本低 ArrayList:占用的内存较低,但与LinkedList类似,并且在较大时需要额外的时间进行搜索。
HashMap:可以跳转到该值,使大型映射的搜索时间保持不变。与小列表相比,它会消耗更多内存并花费更长的时间来查找值。

我将在这里列出一些实际案例和场景,当使用其中一个或另一个时,可能会对其他人有所帮助:

HashMap

当您必须在应用程序中使用缓存时。Redis和membase是某种类型的扩展HashMap。(与元素的顺序无关,您需要使用键进行快速(O(1))读取访问(一个值)

LinkedList


当顺序很重要时(它们是在添加到LinkedList时排序的),元素的数量是未知的(不要浪费内存分配),并且需要快速插入时间(O(1))。添加待办事项时可以按顺序列出的待办事项列表就是一个很好的例子

列表
映射
是两种完全不同的数据结构,具有不同的操作和不变量。你能解释一下你所考虑的背景/需求吗?这两种解决方案在哪里都是可以接受的?显然,你从来都不需要将一系列事情保持在特定的顺序上……为什么要投否决票?我认为这是一个恰当的问题。虽然显示出缺乏知识,但在这个问题上不应该因为显示出缺乏知识而被否决。事实上,问题总是由于缺乏知识而产生的。LinkedList通常被认为是因为性能问题而不好。由于元素排序的原因,我经常使用LinkedList而不是ArrayList。如果我使用位置作为键的HashMaps(对于性能和内存)会更好吗?