首頁  >  文章  >  Java  >  java集合的差異面試題目

java集合的差異面試題目

(*-*)浩
(*-*)浩原創
2019-11-29 15:49:081643瀏覽

java集合的差異面試題目

HashMap 和 Hashtable 有什麼不同?

HashMap 和 Hashtable 都實作了 Map 接口,因此許多特性非常相似。但是,他們有以下不同點: HashMap 允許鍵和值是 null,而 Hashtable 不允許鍵或值是 null。    (建議學習:java面試題目

Hashtable 是同步的,而 HashMap 不是。因此, HashMap 更適合於單執行緒環境,而 Hashtable 適合於多執行緒環境。

HashMap 提供了可供應用迭代的鍵的集合,因此,HashMap 是快速失敗的。另一方面,Hashtable 提供了對鍵的列舉(Enumeration)。

一般認為 Hashtable 是一個遺留的類別。

陣列(Array)和列表(ArrayList)有什麼不同?什麼時候應該使用 Array 而不是 ArrayList?

下面列出了 Array 和 ArrayList 的不同點:

Array 可以包含基本類型和物件類型,ArrayList 只能包含物件類型。

Array 大小是固定的,ArrayList 的大小是動態變化的。

ArrayList 提供了更多的方法和特性,例如:addAll(),removeAll(),iterator()等等。對於基本類型數據,集合使用自動裝箱來減少編碼工作量。但是,當處理固定大小的基本資料類型的時候,這種方式相對比較慢。

ArrayList 和 LinkedList 有什麼不同?

ArrayList 和 LinkedList 都實作了 List 接口,他們有以下的不同點:

ArrayList 是基於索引的資料接口,它的底層是數組。它可以以O(1)時間複雜度對元素進行隨機存取。與此對應,LinkedList 是以元素列表的形式儲存它的數據,每一個元素都和它的前一個和後一個元素連結在一起,在這種情況下,查找某個元素的時間複雜度是O( n)。

相對於 ArrayList,LinkedList 的插入,添加,刪除操作速度更快,因為當元素被添加到集合任意位置的時候,不需要像數組那樣重新計算大小或者是更新索引。

LinkedList 比 ArrayList 更佔內存,因為 LinkedList 為每個節點儲存了兩個引用,一個指向前一個元素,一個指向下一個元素。

也可以參考 ArrayList vs. LinkedList。

Comparable 和Comparator 介面是做什麼的?列出它們的差異。

Java 提供了一個只包含一個 compareTo() 方法的 Comparable 介面。這個方法可以個給兩個物件排序。具體來說,它會傳回負數,0,正數來表示輸入物件小於,等於,大於已經存在的物件。

Java 提供了包含 compare() 和 equals() 兩個方法的 Comparator 介面。 compare() 方法用來給兩個輸入參數排序,傳回負數,0,正數表示第一個參數是小於,等於,大於第二個參數。

equals() 方法需要一個物件作為參數,它用來決定輸入參數是否和 comparator 相等。只有當輸入參數也是一個 comparator 並且輸入參數和當前 comparator 的排序結果是相同的時候,這個方法才會傳回 true。

HashSet 和 TreeSet 有什麼不同?

HashSet 是由一個 hash 表來實現的,因此,它的元素是無序的。 add(),remove(),contains()方法的時間複雜度是 O(1)。

另一方面,TreeSet 是由一個樹狀的結構來實現的,它裡面的元素是有序的。因此,add(),remove(),contains() 方法的時間複雜度是 O(logn)。

HashMap 和 ConcurrentHashMap 的差別?

ConcurrentHashMap 是線程安全的 HashMap 的實作。主要差異如下:

ConcurrentHashMap 對整個桶數組進行了分割分段(Segment),然後在每一個分段上都用lock 鎖進行保護,相對於Hashtable 的syn 關鍵字鎖的粒度更精細了一些,並發性能更好。而 HashMap 沒有鎖機制,不是線程安全的。

HashMap 的鍵值對允許有 null ,但是 ConCurrentHashMap 都不允許

JDK8 之後,ConcurrentHashMap 啟用了一種全新的方式實作,利用 CAS 演算法。

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

List、Set 是,Map 不是。 Map 是鍵值對映射容器,與List 和Set 有明顯的區別,而Set 儲存的零散的元素且不允許重複元素(數學中的集合也是如此),List 是線性結構的容器,適用於按數值索引存取元素的情況。

說出 ArrayList、Vector、LinkedList 的儲存效能和特性?

ArrayList 和Vector 都是使用數組方式存儲數據,此數組元素數大於實際存儲的數據以便增加和插入元素,它們都允許直接按序號索引娶元素,但是插入元素要涉及數組元素移動等內存操作,所以索引資料快而插入資料慢,Vector 由於使用了synchronized 方法(線程安全),通常性能上較ArrayList 差。

而LinkedList 使用雙向鍊錶實現儲存(將記憶體中零散的記憶體單元透過附加的參考關聯起來,形成一個可以按序號索引的線性結構,這種鍊式儲存方式與陣列的連續儲存方式相較於,其實對記憶體的使用率較高),依序號索引資料需要進行前向或後向遍歷,但是插入資料時只需要記錄本項的前後項即可,所以插入速度較快。

Vector 屬於遺留容器(早期的JDK 中使用的容器,除此之外Hashtable、Dictionary、BitSet、Stack、Properties 都是遺留容器),現在已經不建議使用,但由於ArrayList 和LinkedListed 都是非線程安全的,如果需要多個線程操作同一個容器,那麼可以透過工具類Collections 中的synchronizedList 方法將其轉換成線程安全的容器後再使用(這其實是裝潢模式最好的例子,將已有物件傳入另一個類別的建構器中建立新的物件來增加新功能)。

List、Map、Set 三個介面儲存元素時各有什麼特色?

List 是有序的 Collection,使用此介面能夠精確的控制每個元素插入的位置。使用者能夠使用索引(元素在 List 中的位置,類似於陣列下標)來存取 List 中的元素,這類似於 Java 的陣列。

Set 是一種不包含重複的元素的 Collection,即任意的兩個元素 e1 和 e2 都有e1.equals(e2)=false,Set 最多有一個 null 元素。

Map 介面 :請注意,Map 沒有繼承 Collection 接口,Map 提供 key 到 value 的映射

以上是java集合的差異面試題目的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn