? ? ? ?Java集合在某種程度上可以說是對一些數(shù)據(jù)結(jié)構(gòu)與算法的封裝喊熟,并給出相應(yīng)的接口挽拂,這充分的體現(xiàn)了面向?qū)ο缶幊痰乃枷搿?/p>
Java中集合的結(jié)構(gòu)大概如下圖所示:
1.Iterable和Iterator
java.lang.Iterable
java.util.Iterator
? ? ? ?通過它們兩在java中的位置可以看錯(cuò)Iterable是屬于基礎(chǔ)類的一份子,而Iterator是在集合類當(dāng)中。Iterator是迭代器類,而Iterable是接口磷脯,因?yàn)镮terable中封裝了Iterator接口蛾找,只要實(shí)現(xiàn)了Iterable接口的類娩脾,就可以使用Iterator迭代器了。因此List和Set位于Iterable下就不難理解了打毛。
2.List
? ? ? ? List中用的最多的為ArrayList和LinkedList柿赊,這兩個(gè)相當(dāng)于數(shù)組和鏈表的形式,ArrayList是連續(xù)存儲(chǔ)幻枉,LinkList是分散存儲(chǔ)碰声,我們可以自己動(dòng)手寫來模擬這種存儲(chǔ)方式,而他們的優(yōu)缺點(diǎn)也和數(shù)組鏈表的優(yōu)缺點(diǎn)大致相同熬甫,不再陳述胰挑。
? ? ? MyArrayList,MyLinkedList
? ? ? 而Java作為面向?qū)ο笳Z音椿肩,也為我們封裝了很多方法瞻颂,以便于對List進(jìn)行操作:
? ? ? int size() :獲得數(shù)據(jù)個(gè)數(shù)
? ? ? boolean contains(Object o) :是否包含數(shù)據(jù)o
? ? ? int indexOf(Object o) :返回元素o第一次出現(xiàn)的位置
? ? ? Object[] toArray(): 轉(zhuǎn)換成長度固定的數(shù)組
? ? ? get(int index) :返回第index個(gè)元素
? ? ? add(E e):向最后添加元素。數(shù)據(jù)可以重復(fù)
? ? ? add(int index, E element):某個(gè)位置之后添加元素
? ? ? remove(int index):刪除一個(gè)位置的元素
? ? ? remove(Object o):刪除元素o
? ? ? void clear():清空
3.Set
? ? ? ?Set郑象,類似于數(shù)學(xué)中的集合贡这,他存儲(chǔ)的元素是不重復(fù)的,Set中的數(shù)據(jù)都是只有一份厂榛,并且Set中的數(shù)據(jù)不是以鍵值對存儲(chǔ)的盖矫,以下是Set中一些常用的方法:
? ? ? boolean contains(Object o):判斷是否存在元素o
? ? ? add(E e) :添加元素到集合
? ? ? remove(Object o) :從集合移除
? ? ? int size() :獲取個(gè)數(shù)
? ? ? boolean isEmpty():是否空
? ? ? void clear() :清空
4.Map
? ? ? ?首先實(shí)現(xiàn)了Map接口的類的數(shù)據(jù)的存儲(chǔ)都是以鍵值對的形式來進(jìn)行存儲(chǔ)的,而在實(shí)際中用的最多的就是HashMap击奶,要了解什么是HashMap辈双,要先了解什么是哈希算法。簡單來說柜砾,哈希算法就是根據(jù)一定的規(guī)則湃望,計(jì)算一個(gè)數(shù)據(jù)應(yīng)該放到哪個(gè)地址,因此,就有一定的幾率使得兩個(gè)完全不同的數(shù)據(jù)計(jì)算得到的地址是一樣的喜爷,而一個(gè)好的哈希算法是使這種情況發(fā)生的幾率最小冗疮。
? ? ? HashMap中數(shù)據(jù)進(jìn)行存儲(chǔ)時(shí)鍵不能重復(fù),但值可以重復(fù)檩帐,這就造成了數(shù)據(jù)的存儲(chǔ)略慢术幔,但是查詢速度快,理論上來講查詢速度和數(shù)據(jù)量無關(guān)湃密。正所謂魚與熊掌不可兼得诅挑,編程也是這樣的,同樣只要了解其基本原理泛源,在某種程度上就可以說已經(jīng)學(xué)會(huì)了HashMap拔妥,這得力于Java中封裝的大量方法:
? ? ? int size() :鍵值對條數(shù)
? ? ? V get(Object key) :根據(jù)鍵獲得值。如果不存在這樣的鍵則返回null
? ? ? boolean containsKey(Object key) :判斷鍵是否存在
? ? ? put(K key, V value) :鍵值對放入map达箍。如果已經(jīng)key已經(jīng)存在則用新的鍵值對替換舊的鍵值對没龙,也就是“鍵不能重復(fù)”
? ? ? remove(Object key):根據(jù)鍵移除鍵值對
? ? ? void clear() :清空
? ? ? Set keySet() :得到所有的key,返回值是Set類型缎玫。
5.泛型
? ? ? ?泛型硬纤,簡單來講,就是人為規(guī)定了參數(shù)的標(biāo)準(zhǔn)赃磨,或者類型筝家,除了我規(guī)定的類型外都不可以傳進(jìn)來,Java中除了集合可以使用外我們也可以自己定義泛型邻辉,方法也很簡單:在類名后面用<>聲明類型的“代替符號”溪王,然后類中需要用這個(gè)類型的地方用這個(gè)名字就行。
? ? ? 泛型不能使用int值骇、double莹菱、boolean等原始類型,而應(yīng)使用比如Integer雷客、Double芒珠、Boolean等包裝類型,怎樣去判斷一個(gè)類型是基本類型還是包裝類型呢:首字母大寫是包裝類型搅裙,小寫為基本類型皱卓。這也解釋了Java中String為什么有那么多的方法,因?yàn)椤八氖鬃帜甘谴髮懙摹辈看.?dāng)然用的時(shí)候是可以使用原始類型娜汁,因?yàn)橛胁鹣溲b箱。
? ? ? Java數(shù)組支持協(xié)變兄朋,什么是協(xié)變呢掐禁,簡單說就是父類相關(guān)的變量可以指向子類相關(guān)的對象,但泛型是不支持協(xié)變。
? ? ? ArrayList list1 = new ArrayList<String>() 這樣定義是沒錯(cuò)的傅事,但list1變量是不支持泛型的缕允,而且放進(jìn)去其他類型編譯時(shí)、運(yùn)行時(shí)也不報(bào)錯(cuò)蹭越,為什么這樣:因?yàn)橛蟹盒筒脸?br>
ArrayList list1 = new ArrayList<String>() ;
ArrayList<String> list2 = new ArrayList();
ArrayList list3 <String>= new ArrayList<String>();
? ? ? 泛型擦除是java文件編譯為class文件是做的鬼障本,如果將class文件反編譯為java文件,那么响鹃,上面三條語句會(huì)變成這樣:
ArrayList list1 = new ArrayList() ;
ArrayList<String> list2 = new ArrayList();
ArrayList list3<String> = new ArrayList();
? ? ? 正向編譯時(shí)驾霜,會(huì)自動(dòng)去除后面的<String>,因此第一中實(shí)例化沒有實(shí)習(xí)泛型买置,第二三中實(shí)現(xiàn)了泛型粪糙,為了保證良好的習(xí)慣,應(yīng)采取第三種書寫方式忿项。
? ? ? 用泛型集合編寫代碼的時(shí)候可以避免放入數(shù)據(jù)類型錯(cuò)誤蓉冈,并且取數(shù)據(jù)的時(shí)候避免類型轉(zhuǎn)換。當(dāng)然倦卖,泛型也有不好的地方:
? ? ? 1洒擦、運(yùn)行時(shí)無法得知對象的泛型類型信息。比如無法用arr instanceof LinkedList判斷
? ? ? 2怕膛、一旦轉(zhuǎn)換為非泛型變量,那么就有放入非法數(shù)據(jù)的可能性秦踪。沒有根除的辦法褐捻。
? ? ? 3、不同類型的泛型不能構(gòu)成重載方法椅邓。例如:
static void m1(LinkedList<Integer> list)
static void m1(LinkedList<String> list)
static void m1(LinkedList list)
? ? ? 上面三種方法是不能構(gòu)成重載方法的。
5-1.有界類型
有界類型是指景馁,在指定一個(gè)類型參數(shù)時(shí)板壮,可以指定一個(gè)上界,聲明所有的實(shí)際類型都必須是這個(gè)超類的直接或間接子類合住,比如:
class className<T extends superclass>
6.其它總結(jié)
? ? ? Stack(棧):先入后出绰精。push放入數(shù)據(jù),pop取出數(shù)據(jù)
? ? ? Queue(隊(duì)列):先入先出透葛。offer入隊(duì)笨使,poll出隊(duì)
? ? ? Vector、Hashtable被廢棄僚害,不推薦使用硫椰。