2018學習計劃——Java基礎(chǔ)之集合

Java——集合

前言

????????相信做開發(fā)的老鐵們铁追,不管你是做Java姻成、Android、還是其他的語言昙楚,我相信很多都遇到過集合這個名詞近速,而且我相信很多的老鐵在進行大公司面試的時候,一定不可避免的會被問到關(guān)于集合這個問題堪旧,本人以前對這些基礎(chǔ)的東西理解的非常淺削葱,但隨著這幾年的開發(fā)發(fā)現(xiàn)集合對于項目開發(fā)是非常重要的。如果能合理的運用集合的幾個實現(xiàn)類淳梦,那么事情可能達到事半功倍的效果析砸,所以本人也做一些筆記鞏固一下知識。

正文

首先集合的分類:Collection and Map爆袍。但是從源碼的角度去看首繁,發(fā)現(xiàn)這兩個其實本不是java類作郭,而是Java接口,個人覺得這就是Java現(xiàn)在面向接口編程的最忠實的寫照.

Collection:

????????首先我們的知道Collection并不是我們想象中的衍生出它的實現(xiàn)類弦疮,而是實現(xiàn)了另外的兩個接口夹攒,List and Set?衍生出的這兩個接口是互補的。

首先我們必須知道為什么會衍生出兩個接口(兩個接口的不同之處)

Set:

????????是無序并且是不可重復(fù)胁塞,集合中的對象不按特定的方式排序咏尝,只是簡單地把對象加入集合中

List:

????????有序并且是可重復(fù)的,里面存儲的對象是有序的,而且List提供了幾個關(guān)于索引的方法啸罢。查詢速度快编检。因為往list集合里插入或刪除數(shù)據(jù)時,會伴隨著后面數(shù)據(jù)的移動扰才,所有插入刪除數(shù)據(jù)速度慢蒙谓。

兩個接口的不同點說完了,我們來了解一下在集合中不得不提到的一個重要的環(huán)節(jié)

循環(huán)--------------------->平時可能大家說的遍歷训桶。

????????在我們這兩大集合接口中不可獲取的肯定是去遍歷這個集合暖眼,常用List的老鐵們可能在平時的List的使用方法中用到的都是比較傳統(tǒng)方式就是

for(int i = 0;i < list.size();i++){

//處理的邏輯代碼

}

或者是高級for循環(huán)

for(Ob ob:obs){-------------------->這里的ob是我對對象的簡稱,希望大家能夠理解

//處理的邏輯代碼

}

????????以上的這種循環(huán)的處理方式位岔。但是這種方式只能適用于List這個接口實現(xiàn)遍歷的方式校赤,那么我們的Set接口如何來實現(xiàn)遍歷呢。創(chuàng)造集合的大神早已想到了這一點午绳。所以在集合中就衍生了另外一個遍歷集合的另外一個方式

Iterator------>中文名稱叫迭代器置侍。

????????它是專門負責集合的遍歷的一個接口。在它的基礎(chǔ)之上拦焚,也衍生了一個ListIterator這個專門為List專用的迭代器蜡坊。使用的方法也很簡單。首先我們必須獲取到當前List或者是Set整個集合對象的迭代器赎败,然后對整個迭代器進行遍歷秕衙。示例代碼如下:

Iterator iterator = arr.iterator();

while(iterator .hasNext()){

? ? Ob ob = ?iterator.next();

}

就是這么簡單容易。

下面我再來介紹一下List的結(jié)合相關(guān)的子類:ArrayList和LinkedList

????????ArrayList和LinkedList在用法上的區(qū)別:了解這些僵刮,能讓你在日常的開發(fā)中合理的運用相關(guān)的實現(xiàn)類据忘,來提高程序的效率。這也是你做一些大數(shù)據(jù)處理的時候提高程序效率的一個重要的點搞糕。

1勇吊、LinkedList經(jīng)常用在增刪操作較多而查詢操作很少的情況下,ArrayList則相反窍仰。

2汉规、ArrayList是實現(xiàn)了基于動態(tài)數(shù)組的數(shù)據(jù)結(jié)構(gòu),LinkedList基于鏈表的數(shù)據(jù)結(jié)構(gòu)驹吮。

3针史、對于隨機訪問get和set膏燕,ArrayList絕對優(yōu)于LinkedList,因為LinkedList要移動指針悟民。

4坝辫、對于新增和刪除操作add和remove,LinkedList比較占優(yōu)勢射亏,因為ArrayList要移動數(shù)據(jù)近忙。?這一點要看實際情況的。若只對單條數(shù)據(jù)插入或刪除智润,ArrayList的速度反而優(yōu)于LinkedList及舍。但若是批量隨機的插入刪除數(shù)據(jù),LinkedList的速度大大優(yōu)于ArrayList. 因為ArrayList每插入一條數(shù)據(jù)窟绷,要移動插入點及之后的所有數(shù)據(jù)锯玛。

在我復(fù)習集合的資料整理的過程中,另外還有一個集合那就是------------------>Vector

首先我們通過源碼知道兼蜈,Vector是矢量隊列攘残,它繼承了AbstractList,實現(xiàn)了List为狸、 RandomAccess, Cloneable, java.io.Serializable接口歼郭。

Vector繼承了AbstractList,實現(xiàn)了List辐棒,它是一個隊列病曾,因此實現(xiàn)了相應(yīng)的添加、刪除漾根、修改泰涂、遍歷等功能。

Vector實現(xiàn)了RandomAccess接口辐怕,因此可以隨機訪問逼蒙。

Vector實現(xiàn)了Cloneable,重載了clone()方法秘蛇,因此可以進行克隆其做。

Vector實現(xiàn)了Serializable接口,因此可以進行序列化赁还。

Vector的操作是線程安全的。

所以這就是Vector具備的一些相關(guān)屬性驹沿。

Vector的數(shù)據(jù)結(jié)構(gòu)和ArrayList差不多艘策,包含了3個成員變量:elementData,elementCount渊季,capacityIncrement朋蔫。

(1)elementData是Object[]的數(shù)組罚渐,初始大小為10,會不斷的增長驯妄。

(2)elementCount是元素的個數(shù)荷并。

(3)capacityIncrement是動態(tài)數(shù)組增長的系數(shù)。

Vector有四種遍歷方式:

(1)第一種通過迭代器遍歷青扔,即通過Iterator去遍歷? ? ? ? ? ?? ? ?

Integer value=null;

Iterator iter=vector.iterator();

while(iter.hasNext())

{

value=(Interger)iter.next();

}

(2)第二種隨機訪問源织,通過索引進行遍歷

Integer value=null;

int size=vector.size();

for(int i=0;i

{

value=vector.get(i);

}

(3)第三種通過for循環(huán)的方式

Integer value=null;

for( Integer inte: vector)

{

value=inte;

}

(4)第四種,Enumeration遍歷??

Integer value=null;

Enumeration enu=vector.elements();

while(enu.hasMoreElements())

{

value=(Integer)enu.nextElement();

}

從上面的寫法我們能夠得些什么呢微猖?

1谈息、首先他是一個實實在在Java class;

2、如果使用Vector凛剥,它又有了自己專屬的迭代器Enumeration侠仇。

關(guān)于List相關(guān)的集合類我們就介紹在這里,下面我們來介紹一下集合中第二個很重要的重要的接口---->

Map

????????map相信很多人都知道并且用過犁珠,map存儲數(shù)據(jù)的方式是通過鍵值對的方式進行存儲(key-value)逻炊。所以呢,因為它是鍵值對的方式犁享,那么就必須要保證它的鍵(key)是唯一的嗅骄,通過key去檢索到value(值),值可以不是唯一,這是它的一大特性饼疙。接下來說一下map集合實現(xiàn)類溺森,然后呢通過實現(xiàn)類來總結(jié)一下map的遍歷方式

map的實現(xiàn)類:HashMap、Hashtable窑眯、LinkedHashMap和TreeMap屏积,這幾個是常用的實現(xiàn)類。

HashMap?

????????HashMap是最常用的Map磅甩,它根據(jù)鍵的HashCode值存儲數(shù)據(jù)炊林,根據(jù)鍵可以直接獲取它的值,具有很快的訪問速度卷要,遍歷時渣聚,取得數(shù)據(jù)的順序是完全隨機的。因為鍵對象不可以重復(fù)僧叉,所以HashMap最多只允許一條記錄的鍵為Null奕枝,允許多條記錄的值為Null,是非同步的

Hashtable

????????Hashtable與HashMap類似瓶堕,是HashMap的線程安全版隘道,它支持線程的同步,即任一時刻只有一個線程能寫HashTable,因此也導(dǎo)致了HashTable在寫入時會比較慢谭梗,它繼承自Dictionary類忘晤,不同的是它不允許記錄的鍵或者值為null,同時效率較低激捏。所以當需要實現(xiàn)線程同步设塔,而數(shù)據(jù)量比較小時,還是可以使用HashTable的

ConcurrentHashMap

????????線程安全远舅,并且鎖分離闰蛔。ConcurrentHashMap內(nèi)部使用段(Segment)來表示這些不同的部分,每個段其實就是一個小的hash?table表谊,它們有自己的鎖钞护。只要多個修改操作發(fā)生在不同的段上,它們就可以并發(fā)進行爆办。

LinkedHashMap

????????LinkedHashMap保存了記錄的插入順序难咕,在用Iteraor遍歷LinkedHashMap時,先得到的記錄肯定是先插入的距辆,在遍歷的時候會比HashMap慢余佃,有HashMap的全部特性。

TreeMap

????????TreeMap實現(xiàn)SortMap接口跨算,能夠把它保存的記錄根據(jù)鍵排序爆土,默認是按鍵值的升序排序(自然順序),也可以指定排序的比較器诸蚕,當用Iterator遍歷TreeMap時步势,得到的記錄是排過序的。不允許key值為空背犯,非同步的坏瘩;

接下來我們講一下map的遍歷,兩種方式 :keySet() ? and ?entrySet()

第一種:KeySet()

將Map中所有的鍵存入到set集合中漠魏。因為set具備迭代器倔矾。所有可以迭代方式取出所有的鍵,再根據(jù)get方法柱锹。獲取每一個鍵對應(yīng)的值哪自。 keySet():迭代后只能通過get()取key?。

取到的結(jié)果會亂序禁熏,是因為取得數(shù)據(jù)行主鍵的時候壤巷,使用了HashMap.keySet()方法,而這個方法返回的Set結(jié)果匹层,里面的數(shù)據(jù)是亂序排放的隙笆。

典型用法如下:

Map map = new HashMap();

map.put("key1","data1");

map.put("key2","data12");

map.put("key3","data123");

map.put("key4","data1234");

//首先獲取到map集合中所有鍵的set集合锌蓄,keyset()升筏,方法如下

Iterator it = map.keySet().iterator();

//獲取到迭代器然后通過遍歷得到key,然后通過get(key)的方法得到Object

while(it.hasNext()){

Object key = it.next();

System.out.println(map.get(key));

}

第二種:entrySet()

Set> entrySet() //返回此映射中包含的映射關(guān)系的 Set 視圖撑柔。(一個關(guān)系就是一個鍵-值 ?對),就是把(key-value)作為一個整體一對一對地存放在Set集合當中您访。Map.Entry表示映射關(guān)系铅忿。entrySet():迭代后可以e.getKey(),e.getValue()兩種方法來取key和value灵汪。返回的是Entry接口檀训。

典型用法如下:

Map map = new HashMap();

map.put("key1","data1");

map.put("key2","data12");

map.put("key3","data123");

map.put("key4","data1234");

//將map集合中的映射關(guān)系取出,存入到set集合

Iterator it = map.entrySet().iterator();

while(it.hasNext()){

Entry e =(Entry) it.next();

System.out.println("鍵"+e.getKey () + "的值為" + e.getValue());

}

推薦使用第二種方式享言,即entrySet()方法峻凫,效率較高。

對于keySet其實是遍歷了2次览露,一次是轉(zhuǎn)為iterator荧琼,一次就是從HashMap中取出key所對應(yīng)的value。而entryset只是遍歷了第一次差牛,它把key和value都放到了entry中命锄,所以快了。兩種遍歷的遍歷時間相差比較明顯偏化。

總結(jié)

? ? ? ? 集合是我們在開發(fā)中不可或缺的一個關(guān)鍵而且比較重要的環(huán)節(jié)脐恩,我在復(fù)習的過程中也明白了許多自己以前還是有很多不知道的地方,比如在前段時間可以在開發(fā)中對于map集合的遍歷都不是很懂侦讨,只是會寫驶冒,現(xiàn)在由于空閑時間比較多,仔細的研究了一下韵卤,還是有一種豁然開朗的趕腳骗污。所以希望這些東西能夠給老鐵們有所幫助。最后希望所有的程序員老鐵都能寫出高質(zhì)量的代碼怜俐,升職加薪身堡。。拍鲤。贴谎。走上人生巔峰。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末季稳,一起剝皮案震驚了整個濱河市擅这,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌景鼠,老刑警劉巖仲翎,帶你破解...
    沈念sama閱讀 206,378評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件痹扇,死亡現(xiàn)場離奇詭異,居然都是意外死亡溯香,警方通過查閱死者的電腦和手機鲫构,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,356評論 2 382
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來玫坛,“玉大人结笨,你說我怎么就攤上這事∈疲” “怎么了炕吸?”我有些...
    開封第一講書人閱讀 152,702評論 0 342
  • 文/不壞的土叔 我叫張陵,是天一觀的道長勉痴。 經(jīng)常有香客問我赫模,道長,這世上最難降的妖魔是什么蒸矛? 我笑而不...
    開封第一講書人閱讀 55,259評論 1 279
  • 正文 為了忘掉前任瀑罗,我火速辦了婚禮,結(jié)果婚禮上莉钙,老公的妹妹穿的比我還像新娘廓脆。我一直安慰自己,他們只是感情好磁玉,可當我...
    茶點故事閱讀 64,263評論 5 371
  • 文/花漫 我一把揭開白布停忿。 她就那樣靜靜地躺著,像睡著了一般蚊伞。 火紅的嫁衣襯著肌膚如雪席赂。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,036評論 1 285
  • 那天时迫,我揣著相機與錄音颅停,去河邊找鬼。 笑死掠拳,一個胖子當著我的面吹牛癞揉,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播溺欧,決...
    沈念sama閱讀 38,349評論 3 400
  • 文/蒼蘭香墨 我猛地睜開眼喊熟,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了姐刁?” 一聲冷哼從身側(cè)響起芥牌,我...
    開封第一講書人閱讀 36,979評論 0 259
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎聂使,沒想到半個月后壁拉,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體谬俄,經(jīng)...
    沈念sama閱讀 43,469評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 35,938評論 2 323
  • 正文 我和宋清朗相戀三年弃理,在試婚紗的時候發(fā)現(xiàn)自己被綠了溃论。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 38,059評論 1 333
  • 序言:一個原本活蹦亂跳的男人離奇死亡案铺,死狀恐怖蔬芥,靈堂內(nèi)的尸體忽然破棺而出梆靖,到底是詐尸還是另有隱情控汉,我是刑警寧澤,帶...
    沈念sama閱讀 33,703評論 4 323
  • 正文 年R本政府宣布返吻,位于F島的核電站姑子,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏测僵。R本人自食惡果不足惜街佑,卻給世界環(huán)境...
    茶點故事閱讀 39,257評論 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望捍靠。 院中可真熱鬧沐旨,春花似錦、人聲如沸榨婆。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,262評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽良风。三九已至谊迄,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間烟央,已是汗流浹背统诺。 一陣腳步聲響...
    開封第一講書人閱讀 31,485評論 1 262
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留疑俭,地道東北人粮呢。 一個月前我還...
    沈念sama閱讀 45,501評論 2 354
  • 正文 我出身青樓,卻偏偏與公主長得像钞艇,于是被迫代替她去往敵國和親啄寡。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 42,792評論 2 345

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

  • 一、集合入門總結(jié) 集合框架: Java中的集合框架大類可分為Collection和Map葡秒;兩者的區(qū)別: 1姻乓、Col...
    程序員歐陽閱讀 11,530評論 2 61
  • Java集合類可用于存儲數(shù)量不等的對象,并可以實現(xiàn)常用的數(shù)據(jù)結(jié)構(gòu)如棧,隊列等,Java集合還可以用于保存具有映射關(guān)...
    小徐andorid閱讀 1,918評論 0 13
  • Java集合是java提供的工具包嵌溢,包含了常用的數(shù)據(jù)結(jié)構(gòu):集合、鏈表蹋岩、隊列赖草、棧、數(shù)組剪个、映射等秧骑。Java集合工具包位...
    聶叼叼閱讀 486評論 0 2
  • 1.Java集合框架是什么?說出一些集合框架的優(yōu)點扣囊? 每種編程語言中都有集合乎折,最初的Java版本包含幾種集合類:V...
    獨念白閱讀 753評論 0 2
  • 【問題231】來自:Paris張 春楠姐,我這幾個月真的是一點也不開心侵歇,經(jīng)歷大致跟你差不多骂澄,大學專業(yè)家里決定,工作...
    袁春楠閱讀 2,269評論 0 1