1. 程式人生 > >Java中常見資料結構:list與map 的底層實現

Java中常見資料結構:list與map 的底層實現

 Collection(單列集合)

        List(有序,可重複)

            ArrayList

                底層資料結構是陣列,查詢快,增刪慢

                執行緒不安全,效率高

            Vector

                底層資料結構是陣列,查詢快,增刪慢

                執行緒安全,效率低

            LinkedList

                底層資料結構是連結串列,查詢慢,增刪快

                執行緒不安全,效率高

        Set(無序,唯一)

            HashSet

                底層資料結構是雜湊表。

                雜湊表依賴兩個方法:hashCode()和equals()

                執行順序:

                    首先判斷hashCode()值是否相同

                        是:繼續執行equals(),看其返回值

                            是true:說明元素重複,不新增

                            是false:就直接新增到集合

                        否:就直接新增到集合

                最終:

                    自動生成hashCode()和equals()即可

                LinkedHashSet

                    底層資料結構由連結串列和雜湊表組成。

 由連結串列保證元素有序。

                    由雜湊表保證元素唯一。

            TreeSet

                底層資料結構是紅黑樹。(是一種自平衡的二叉樹)

                如何保證元素唯一性呢?

                    根據比較的返回值是否是0來決定

                如何保證元素的排序呢?

                    兩種方式

                        自然排序(元素具備比較性)

                            讓元素所屬的類實現Comparable介面

                        比較器排序(集合具備比較性)

                            讓集合接收一個Comparator的實現類物件

    Map(雙列集合)

        A:Map集合的資料結構僅僅針對鍵有效,與值無關。

        B:儲存的是鍵值對形式的元素,鍵唯一,值可重複。

        HashMap

            底層資料結構是雜湊表。執行緒不安全,效率高

                雜湊表依賴兩個方法:hashCode()和equals()

                執行順序:

                    首先判斷hashCode()值是否相同

                        是:繼續執行equals(),看其返回值

                            是true:說明元素重複,不新增

                            是false:就直接新增到集合

                        否:就直接新增到集合

                最終:

                    自動生成hashCode()和equals()即可

            LinkedHashMap

                底層資料結構由連結串列和雜湊表組成。

                    由連結串列保證元素有序。

                    由雜湊表保證元素唯一。

        Hashtable

            底層資料結構是雜湊表。執行緒安全,效率低

                雜湊表依賴兩個方法:hashCode()和equals()

                執行順序:

                    首先判斷hashCode()值是否相同

                        是:繼續執行equals(),看其返回值

                            是true:說明元素重複,不新增

                            是false:就直接新增到集合

                        否:就直接新增到集合

                最終:

                    自動生成hashCode()和equals()即可

        TreeMap

            底層資料結構是紅黑樹。(是一種自平衡的二叉樹)

如何保證元素唯一性呢?

                    根據比較的返回值是否是0來決定

                如何保證元素的排序呢?

                    兩種方式

                        自然排序(元素具備比較性)

                            讓元素所屬的類實現Comparable介面

                        比較器排序(集合具備比較性)

                            讓集合接收一個Comparator的實現類物件

2.關於集合選取原則

    是否是鍵值物件形式:

        是:Map

            鍵是否需要排序:

                是:TreeMap

                否:HashMap

            不知道,就使用HashMap。    

        否:Collection

            元素是否唯一:

                是:Set

                    元素是否需要排序:

                        是:TreeSet

                        否:HashSet

                    不知道,就使用HashSet

                否:List

                    要安全嗎:

                        是:Vector

                        否:ArrayList或者LinkedList

                            增刪多:LinkedList

                            查詢多:ArrayList

                        不知道,就使用ArrayList

            不知道,就使用ArrayList

3:集合的常見方法及遍歷方式

    Collection:

        add()

        remove()

        contains()

        iterator()

        size()

        遍歷:

 增強for

            迭代器

        |--List

            get()

            遍歷:

                普通for

        |--Set

    Map:

        put()

        remove()

        containskey(),containsValue()

        keySet()

        get()

        value()

        entrySet()

        size()

        遍歷:

            根據鍵找值

            根據鍵值對物件分別找鍵和值



HashMap底層是一個數組+Entry物件的單向列表組成的;在建立是預設不開闢空間;在新增第一個值的時候開闢空間,預設陣列長度為16;Entry裡邊主要包含key、value、next和hash4個值;當給hashmap新增1個值時,首先先把當前值new 成一個entry物件;hash是根據key計算出來的hashcode值。把這個值和陣列的長度求餘,根據這個餘數來確定entry存放在陣列的位置;找到位置以後,首先把位置中原先的值,拿出來,放到當前entry的next裡邊;最後在把當前entry放到這個位置;hashmap的預設擴容因子是0.75;當map中的值超過3/4時,會自動擴容,擴容到原理的2倍;

HashMap底層是一個數組+Entry物件的單向列表組成的;在建立是預設不開闢空間;在新增第一個值的時候開闢空間,預設陣列長度為16;Entry裡邊主要包含key、value、next和hash4個值;當給hashmap新增1個值時,首先先把當前值new 成一個entry物件;hash是根據key計算出來的hashcode值。把這個值和陣列的長度求餘,根據這個餘數來確定entry存放在陣列的位置;找到位置以後,首先把位置中原先的值,拿出來,放到當前entry的next裡邊;最後在把當前entry放到這個位置;hashmap的預設擴容因子是0.75;當map中的值超過3/4時,會自動擴容,擴容到原理的2倍;