簡體   English   中英

Java中的HashMap和ArrayList之間的區別?

[英]Difference between HashMap and ArrayList in Java?

在Java中, ArrayListHashMap用作集合。 但是我無法理解在哪種情況下我們應該使用ArrayList以及哪些時候使用HashMap 兩者之間的主要區別是什么?

您是專門詢問有關ArrayList和HashMap的內容,但我認為要完全理解您需要了解的集合框架。 因此,ArrayList實現List接口,HashMap實現Map接口。 所以真正的問題是你何時想要使用List以及何時想要使用Map。 這是Java API文檔很有幫助的地方。

列表:

有序集合(也稱為序列)。 該接口的用戶可以精確控制列表中每個元素的插入位置。 用戶可以通過整數索引(列表中的位置)訪問元素,並搜索列表中的元素。

地圖:

將鍵映射到值的對象。 地圖不能包含重復的鍵; 每個鍵最多可以映射一個值。

因此,正如其他答案所討論的那樣,列表接口(ArrayList)是您使用索引訪問的對象的有序集合,非常類似於數組(在ArrayList的情況下,顧名思義,它只是一個數組中的數組)背景,但處理數組的很多細節都是為你處理的)。 當您想要按照排序順序(添加它們的順序,或者實際上添加對象時指定的列表中的位置)時,可以使用ArrayList。

另一方面,Map獲取一個對象並將其用作另一個對象(值)的鍵(索引)。 因此,假設您擁有具有唯一ID的對象,並且您知道您希望在某些時候通過ID訪問這些對象,Map將使您更容易(並且更快/更高效)。 HashMap實現使用密鑰對象的哈希值來定位它的存儲位置,因此不再保證值的順序。 然而,Java API中可以提供其他類,例如LinkedHashMap,它使用哈希表來存儲鍵/值對,還按照添加順序維護鍵的List(LinkedList),這樣您就可以按照添加的順序(如果需要)再次訪問這些項目。

如果使用ArrayList ,則必須使用索引( int類型)訪問元素。 使用HashMap ,您可以通過另一種類型的索引(例如, String )訪問它們

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");

使用ArrayList這是不可能的(或者更困難)。 訪問ArrayList元素的唯一好方法是通過索引號獲取元素。

因此,這意味着使用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);

你翻轉了一次播放器,然后存儲它。 您可以使用BufferedImage作為HashMap鍵類型訪問BufferedImage

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

不是特定於Java的問題。 看來你需要一個關於數據結構的“入門”。 嘗試谷歌搜索“你應該使用什么數據結構”

請嘗試此鏈接http://www.devx.com/tips/Tip/14639

從鏈接:

以下是將最常用的數據結構與特定需求進行匹配的一些技巧。

  1. 何時使用Hashtable?

如果要以鍵值對的形式訪問存儲的數據,則散列表或類似的數據結構是很好的候選者。 例如,如果您正在獲取員工的姓名,則結果可以以哈希表的形式作為(名稱,值)對返回。 但是,如果要返回多個員工的名稱,則直接返回哈希表並不是一個好主意。 請記住,密鑰必須是唯一的,否則您之前的值將被覆蓋。

  1. 何時使用List或Vector?

當您需要順序甚至隨機訪問時,這是一個不錯的選擇。 此外,如果數據大小最初未知,和/或將動態增長,則使用List或Vector是合適的。 例如,要存儲JDBC ResultSet的結果,可以使用java.util.LinkedList。 然而,如果您正在尋找可調整大小的數組,請使用java.util.ArrayList類。

  1. 何時使用數組?

永遠不要低估數組。 大多數情況下,當我們必須使用對象列表時,我們傾向於考慮使用向量或列表。 但是,如果集合的大小已知並且不會更改,則可以將數組視為潛在的數據結構。 訪問數組的元素比使用向量或列表更快。 這很明顯,因為你需要的只是一個索引。 額外的get方法調用沒有開銷。

4.Combinations

有時,最好使用上述方法的組合。 例如,您可以使用哈希表列表來滿足特定需求。

  1. 設置類

從JDK 1.2開始,您還設置了類java.util.TreeSet,這對於沒有重復項的排序集非常有用。 這些課程最好的一點是他們都遵守某些界面,所以你不必擔心具體細節。 例如,請查看以下代碼。

  // ...
  List list = new ArrayList();
  list.add(

地圖與列表。

在Map中,您有鍵/值對。 要訪問值,您需要知道密鑰。 密鑰和值之間存在關系,該關系持續存在且不是任意的。 它們以某種方式相關。 例如:人的DNA是唯一的(密鑰)和人名(值)或人SSN(密鑰)和人名(值)有很強的關系。

在列表中,您擁有的只是值(人名),要訪問它,您需要知道它在列表(索引)中的位置才能訪問它。 但是列表中的值的位置與其索引之間沒有永久關系,它是任意的。

使用列表來獲取正好值的有序集合。 例如,您可能有要處理的文件列表。

使用映射進行從鍵到值的(通常是無序的)映射。 例如,您可能有一個從用戶ID到該用戶詳細信息的映射,因此您可以有效地查找僅給出ID的詳細信息。 (您可以通過僅存儲鍵列表和值列表實現Map接口,但通常會有更高效的實現 - 例如, HashMap在內部使用哈希表來進行分攤的O(1)鍵查找。 )

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM