Java集合類的那點通俗的認知

文/沉默王二

開門見山地說吧坟乾,Java提供了一套完整的集合類(也可以叫做容器類)來管理一組長度可變的對象(也就是集合的元素)硕蛹,其中常見的類型包括List掺栅、Set冗澈、Queue和Map。從我個人的編程經(jīng)驗來看栋操,List的實現(xiàn)類ArrayList和Map的實現(xiàn)類HashMap使用頻率最高闸餐,其它實現(xiàn)類只能望其項背了饱亮。

List矾芙、Set和Queue都是Collection的子接口,但各有各的好近上。List按照插入的順序保存元素剔宪,Set不會有重復(fù)的元素,Queue通常(但并非一定)以 FIFO(先進先出)的方式排序各個元素壹无。

Map與Collection最大的不同就在于葱绒,它是一組“鍵值對”,可以快速地通過鍵來查找值斗锭;Collection是沒有鍵的地淀,因此需要按照某種規(guī)則來查找值(這里說的值就是元素)。

怎么使用集合類呢岖是?示例如下:

publicclassWanger{

publicstaticvoidmain(String[]?args){

List?list?=newArrayList();

list.add("李孝利");

System.out.println(list.get(0));

Map?map?=newHashMap();

map.put("lixiaoli","李孝利");

System.out.println(map.get("lixiaoli"));

}

}

01帮毁、ArrayList和LinkedList

通常情況下,ArrayList是我們在選擇List的時候的首選豺撑。別問我為什么烈疚,就好像你問我為什么1+1 = 2 ?我回答不上來啊聪轿。

有人會問爷肝,如果我的應(yīng)用操作偏向于插入和刪除,而不是隨機訪問陆错,我還要選用ArrayList嗎灯抛?我知道LinkedList在處理插入和刪除的時候更高效,而ArrayList更適合隨機訪問音瓷。

那么我的回答是对嚼,你已經(jīng)知道了答案,就做出自己的選擇吧外莲。

List的應(yīng)用經(jīng)常會涉及到一些經(jīng)典的排序算法猪半,我們不妨來重溫一下冒泡排序兔朦,冒泡排序的規(guī)則是:假如有N個數(shù),是無序的磨确;從第一個數(shù)開始和后面N-1的數(shù)比較沽甥,發(fā)現(xiàn)有比自己小的就交換位置;從第二個數(shù)開始和后面N-2的數(shù)比較乏奥,同樣發(fā)現(xiàn)有比自己小的就交換位置摆舟;直到N-1結(jié)束。

來看程序清單1-1:

publicclassBubbleSort{

publicstaticvoidmain(String[]?args){

List?list?=newArrayList();

Collections.addAll(list,2,1,5,4,9,8,6,7,10,3,3);

//?從第1個數(shù)開始比較邓了,直到N-1

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

????????????//?從第i+1開始恨诱,和i位置的數(shù)進行比較

????????????for?(int?j?=?i?+?1;?j?<?list.size();?j++)?{

????????????????//?記錄原來的數(shù)

????????????????int?temp?=?list.get(j);

????????????????//?如果i位置的數(shù)大,就和j位置的數(shù)進行交換

????????????????if?(list.get(i)?>?temp)?{

????????????????????list.set(j,?list.get(i));

????????????????????list.set(i,?temp);

????????????????}

????????????}

????????}

????????System.out.println(list);

????}

}

Collections類是操作Collection的一個工具集骗炉,提供了很多可以操作和返回Collection的靜態(tài)方法照宝,非常好用。Collections.addAll()方法可以將所有指定元素添加到指定 Collection中句葵,可以分別指定要添加的元素厕鹃,就像Collections.addAll(list, 2, 1, 5);這樣;或者將要添加的元素指定為一個數(shù)組乍丈;此方法的行為與list.addAll(Arrays.asList(elements))的行為是相同的剂碴,但在大多數(shù)實現(xiàn)下,此方法運行起來可能要快得多轻专。

list.set(int index, E element)用于指定元素替代此列表中指定位置上的元素忆矛,非常便捷。

02请垛、HashMap

HashMap是最常見的Map實現(xiàn)催训,應(yīng)用非常的廣泛;支持null鍵和null值叼屠,是絕大部分利用鍵值對存取場景的首選瞳腌;比如,查詢數(shù)據(jù)庫的時候經(jīng)常使用HashMap來進行靈活的(可選擇一個表的部分列镜雨,而不是所有列)列名和列值的綁定嫂侍。

HashMap的值中還可以存放新的鍵值對,就像下面的這張示意圖荚坞。

在這里插入圖片描述

03挑宠、PriorityQueue

考慮這樣一種場景,王二現(xiàn)在是一個寫作大咖了颓影,不再只是一個會寫代碼的程序員了各淀。有一天,他和幾個熱情的讀者相遇在廁所的門口诡挂,為了表示對王二的尊重碎浇,讀者們覺得禮讓王二先去解決問題是必要的临谱。

PriorityQueue是一種優(yōu)先級隊列(Priority即為優(yōu)先的意思),可以應(yīng)用于這種場景奴璃。代碼示例如下:

publicclassWriterAndReaderimplementsComparable{

staticPriorityQueue?queue?=newPriorityQueue();

privateString?name;

publicWriterAndReader(String?name){

this.name?=?name;

}

@Override

publicintcompareTo(WriterAndReader?o){

//?o為之前的

????????if?(this.getName().equals("王二"))?{

????????????return?-1;

????????}

????????return?this.getName().compareTo(o.getName());

????}

????public?String?getName()?{

????????return?name;

????}

????public?void?setName(String?name)?{

????????this.name?=?name;

????}

????@Override

????public?String?toString()?{

????????return?this.getName();

????}

????public?static?void?main(String[]?args)?{

????????//?第一次悉默,沒有發(fā)生比較,因為只有一個

????????queue.add(new?WriterAndReader("讀者2"));

????????//?第二次苟穆,與第一次放入的比較抄课,發(fā)現(xiàn)讀者1比讀者2小

????????queue.add(new?WriterAndReader("讀者1"));

????????//?第三次,與讀者1進行比較雳旅,發(fā)現(xiàn)王二懈ァ;

????????queue.add(new?WriterAndReader("王二"));

????????while?(!queue.isEmpty())?{

????????????System.out.println(queue.poll());

????????}

????}

}

PriorityQueue既然要排出優(yōu)先級攒盈,那么就要有一定的規(guī)則抵拘,排列的對象就要實現(xiàn)Comparable接口。

建議在學(xué)習(xí)的時候debug一下沦童,你會發(fā)現(xiàn)queue的變化非常的有意思仑濒;每次add添加或者poll取出時就會執(zhí)行對應(yīng)的compareTo。(非常慚愧偷遗,我對內(nèi)部的排序沒有搞太懂,留待后面繼續(xù)學(xué)習(xí))

PriorityQueue常用的功能函數(shù)如下:

方法名功能描述

add(E e)添加元素

clear()清空

contains(Object o)檢查是否包含當(dāng)前參數(shù)元素

offer(E e)添加元素

peek()讀取元素驼壶,(不刪除)

poll()取出元素氏豌,(刪除)

remove(Object o)刪除指定元素

size()返回長度 ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 歡迎工作一到五年的Java工程師朋友們加入Java群:?741514154

群內(nèi)提供免費的Java架構(gòu)學(xué)習(xí)資料(里面有高可用、高并發(fā)热凹、高性能及分布式泵喘、Jvm性能調(diào)優(yōu)、Spring源碼般妙,MyBatis纪铺,Netty,Redis,Kafka,Mysql,Zookeeper,Tomcat,Docker,Dubbo,Nginx等多個知識點的架構(gòu)資料)合理利用自己每一分每一秒的時間來學(xué)習(xí)提升自己,不要再用"沒有時間“來掩飾自己思想上的懶惰碟渺!趁年輕鲜锚,使勁拼,給未來的自己一個交代苫拍!

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末芜繁,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子绒极,更是在濱河造成了極大的恐慌骏令,老刑警劉巖,帶你破解...
    沈念sama閱讀 217,657評論 6 505
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件垄提,死亡現(xiàn)場離奇詭異榔袋,居然都是意外死亡周拐,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,889評論 3 394
  • 文/潘曉璐 我一進店門凰兑,熙熙樓的掌柜王于貴愁眉苦臉地迎上來速妖,“玉大人,你說我怎么就攤上這事聪黎『比荩” “怎么了?”我有些...
    開封第一講書人閱讀 164,057評論 0 354
  • 文/不壞的土叔 我叫張陵稿饰,是天一觀的道長锦秒。 經(jīng)常有香客問我,道長喉镰,這世上最難降的妖魔是什么旅择? 我笑而不...
    開封第一講書人閱讀 58,509評論 1 293
  • 正文 為了忘掉前任,我火速辦了婚禮侣姆,結(jié)果婚禮上生真,老公的妹妹穿的比我還像新娘。我一直安慰自己捺宗,他們只是感情好柱蟀,可當(dāng)我...
    茶點故事閱讀 67,562評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著蚜厉,像睡著了一般长已。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上昼牛,一...
    開封第一講書人閱讀 51,443評論 1 302
  • 那天术瓮,我揣著相機與錄音,去河邊找鬼贰健。 笑死胞四,一個胖子當(dāng)著我的面吹牛帕膜,可吹牛的內(nèi)容都是我干的昼扛。 我是一名探鬼主播,決...
    沈念sama閱讀 40,251評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼缎脾,長吁一口氣:“原來是場噩夢啊……” “哼悬垃!你這毒婦竟也來了游昼?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,129評論 0 276
  • 序言:老撾萬榮一對情侶失蹤尝蠕,失蹤者是張志新(化名)和其女友劉穎烘豌,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體看彼,經(jīng)...
    沈念sama閱讀 45,561評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡廊佩,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,779評論 3 335
  • 正文 我和宋清朗相戀三年囚聚,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片标锄。...
    茶點故事閱讀 39,902評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡顽铸,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出料皇,到底是詐尸還是另有隱情谓松,我是刑警寧澤,帶...
    沈念sama閱讀 35,621評論 5 345
  • 正文 年R本政府宣布践剂,位于F島的核電站鬼譬,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏逊脯。R本人自食惡果不足惜优质,卻給世界環(huán)境...
    茶點故事閱讀 41,220評論 3 328
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望军洼。 院中可真熱鬧巩螃,春花似錦、人聲如沸匕争。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,838評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽汗捡。三九已至淑际,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間扇住,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,971評論 1 269
  • 我被黑心中介騙來泰國打工盗胀, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留艘蹋,地道東北人。 一個月前我還...
    沈念sama閱讀 48,025評論 2 370
  • 正文 我出身青樓票灰,卻偏偏與公主長得像女阀,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子屑迂,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,843評論 2 354

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