Java集合框架

集合:

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兩種遍歷方式。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末绎巨,一起剝皮案震驚了整個(gè)濱河市近尚,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌场勤,老刑警劉巖戈锻,帶你破解...
    沈念sama閱讀 217,509評(píng)論 6 504
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異和媳,居然都是意外死亡格遭,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,806評(píng)論 3 394
  • 文/潘曉璐 我一進(jìn)店門留瞳,熙熙樓的掌柜王于貴愁眉苦臉地迎上來拒迅,“玉大人,你說我怎么就攤上這事她倘¤滴ⅲ” “怎么了?”我有些...
    開封第一講書人閱讀 163,875評(píng)論 0 354
  • 文/不壞的土叔 我叫張陵硬梁,是天一觀的道長(zhǎng)前硫。 經(jīng)常有香客問我,道長(zhǎng)荧止,這世上最難降的妖魔是什么开瞭? 我笑而不...
    開封第一講書人閱讀 58,441評(píng)論 1 293
  • 正文 為了忘掉前任,我火速辦了婚禮罩息,結(jié)果婚禮上嗤详,老公的妹妹穿的比我還像新娘。我一直安慰自己瓷炮,他們只是感情好葱色,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,488評(píng)論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著娘香,像睡著了一般苍狰。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上烘绽,一...
    開封第一講書人閱讀 51,365評(píng)論 1 302
  • 那天淋昭,我揣著相機(jī)與錄音,去河邊找鬼安接。 笑死翔忽,一個(gè)胖子當(dāng)著我的面吹牛闪水,可吹牛的內(nèi)容都是我干的振湾。 我是一名探鬼主播,決...
    沈念sama閱讀 40,190評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼始腾!你這毒婦竟也來了仁连?” 一聲冷哼從身側(cè)響起蓝丙,我...
    開封第一講書人閱讀 39,062評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤邪铲,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后龙巨,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體笼呆,經(jīng)...
    沈念sama閱讀 45,500評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,706評(píng)論 3 335
  • 正文 我和宋清朗相戀三年旨别,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了诗赌。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 39,834評(píng)論 1 347
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡昼榛,死狀恐怖境肾,靈堂內(nèi)的尸體忽然破棺而出剔难,到底是詐尸還是另有隱情胆屿,我是刑警寧澤,帶...
    沈念sama閱讀 35,559評(píng)論 5 345
  • 正文 年R本政府宣布偶宫,位于F島的核電站非迹,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏纯趋。R本人自食惡果不足惜憎兽,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,167評(píng)論 3 328
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望吵冒。 院中可真熱鬧纯命,春花似錦、人聲如沸痹栖。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,779評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽揪阿。三九已至疗我,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間南捂,已是汗流浹背吴裤。 一陣腳步聲響...
    開封第一講書人閱讀 32,912評(píng)論 1 269
  • 我被黑心中介騙來泰國(guó)打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留溺健,地道東北人麦牺。 一個(gè)月前我還...
    沈念sama閱讀 47,958評(píng)論 2 370
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親枕面。 傳聞我的和親對(duì)象是個(gè)殘疾皇子愿卒,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,779評(píng)論 2 354

推薦閱讀更多精彩內(nèi)容

  • title: java集合框架學(xué)習(xí)總結(jié) tags:集合框架 categories:總結(jié) date: 2017-03...
    行徑行閱讀 1,685評(píng)論 0 2
  • 最近在研究java源碼,就是看一看別人寫好的東西潮秘,也不算是研究琼开。知根知底的對(duì)以后的學(xué)習(xí)會(huì)有很大的幫助,我先去了解一...
    蘇州丸子閱讀 810評(píng)論 0 5
  • 母親是家里的“定海神針”枕荞。 我出生在滇西北一個(gè)小縣城近郊的農(nóng)村家庭柜候,母親是個(gè)淳樸、勤勞的農(nóng)村婦女躏精。平日里母親隨著父...
    暗夜月沙閱讀 526評(píng)論 15 35
  • 一渣刷、文件名 二、顯示名稱
    Asa_Guo閱讀 193評(píng)論 0 0
  • 1. 25條關(guān)于提高app性能的技巧 作者: HuyaRC原文地址:http://www.reibang.com/...
    Ashen_閱讀 344評(píng)論 0 2