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

2022-08-31 10:56:53

为什么我们不能总是使用HashMap,即使它在添加,删除操作方面比ArrayList或LinkedList更有效,也不管元素的数量如何。

我用谷歌搜索了它并找到了一些原因,但是使用HashMap总是有一个解决方法,其优点仍然存在。


答案 1

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

虽然您可以将地图用作列表,但这样做有一些明显的缺点。

维护顺序: - 按定义对列表进行排序。添加项,然后可以按插入项的顺序循环访问列表。将项目添加到 HashMap 时,不能保证按放置项目的相同顺序检索项目。像LinkedHashMap这样的HashMap的子类将保持顺序,但通常不能用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

收集功能一些很棒的实用程序函数可以通过 Collections 类用于列表。例如。。。

    // Randomize the list
    Collections.shuffle(myList);

    // Sort the list
    Collections.sort(myList, myComparator);  

希望这有帮助,


答案 2

列表和地图是不同的数据结构。当您想要将键与值关联时,将使用映射,而 Lists 是有序集合。

Map 是 Java Collection Framework 中的一个接口,HashMap 是 Map 接口的一个实现。HashMap 对于基于键定位值以及基于键插入和删除值非常有效。哈希映射的条目未排序。

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