集合:
1欺冀,是可以存儲(chǔ)很多元素的容器树绩。
2,這個(gè)容器用于存儲(chǔ)對(duì)象隐轩。
3饺饭,而且該容器的長(zhǎng)度是可變的。
集合和數(shù)組的區(qū)別:
1职车,
數(shù)組是固定長(zhǎng)度瘫俊,
集合是可變長(zhǎng)度。
2悴灵,
數(shù)組可以存儲(chǔ)引用類型扛芽,也可以存儲(chǔ)基本類型。
集合只能存儲(chǔ)引用類型积瞒。
集合框架的由來:
集合有很多種川尖,因?yàn)槊恳粋€(gè)集合中的數(shù)據(jù)結(jié)構(gòu)(數(shù)據(jù)在容器中存取的具體的方式)都不一樣。
但都具備共性功能茫孔,就不斷地向上抽取叮喳。就形成了集合框架。該框架的頂層Collection接口缰贝。
學(xué)習(xí)框架原則:看頂層馍悟,用底層。
了解一下api中的Collection中的共性方法剩晴。
Collection中的共性方法:
1锣咒,添加:
add(Object)
addAll(collection)
2,刪除:
remove(object)
removeAll(collection)
clear();
retainAll(collection);
3李破,判斷:
contains(object)
containsAll(collection)
isEmpty();
4宠哄,獲纫冀:
size();
iterartor();獲取迭代器嗤攻。每一個(gè)集合都具備。
5诽俯,轉(zhuǎn)換
toArray(); 將集合轉(zhuǎn)成數(shù)組妇菱。
迭代器的使用:
for(Iterator it = collection.iterator(); it.hasNext() ; ){
System.out.println(it.next());
}
迭代器:是容器中的一個(gè)內(nèi)部類承粤,因?yàn)樵擃愐苯釉L問容器中的元素。
同時(shí)對(duì)外提供了公共的訪問規(guī)則Iterator接口闯团。
這樣的好處辛臊,不需要知道具體的容器,只要是Collection中的容器
都可以通過該種取出方法取出體系中的所有容器中的元素房交。
降低了具體容器和取出方式的耦合性彻舰。
想要獲取集合中的迭代器對(duì)象,就可以通過iterator方法來完成候味。
Collection
- List :有序的(存入的順序和取出的順序保持一致)刃唤,該集合中的元素都有索引,可以有重復(fù)元素白群。
- Set :不允許有重復(fù)元素尚胞。
List:特有方法:都是圍繞的索引展開的。
1帜慢,添加:
add(index,element);
add(index,collection);
2笼裳,獲取:
get(index):通過角標(biāo)獲取元素粱玲。
indexOf(object);
lastIndexOf(object);
subList(fromindex,toindex);
3躬柬,刪除:
remove(index):通過角標(biāo)刪除元素,并返回被刪除的元素密幔。
4楔脯,修改:
set(index,element);
5,特有的迭代器胯甩。ListIterator昧廷。可以在迭代時(shí)進(jìn)行元素的增刪改查偎箫。
List具備著對(duì)容器中的元素進(jìn)行增刪改查的功能木柬。只有該集合有。為啥呢淹办?因?yàn)樗饕?/p>
List
- Vector:底層數(shù)據(jù)結(jié)構(gòu)是一個(gè)數(shù)組眉枕。 而且數(shù)組可以增長(zhǎng)。其實(shí)數(shù)組增長(zhǎng)的原理:存儲(chǔ)元素時(shí)怜森,超出數(shù)組角標(biāo)速挑,會(huì)創(chuàng)建新數(shù)組,將原數(shù)組的數(shù)據(jù)復(fù)制到新數(shù)組中副硅,并將新元素存儲(chǔ)到新數(shù)組中姥宝。它是同步的。效率非常低恐疲。
- ArrayList:底層數(shù)據(jù)結(jié)構(gòu)也是可變長(zhǎng)度的數(shù)組腊满,是不同步的套么,比Vector效率高。查詢?cè)氐乃俣群芸臁?/li>
- LinkedList:底層數(shù)據(jù)結(jié)構(gòu)是鏈表數(shù)據(jù)結(jié)構(gòu)碳蛋,是不同步的胚泌。對(duì)元素的增刪操作很快。
Set
- HashSet:數(shù)據(jù)結(jié)構(gòu)是哈希表肃弟,是不同步的玷室。
- TreeSet:數(shù)據(jù)結(jié)構(gòu)是二叉樹結(jié)構(gòu)。是不同步的笤受≌笪可以對(duì)Set集合中的元素進(jìn)行指定方式的排序。默認(rèn)用的元素的自然排序感论。
Collection集合的子類對(duì)象閱讀技巧绅项。
具體的容器是什么結(jié)構(gòu)?是否是同步比肄?
通過名稱就可以獲得快耿。容器的前綴名是數(shù)據(jù)結(jié)構(gòu)的名字。后綴名是所屬體系的名字芳绩。
凡是后綴名是體系名的集合掀亥,通常都是不同步的。
- ArrayList:數(shù)據(jù)結(jié)構(gòu)是數(shù)組妥色。所屬于List體系搪花。看到數(shù)組必須想到索引嘹害,必須要知道查詢速度快撮竿。
- LinkedList:數(shù)據(jù)結(jié)構(gòu)是鏈表,看到鏈表就要想到笔呀,增刪速度快幢踏,而且要接的 add,get许师,remove的first last方法房蝉。
- HashSet:數(shù)據(jù)結(jié)構(gòu)是哈希表,看到哈希就必須想到對(duì)元素進(jìn)行hashCode和equals方法的復(fù)寫微渠。
- TreeSet:數(shù)據(jù)結(jié)構(gòu)是二叉樹,看到樹搭幻,就要想到比較排序,就要想到兩個(gè)接口逞盆,Comparable Comparator檀蹋。
(二叉樹結(jié)構(gòu)也叫紅黑結(jié)構(gòu)左紅右黑)默認(rèn)元素的自然排序∧苫鳎可以對(duì)Set集合中的元素進(jìn)行指定方式的排序续扔。TreeSet判斷元素唯一性的方式是比較方法的返回值是否為0,如果是0視為元素相同焕数,不存纱昧。如果比較時(shí)主要條件相同就要看次要條件。弊端是不能存重復(fù)的
哈希表提升了查詢速度堡赔,并保證了元素的唯一性识脆,元素不唯一性會(huì)破壞表結(jié)構(gòu)。
如果哈希值不同善已,直接存灼捂。如果哈希值相同,要進(jìn)一步判斷內(nèi)容是否相同换团,用的是equals方法悉稠,如果equals返回true是相同元素則不存。如果返回false艘包,不相同的猛,則存儲(chǔ)
元素要往哈希表結(jié)構(gòu)的容器中存儲(chǔ),必須具備hashCode和equals方法想虎,Object中已經(jīng)提供了這兩個(gè)方法卦尊。堆內(nèi)存(存數(shù)據(jù),對(duì)象)用的數(shù)據(jù)就是哈希表舌厨。因?yàn)閷?duì)象的自身特點(diǎn)不同岂却,有可能哈希算法的依據(jù)也不同。所以有可能要覆蓋hashCode方法裙椭。Object的hashCode方法是本地方法調(diào)用的是windows的底層算法 幾乎很少有沖突躏哩,,所以就沒法保證唯一性揉燃,所以要定義自己的算法來覆蓋震庭。
技巧:為了保證唯一 一般在age后乘以一個(gè)數(shù),因?yàn)楹苡锌赡軆蓚€(gè)人名字不同年齡不同但是算出的哈希值相同你雌,這樣會(huì)多判斷一次equals器联,equals進(jìn)棧會(huì)低效,所以為保證性能與唯一
乘以個(gè)數(shù)婿崭。拨拓。。氓栈。
TreeSet 不讓它自動(dòng)排序 可以控制return值 存入順序和取出順序一致則return正數(shù) 存入順序和取出順序相反return負(fù)數(shù)渣磷。
TreeSet判斷元素唯一性的方式,是比較方法的返回值是否為0.如果是0授瘦,視為元素相同醋界,不存竟宋。
排序方式有兩種:
1,讓元素自身具備比較性形纺,該元素需要實(shí)現(xiàn)Comparable接口丘侠,覆蓋compareTo方法。讓元素具備了自然排序逐样。該種方式有弊端蜗字,如果元素自身具備的自然排序不是所需要的,怎么辦脂新?還有挪捕,萬一元素根本就不具備自然排序怎么辦?
2争便,可以讓容器自身具備比較性级零,而且應(yīng)該添加元素之前。所以應(yīng)該在容器對(duì)象創(chuàng)建時(shí)滞乙,就必須明確比較性妄讯。那就應(yīng)該參考該容器的構(gòu)造函數(shù)。發(fā)現(xiàn)可以指定一個(gè)比較器酷宵,定義一個(gè)Comparator接口的子類亥贸,并覆蓋compare方法。將Comparator接口的子類對(duì)象作為參數(shù)傳遞給TreeSet集合的構(gòu)造函數(shù)浇垦。
數(shù)據(jù)結(jié)構(gòu):數(shù)據(jù)存取的方式結(jié)構(gòu)
兩種數(shù)據(jù)結(jié)構(gòu):
堆棧:先進(jìn)后出First In Last Out (FILO)
隊(duì)列:先進(jìn)先出First In First Out (FIFO)
既要速度快 又要有序 可以選擇LinkedHashSet
Map
Map實(shí)現(xiàn)類用于保存具有映射關(guān)系的數(shù)據(jù)炕置。Map保存的每項(xiàng)數(shù)據(jù)都是key-value對(duì),也就是由key和value兩個(gè)值組成男韧。Map里的key是不可重復(fù)的朴摊,key用戶標(biāo)識(shí)集合里的每項(xiàng)數(shù)據(jù)。同一個(gè)Map對(duì)象的任何兩個(gè)key通過equals方法比較總是返回false此虑。
HashMap甚纲,TreeMap是我們經(jīng)常會(huì)用到的集合類。
Map集合與Set集合朦前、List集合的關(guān)系
1.與Set集合的關(guān)系
如果 把Map里的所有key放在一起看介杆,它們就組成了一個(gè)Set集合(所有的key沒有順序,key與key之間不能重復(fù))韭寸,實(shí)際上Map確實(shí)包含了一個(gè)keySet()方法春哨,用戶返回Map里所有key組成的Set集合。
2.與List集合的關(guān)系
如果把Map里的所有value放在一起來看恩伺,它們又非常類似于一個(gè)List:元素與元素之間可以重復(fù)赴背,每個(gè)元素可以根據(jù)索引來查找,只是Map中索引不再使用整數(shù)值,而是以另外一個(gè)對(duì)象作為索引凰荚。
怎樣決定何時(shí)使用HashMap何時(shí)使用TreeMap?
對(duì) 于插入燃观、刪除、定位元素頻繁的操作便瑟,HashMap提供了最好的效率缆毁。如果想要按key的排序來遍歷,那么TreeMap是不二選擇胳徽。某些情況下,依賴集 合的大小爽彤,先向HashMap中添加元素养盗,然后轉(zhuǎn)換為TreeMap再按key的排序進(jìn)行遍歷也許會(huì)帶來效率上的提高。
HashMap
HashMap的數(shù)據(jù)結(jié)構(gòu):
數(shù)組的特點(diǎn)是:尋址容易适篙,插入和刪除困難往核;
而鏈表的特點(diǎn)是:尋址困難,插入和刪除容易嚷节。
哈希表結(jié)合了兩者的優(yōu)點(diǎn)聂儒。
哈希表有多種不同的實(shí)現(xiàn)方法,可以理解將此理解為“鏈表的數(shù)組”
HashTable與HashMap的區(qū)別
HashTable和HashMap存在很多的相同點(diǎn)硫痰,但是他們還是有幾個(gè)比較重要的不同點(diǎn)衩婚。
我們從他們的定義就可以看出他們的不同,HashTable基于Dictionary類效斑,而HashMap是基于AbstractMap非春。Dictionary是什么?它是任何可將鍵映射到相應(yīng)值的類的抽象父類缓屠,而AbstractMap是基于Map接口的骨干實(shí)現(xiàn)奇昙,它以最大限度地減少實(shí)現(xiàn)此接口所需的工作。
HashMap可以允許存在一個(gè)為null的key和任意個(gè)為null的value敌完,但是HashTable中的key和value都不允許為null储耐。如下:當(dāng)HashMap遇到為null的key時(shí),它會(huì)調(diào)用putForNullKey方法來進(jìn)行處理滨溉。對(duì)于value沒有進(jìn)行任何處理什湘,只要是對(duì)象都可以。
Hashtable的方法是同步的晦攒,而HashMap的方法不是禽炬。所以有人一般都建議如果是涉及到多線程同步時(shí)采用HashTable,沒有涉及就采用HashMap勤家,但是在Collections類中存在一個(gè)靜態(tài)方法:synchronizedMap()腹尖,該方法創(chuàng)建了一個(gè)線程安全的Map對(duì)象,并把它作為一個(gè)封裝的對(duì)象來返回,所以通過Collections類的synchronizedMap方法是可以我們你同步訪問潛在的HashMap热幔。
遍歷不同:HashMap僅支持Iterator的遍歷方式乐设,Hashtable支持Iterator和Enumeration兩種遍歷方式。