簡體   English   中英

linkedhashmap,hashmap,map,hashtable之間的區別

[英]difference between linkedhashmap, hashmap, map, hashtable

我正准備進行軟件訪談,現在我幾天都遇到了問題。

我無法弄清楚Java Collection API中存在的linkedhashmap,map,hashtable和hashmap之間的區別。

所有這些都具有相同的獲取和復雜性嗎? 我知道map是接口類和hashmap,hashtable,linkedhashmap實現這個接口。 那么這是否意味着這三個類的內部實現是一樣的? 它們是如何在集合api中實現的?

提前致謝!!!

我懷疑這些差異可以比這些類中已經在JavaDocs中編寫的內容更好地解釋:

  • Map是所有這些類共有的基本接口
  • Hashtable是該接口的一個實現,對於“舊”時代,認為讓所有內容同步是一個好主意(參考Vector )。 如果您知道自己在做什么,它會提供“一種”線程安全性。 如果你認真對待可以從多個線程使用的地圖,你應該絕對檢查ConcurrentHashMapConcurrentSkipListMap
  • HashMap與Hashtable幾乎相同,但刪除了同步。 它是首選的通用Map實現。
  • LinkedHashMap另外維護了它的條目的鏈接列表,它允許維護一個排序或者很容易地將它用作LRU緩存,只需讀取JavaDoc。

所有上述Map實現都具有(攤銷的) O(1)時間復雜度的基本get / put操作。 處理null值時存在細微差別,因此不可避免地要檢查JavaDoc的詳細信息。

要了解這些類是如何實現的,請查看它們的繼承樹:

  • Map (只是界面)
    • Dictionary (廢棄的抽象類)
      • Hashtable (“舊”地圖實現依賴於它自己)
    • AbstractMap (“新”地圖實現的基本功能)
      • HashMap (第一個用於通用目的的具體地圖實現)
        • LinkedHashMap (通過維護鏈表擴展HashMap

他們都遵守同樣的合同,但在實施方面存在一些差異:

  • LinkedHashMap:按插入順序維護鍵
  • HashTable:所有操作都是同步的,沒有訂購保證
  • HashMap:沒有訂購保證,性能最佳

通常,最佳實踐是使用Map作為變量的類型,然后根據代碼的需要實例化實現類型。 除非您需要一些排序保證,否則HashMap通常是首選,在這種情況下LinkedHashMapTreeMap是不錯的選擇。

所有類都實現了Map接口,並提供了大部分相同的功能。 最重要的區別是條目的迭代順序:

HashMap絕對不保證迭代順序。 當添加新元素時,它甚至可以(並且將)完全改變。 TreeMap將根據其compareTo()方法(或外部提供的Comparator)根據鍵的“自然排序”進行迭代。 此外,它還實現了SortedMap接口,該接口包含依賴於此排序順序的方法。 LinkedHashMap將按照將條目放入映射的順序進行迭代“Hashtable”是基於散列的映射的通用名稱。 在Java API的上下文中,Hashtable是Java 1.1之前的一個過時類,它存在於集合框架之前。 它不應再被使用,因為它的API混雜了復制功能的過時方法,並且它的方法是同步的(這可能會降低性能並且通常是無用的)。 使用ConcurrrentHashMap而不是Hashtable。

暫無
暫無

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

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