前言
子曰:溫故而知新,可以為師矣。
做android已經(jīng)有好一段時(shí)間了,今天突然看到代碼中寫的各種用來存儲(chǔ)數(shù)據(jù)的ArrayList、管理Activity的LinkedList、用來Retrofit請求數(shù)據(jù)時(shí)多個(gè)參數(shù)拼接的HashMap。也許使用已經(jīng)成為了一種習(xí)慣,可是使用他的理由又開始在腦海中慢慢淡化了,故寫一篇文章來溫故 在我們平時(shí)的android開發(fā)中,常用的java集合框架。
正文
這張圖已經(jīng)不陌生了,可是在這么繁瑣的java集合框架中,真正在開發(fā)中使用的不過也就那幾個(gè)。所以我們來看下面這張簡化圖,然后來闡述其中的部分我們常用的:
1、所有的集合都在 java.util 包下,java的集合幾乎是從Collection 和 map這兩個(gè)接口中派生出來的,而這兩個(gè)接口又有一些子類(包括子接口和實(shí)現(xiàn)類)
2、List 繼承于 Collection,允許元素重復(fù),而且會(huì)維護(hù)元素順序;訪問時(shí)可以通過索引去訪問。
3、Set 也繼承于 Collection,保證了元素的唯一性,反之不保證元素的順序;訪問他當(dāng)中的元素時(shí),只能通過元素本身去訪問。
4、Map 是一個(gè)存儲(chǔ)鍵值對的,也就是說你存東西要有鑰匙和箱子,你要找到這個(gè)箱子就必須有鑰匙,就是所謂的 Key - Value;它與Collection沒有任何關(guān)系
5、Iterator 我們叫他迭代器,一般用來遍歷集合中的元素
下面我們再來細(xì)說一下List、Set、Map中的子類
List
上面我們已經(jīng)說了,List是一個(gè)有序的集合。
List中包括一下幾個(gè)部分:
ArrayList
ArrayList應(yīng)該是我們在android開發(fā)中最最最常用的一個(gè)集合了,每一個(gè)ArrayList都會(huì)有一個(gè)初始化容量(10),每次我們add元素的時(shí)候,它都會(huì)對它的容量進(jìn)行檢測,如果控件不足就會(huì)自動(dòng)對其進(jìn)行擴(kuò)容。
它是數(shù)組結(jié)構(gòu),并且它擁有幾個(gè)特點(diǎn): 查找速度快,線程不安全,增刪比較慢。
所有的特點(diǎn)都是相對而言,因?yàn)樗牟檎宜俣瓤欤覀冊诹斜碇械狞c(diǎn)擊事件等都會(huì)需要查找集合中的某個(gè)元素,然后對其進(jìn)行操作,這樣我們就可以很快的相應(yīng)點(diǎn)擊事件。
LinkedList
LinkedList與ArrayList不同,它的實(shí)現(xiàn)方式是雙向鏈表,每次查找元素時(shí)都要遍歷一次,所以它的查找速度就劣于ArrayList。但是由于這個(gè)原因它的插入和刪除都要快一些,
那么它的特點(diǎn)是:查找速度慢,線程不安全,增刪比較快。
Vector
Vector的實(shí)現(xiàn)和操作幾乎和ArrayList是一樣的,唯一一點(diǎn)不同就是 Vector的線程是安全的,所以它的性能沒有ArrayList好;這樣一來,我們就可以根據(jù)其不同的特點(diǎn)去做不同的事情。
Stack
Stack繼承自Vector,實(shí)現(xiàn)一個(gè)后進(jìn)先出的堆棧。它提供了幾個(gè)額外的方法,使得Vector當(dāng)做棧使用,這個(gè)我本人并沒有使用過,如果大家有什么見解可以提出來。
下面附一張圖:
Set
包含以下幾個(gè):
HashSet
HashSet 是一個(gè)沒有重復(fù)元素的集合。它是由HashMap實(shí)現(xiàn)的,不保證元素的順序(這里所說的沒有順序是指:元素插入的順序與輸出的順序不一致),而且HashSet允許使用null。但是只允許有一個(gè)null元素!
LinkedHashSet
LinkedHashSet繼承自HashSet,其底層是基于LinkedHashMap來實(shí)現(xiàn)的,有序,非同步。(LinkedHashSet集合同樣是根據(jù)元素的hashCode值來決定元素的存儲(chǔ)位置,但是它同時(shí)使用鏈表維護(hù)元素的次序。這樣使得元素看起來像是以插入順序保存的,也就是說,當(dāng)遍歷該集合時(shí)候,LinkedHashSet將會(huì)以元素的添加順序訪問集合的元素。)
TreeSet
TreeSet是一個(gè)有序集合,其底層是基于TreeMap實(shí)現(xiàn)的,非線程安全。TreeSet可以確保集合元素處于排序狀態(tài)。
Map
HashMap
以哈希表數(shù)據(jù)結(jié)構(gòu)實(shí)現(xiàn),查找對象時(shí)通過哈希函數(shù)計(jì)算其位置,它是為快速查詢而設(shè)計(jì)的。也是我們最常用的一個(gè)Map集合
LinkedHashMap
它繼承于 HashMap,它保留了輸入順序,所以,如果你要求順序就使用它。
TreeMap
TreeMap 是一個(gè)有序的key-value集合,非同步,基于紅黑樹實(shí)現(xiàn)。 它有兩種排序方式:一種是自然排序,一種是定制排序,具體取決于使用的構(gòu)造方法。 這里不做過多的說明。
補(bǔ)充一張圖:
文章基本上就到這里,文章只是對android開發(fā)過程中常用的一些集合框架做一些個(gè)人理解的東西,如有地方不對或者有不同理解的可以提出來。