集合相關面試題

蜡笔小新Belief發表於2024-09-11

List、Set、Map 是否繼承自Collection 介面?

  1. List 是一個介面,它繼承自 Collection 介面。List 介面定義了一個有序的集合,可以包含重複的元素。
  2. Set 也是一個介面,它繼承自 Collection 介面。Set 介面定義了一個不允許重複元素的集合。
  3. Map 則不同,它不是一個繼承自 Collection 介面的介面。Map 提供了鍵值對的儲存,它繼承自 Map 介面本身,而不是 CollectionMap 介面不繼承自 Collection,因為它的行為和 Collection 介面所定義的行為不同。Map 介面中的集合檢視(鍵集檢視、值集檢視和條目集檢視)實現了 Collection 介面。

所以,總結來說,ListSet 繼承自 Collection 介面,而 Map 則不繼承自 Collection 介面。

闡述ArrayList、Vector、LinkedList 的儲存效能和特性?

  1. ArrayList
    • 底層結構ArrayList 基於動態陣列實現,可以看作是可以動態增長和縮小的陣列。
    • 插入和刪除效能:在列表的末尾新增元素(或在任何位置插入元素,但不包括列表的開頭)時,效能較好,因為只需要移動插入點後面的元素。但如果在列表的開頭或中間插入或刪除元素,可能需要移動大量元素,這會導致效能下降,時間複雜度為 O(n)。
    • 記憶體佔用ArrayList 通常佔用的記憶體比 LinkedList 少,因為它不需要為每個元素儲存額外的指標。
    • 執行緒安全ArrayList 是非執行緒安全的。
  2. Vector
    • 底層結構Vector 也是基於動態陣列實現的,與 ArrayList 類似,但它是同步的。
    • 隨機訪問效能:和 ArrayList 一樣,Vector 在隨機訪問時效能也很好,時間複雜度為 O(1)。
    • 插入和刪除效能:與 ArrayList 類似,Vector 在列表末尾新增元素時效能較好,但在列表開頭或中間插入或刪除元素時效能較差,時間複雜度為 O(n)。
    • 記憶體佔用Vector 通常比 ArrayList 佔用更多的記憶體,因為它是同步的,需要額外的記憶體來支援執行緒安全。
    • 執行緒安全Vector 是執行緒安全的,因為它的所有公共方法都是同步的,這在多執行緒環境中很有用,但也意味著在單執行緒環境中可能會有效能損失。
  3. LinkedList
    • 底層結構LinkedList 是基於雙向連結串列實現的。
    • 隨機訪問效能:由於是基於連結串列實現的,LinkedList 在隨機訪問時效能較差,時間複雜度為 O(n),因為它需要從頭開始遍歷連結串列直到找到目標元素。
    • 插入和刪除效能LinkedList 在列表的任何位置插入或刪除元素時效能都很好,時間複雜度為 O(1),因為只需要更改幾個節點的指標即可。
    • 記憶體佔用LinkedList 通常比 ArrayList 佔用更多的記憶體,因為每個元素都需要儲存額外的指標(指向前一個和後一個元素的指標)。
    • 執行緒安全LinkedList 是非執行緒安全的。

在選擇這三種列表實現時,需要根據具體的應用場景來決定。如果需要頻繁的隨機訪問,ArrayList 可能是更好的選擇。如果需要頻繁的插入和刪除操作,尤其是在列表的開頭或中間,LinkedList 可能更合適。而如果需要執行緒安全的集合,可以考慮使用 Vector 或者 Collections.synchronizedList 方法包裝 ArrayList

Collection 和Collections 的區別?

  1. Collection
    • Collection 是一個介面,它是Java集合框架中最基本的介面之一。
    • 它定義了一組方法,這些方法可以對集合進行操作,如新增、刪除、遍歷等。
    • Collection 介面是其他具體集合介面的父介面,如 ListSet
    • Collection 介面本身不提供任何實現,它只是定義了一組操作集合的標準方法。
  2. Collections
    • Collections 是一個包含靜態方法的工具類,它提供了一系列操作或返回各種型別的不可變或可變集合的實用方法。
    • 它包含了一些有用的靜態方法,如排序(sort)、搜尋(binarySearch)、反轉(reverse)、填充(fill)等。
    • Collections 類還提供了一些工廠方法來建立不可修改的集合、同步集合等。
    • Collections 類中的所有方法都是靜態的,因此你可以直接透過類名呼叫它們,而不需要建立 Collections 類的例項。

List、Map、Set 三個介面存取元素時,各有什麼特點?`

  1. List
    • 存元素:在 List 中,元素是按照它們被插入的順序儲存的。你可以使用 add(index, element) 方法在特定位置插入元素,或者使用 add(element) 在列表末尾新增元素。
    • 取元素:可以透過索引直接訪問元素,例如 get(index) 方法。也可以使用迭代器或增強的for迴圈遍歷 List
    • 特點:允許元素重複,可以有多個相同的元素。
  2. Map
    • 存元素:在 Map 中,元素是以鍵值對的形式儲存的。使用 put(key, value) 方法將鍵和值存入 Map。如果鍵已經存在,則其對應的值會被更新。
    • 取元素:可以透過鍵來獲取對應的值,使用 get(key) 方法。也可以透過鍵集檢視、值集檢視或條目集檢視來遍歷 Map
    • 特點:不允許鍵重複,每個鍵最多隻能對映到一個值。值可以重複。
  3. Set
    • 存元素:在 Set 中,元素是唯一的,不允許有重複的元素。使用 add(element) 方法新增元素。如果集合中已經存在該元素,則新增操作不會改變集合。
    • 取元素:通常使用迭代器或增強的for迴圈來遍歷 Set,因為 Set 通常不保證元素的順序。
    • 特點:不允許元素重複,每個元素都是唯一的。

相關文章