文/沉默王二
開門見山地說吧坟乾,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í)提升自己,不要再用"沒有時間“來掩飾自己思想上的懶惰碟渺!趁年輕鲜锚,使勁拼,給未來的自己一個交代苫拍!