06.07 「javaSE基礎」2018面試-java集合(二)

1、List、Map和Set的區別?

結構特點:List和Set是存儲單列數據的集合,Map是存儲鍵和值的雙列數據的集合;List存儲的數據是有順序的,並允許重複;Map中存儲的數據是沒有順序的,其鍵不能重複的,它的值是可以重複的;Set中存儲的數據是無序的,且不允許有重複,但元素在集合中的位置是由hashCode決定,位置是固定的(Set集合根據hashCode來進行數據的存儲,所以位置是固定的,但位置不是用戶可以固定的,所以Set存儲的數據對於用戶來說是無序的。)

實現類:List接口有三個實現類(LinkedList:基於鏈表實現,鏈表內部是散亂的,每一個元素存儲本身內存地址的同時還存儲了下一元素的地址。鏈表增刪快,查找慢;ArrayList:基於數組實現,非線程安全,效率高,便於查詢,但增刪相對較慢;Vector:基於數組實現,線程安全,效率低)。Map接口有三個實現類(HashMap:基於Hash表的Map接口實現,非線程安全,高效,支持null值和null鍵;HashTable:線程安全,低效,不支持null值和null鍵;LinkedHashMap:是Has和Map的一個子類,保存了記錄的插入順序;SortMap接口:TreeMap,能夠把它保存的記錄根據鍵排序,默認按鍵值的升序排列)。Set接口有兩個實現類(HashSet:底層由HashMap實現,不允許集合中有重複的值,使用該方法時需要重寫equals()和hashCode()方法;LinkedHashSet:繼承於HashSet,同時又基於LinkedHashMap來進行實現,底層使用的是LinkedHashMap)。

2、數組和鏈表適用於什麼場景,為什麼?

首先了解一下內存中的存儲形式分為連續存儲和離散存儲兩種,分別對應我們常說的數組和鏈表。內存分配圖如下:

「javaSE基礎」2018面試-java集合(二)

內存分配

區別數組是將元素在內存中連續存儲的;它的優點:由於數據是連續存儲的,所以內存地址是連續的,查找數據的時候效率比較高;缺點:在存儲之前需要申請一塊連續的內存空間,並且在編譯的時候就必須確定好它的空間大小。在運行的時候空間大小是無法隨著你的需要進行增加和減少而改變的,當數據量比較大的時候,有可能出現越界的情況,數據量比較小的時候,又有可能會浪費內存空間。在對數據進行增加、刪除的時候效率比較低。鏈表是動態申請內存空間,不需要提前申請好內存空間大小,鏈表只需要在用的時候申請就可以,對數據的增加、刪除和插入比數組靈活。鏈表中的數據在內存中可以是任意位置,通過應用來關聯數據(就是通過存在元素的指針來聯繫)

應用場景

  • 數組:數據比較少;經常做的運算是按序號訪問數據元素;數組更容易實現,任何高級語言都支持;構建線性表比較穩定。
  • 鏈表:對線性表的長度或者規模難以預估;頻繁的做插入刪除操作;構建動態性比較強的線性表。

3、List listA = new ArrayList()和ArrayList listB = new ArrayList()的區別?

List listA = new ArrayList();這句創建了一個ArrayList的對象後上溯至List。此時它是一個List對象,有些ArrayList有,但是List沒有的屬性和方法,listA就不能使用了。ArrayList listB = new ArrayList();創建的對象listB則保留了ArrayList的所有屬性。

4、要對ArrayList和LinkedList集合做更新操作時,哪個更合適?

當操作的數據是一列數據的後面添加數據,而不是在前面或中間,並且需要隨機的訪問其中的元素時,使用ArrayList會提供比較好的性能;當操作的數據是在一列數據的前面或中間添加或刪除數據,並且按照順序訪問其中的元素,則LinkedList性能會更佳。

「javaSE基礎」2018面試-java集合(二)


分享到:


相關文章: