Java中的HashMap和ArrayList之间的区别?

2022-09-01 00:47:37

在 Java 中,它们被用作集合。但是我无法理解我们应该在哪些情况下使用,在哪些时间使用。它们之间的主要区别是什么?ArrayListHashMapArrayListHashMap


答案 1

你特别问的是ArrayList和HashMap,但我认为要完全理解正在发生的事情,你必须了解Collections框架。因此,ArrayList 实现 List 接口,HashMap 实现 Map 接口。因此,真正的问题是何时要使用列表,何时要使用地图。这就是 Java API 文档有很大帮助的地方。

列表:

有序集合(也称为序列)。此界面的用户可以精确控制每个元素在列表中的插入位置。用户可以按元素的整数索引(列表中的位置)访问元素,并在列表中搜索元素。

地图:

将键映射到值的对象。映射不能包含重复的键;每个键最多可以映射到一个值。

因此,正如其他答案所讨论的那样,列表接口(ArrayList)是一个有序的对象集合,您可以使用索引访问这些对象,就像数组一样(在ArrayList的情况下,顾名思义,它只是后台的数组,但是处理数组的许多细节都是为您处理的)。当您希望按排序顺序(添加它们的顺序,或者实际上是添加对象时指定的列表中的位置)时,可以使用 ArrayList。

另一方面,Map采用一个对象,并将其用作另一个对象(值)的键(索引)。因此,假设您有具有唯一ID的对象,并且您知道您将在某个时候希望通过ID访问这些对象,Map将使您非常容易(并且更快/更有效)。HashMap 实现使用键对象的哈希值来定位它的存储位置,因此不再保证值的顺序。然而,Java API中还有其他类可以提供这一点,例如LinkedHashMap,它除了使用哈希表来存储键/值对外,还按照添加顺序维护键的列表(LinkedList),因此您可以随时按照添加的顺序再次访问项目(如果需要)。


答案 2

如果使用 ,则必须访问具有索引(类型)的元素。使用 ,您可以通过其他类型的索引(例如,aArrayListintHashMapString)

HashMap<String, Book> books = new HashMap<String, Book>();
// String is the type of the index (the key)
// and Book is the type of the elements (the values)
// Like with an arraylist: ArrayList<Book> books = ...;

// Now you have to store the elements with a string key:
books.put("Harry Potter III", new Book("JK Rownling", 456, "Harry Potter"));

// Now you can access the elements by using a String index
Book book = books.get("Harry Potter III");

这对于 .访问 中元素的唯一好方法是按索引号获取元素。ArrayListArrayList

因此,这意味着使用a,您可以使用所需的每种类型的密钥。HashMap

另一个有用的例子是在游戏中:你有一组图像,你想翻转它们。因此,您编写一个图像翻转方法,然后存储翻转的结果:

HashMap<BufferedImage, BufferedImage> flipped = new HashMap<BufferedImage, BufferedImage>();
BufferedImage player = ...; // On this image the player walks to the left.
BufferedImage flippedPlayer = flip(player); // On this image the player walks to the right.
flipped.put(player, flippedPlayer);
// Now you can access the flipped instance by doing this:
flipped.get(player);

您翻转了一次播放器,然后将其存储。您可以使用 as 键类型访问 .BufferedImageBufferedImageHashMap

我希望你能理解我的第二个例子。