List、Set、Map 是否繼承自Collection 介面?
List
是一個介面,它繼承自Collection
介面。List
介面定義了一個有序的集合,可以包含重複的元素。Set
也是一個介面,它繼承自Collection
介面。Set
介面定義了一個不允許重複元素的集合。Map
則不同,它不是一個繼承自Collection
介面的介面。Map
提供了鍵值對的儲存,它繼承自Map
介面本身,而不是Collection
。Map
介面不繼承自Collection
,因為它的行為和Collection
介面所定義的行為不同。Map
介面中的集合檢視(鍵集檢視、值集檢視和條目集檢視)實現了Collection
介面。
所以,總結來說,List
和 Set
繼承自 Collection
介面,而 Map
則不繼承自 Collection
介面。
闡述ArrayList、Vector、LinkedList 的儲存效能和特性?
- ArrayList
- 底層結構:
ArrayList
基於動態陣列實現,可以看作是可以動態增長和縮小的陣列。 - 插入和刪除效能:在列表的末尾新增元素(或在任何位置插入元素,但不包括列表的開頭)時,效能較好,因為只需要移動插入點後面的元素。但如果在列表的開頭或中間插入或刪除元素,可能需要移動大量元素,這會導致效能下降,時間複雜度為 O(n)。
- 記憶體佔用:
ArrayList
通常佔用的記憶體比LinkedList
少,因為它不需要為每個元素儲存額外的指標。 - 執行緒安全:
ArrayList
是非執行緒安全的。
- 底層結構:
- Vector
- 底層結構:
Vector
也是基於動態陣列實現的,與ArrayList
類似,但它是同步的。 - 隨機訪問效能:和
ArrayList
一樣,Vector
在隨機訪問時效能也很好,時間複雜度為 O(1)。 - 插入和刪除效能:與
ArrayList
類似,Vector
在列表末尾新增元素時效能較好,但在列表開頭或中間插入或刪除元素時效能較差,時間複雜度為 O(n)。 - 記憶體佔用:
Vector
通常比ArrayList
佔用更多的記憶體,因為它是同步的,需要額外的記憶體來支援執行緒安全。 - 執行緒安全:
Vector
是執行緒安全的,因為它的所有公共方法都是同步的,這在多執行緒環境中很有用,但也意味著在單執行緒環境中可能會有效能損失。
- 底層結構:
- LinkedList
- 底層結構:
LinkedList
是基於雙向連結串列實現的。 - 隨機訪問效能:由於是基於連結串列實現的,
LinkedList
在隨機訪問時效能較差,時間複雜度為 O(n),因為它需要從頭開始遍歷連結串列直到找到目標元素。 - 插入和刪除效能:
LinkedList
在列表的任何位置插入或刪除元素時效能都很好,時間複雜度為 O(1),因為只需要更改幾個節點的指標即可。 - 記憶體佔用:
LinkedList
通常比ArrayList
佔用更多的記憶體,因為每個元素都需要儲存額外的指標(指向前一個和後一個元素的指標)。 - 執行緒安全:
LinkedList
是非執行緒安全的。
- 底層結構:
在選擇這三種列表實現時,需要根據具體的應用場景來決定。如果需要頻繁的隨機訪問,ArrayList
可能是更好的選擇。如果需要頻繁的插入和刪除操作,尤其是在列表的開頭或中間,LinkedList
可能更合適。而如果需要執行緒安全的集合,可以考慮使用 Vector
或者 Collections.synchronizedList
方法包裝 ArrayList
。
Collection 和Collections 的區別?
- Collection
Collection
是一個介面,它是Java集合框架中最基本的介面之一。- 它定義了一組方法,這些方法可以對集合進行操作,如新增、刪除、遍歷等。
Collection
介面是其他具體集合介面的父介面,如List
和Set
。Collection
介面本身不提供任何實現,它只是定義了一組操作集合的標準方法。
- Collections
Collections
是一個包含靜態方法的工具類,它提供了一系列操作或返回各種型別的不可變或可變集合的實用方法。- 它包含了一些有用的靜態方法,如排序(
sort
)、搜尋(binarySearch
)、反轉(reverse
)、填充(fill
)等。 Collections
類還提供了一些工廠方法來建立不可修改的集合、同步集合等。Collections
類中的所有方法都是靜態的,因此你可以直接透過類名呼叫它們,而不需要建立Collections
類的例項。
List、Map、Set 三個介面存取元素時,各有什麼特點?`
- List
- 存元素:在
List
中,元素是按照它們被插入的順序儲存的。你可以使用add(index, element)
方法在特定位置插入元素,或者使用add(element)
在列表末尾新增元素。 - 取元素:可以透過索引直接訪問元素,例如
get(index)
方法。也可以使用迭代器或增強的for迴圈遍歷List
。 - 特點:允許元素重複,可以有多個相同的元素。
- 存元素:在
- Map
- 存元素:在
Map
中,元素是以鍵值對的形式儲存的。使用put(key, value)
方法將鍵和值存入Map
。如果鍵已經存在,則其對應的值會被更新。 - 取元素:可以透過鍵來獲取對應的值,使用
get(key)
方法。也可以透過鍵集檢視、值集檢視或條目集檢視來遍歷Map
。 - 特點:不允許鍵重複,每個鍵最多隻能對映到一個值。值可以重複。
- 存元素:在
- Set
- 存元素:在
Set
中,元素是唯一的,不允許有重複的元素。使用add(element)
方法新增元素。如果集合中已經存在該元素,則新增操作不會改變集合。 - 取元素:通常使用迭代器或增強的for迴圈來遍歷
Set
,因為Set
通常不保證元素的順序。 - 特點:不允許元素重複,每個元素都是唯一的。
- 存元素:在