聲明:本欄目所使用的素材都是凱哥學(xué)堂VIP學(xué)員所寫春塌,學(xué)員有權(quán)匿名几晤,對文章有最終解釋權(quán)宫补;凱哥學(xué)堂 旨在促進(jìn)VIP學(xué)員互相學(xué)習(xí)的基礎(chǔ)上公開筆記盛撑。
枚舉也是在JDK1.5以后才出現(xiàn)的碎节,泛型主要解決的是說明一個集合里面存儲的是什么類型的對象的。那枚舉是用來干啥的呢抵卫?
枚舉在java中是專門用來做選擇的狮荔。先建好maven環(huán)境:
配置好的環(huán)境如上,我們回想一下Calendar類下的get方法介粘,它的參數(shù)是int field殖氏,其實(shí)本意是要我們傳入年、月姻采、日雅采、時(shí)、分慨亲、秒這些參數(shù)從而來得到對應(yīng)的值的婚瓜,但是它的參數(shù)的變量名field并沒有描述清楚這個參數(shù)到底該傳什么樣的值的,像這種整形的參數(shù)變量刑棵,描述含義不清楚的(不是weight巴刻、height、length之類的含義清晰的變量)铐望,我們不知道該傳入什么樣的參數(shù)值的時(shí)候冈涧,通常可以通過看這個類中定義了哪些常量正蛙,然后把類中定義的常量(常量標(biāo)示符表示某個int數(shù)值)作為參數(shù)值傳入督弓,比如這里的get方法,就可以傳入Calendar.YEAR這樣的常量值乒验,來得到年份愚隧。
但是最開始的時(shí)候我們并不知道這種int field的參數(shù)就應(yīng)該傳入類中定義的常量標(biāo)示符的,那么java中就推出了枚舉來解決這個問題锻全。
枚舉是一個選擇器狂塘,比如你的方法的參數(shù)類型要限定在A/B/C/D/E/F這六個對象之間,你就可以定義一個枚舉選擇器Type鳄厌,把A/B/C/D/E/F六個對象寫進(jìn)來荞胡,然后在方法中的參數(shù)寫成Type t,當(dāng)使用方法的時(shí)候了嚎,一點(diǎn)到t上面就會知道這個參數(shù)是一個枚舉泪漂,同時(shí)知道了參數(shù)類型是在什么之間做選擇廊营。如下:
如上,使用枚舉你就能很清楚的知道該傳入的參數(shù)在哪些對象之間做選擇萝勤,相反你如果寫int露筒,同時(shí)變量名的表義又不清楚的話,是無法知道該傳入什么樣的參數(shù)值的敌卓。
那么我們方法的參數(shù)是枚舉的方法慎式,我們就可以在方法里面做一些選擇的邏輯處理:
枚舉里面既可以寫構(gòu)造器也可以寫方法,構(gòu)造器必須是私有的趟径,但是在枚舉里面寫構(gòu)造器和方法都是沒有實(shí)際意義的:
補(bǔ)充一個泛型的循環(huán):
這里的for-each循環(huán)實(shí)際上也就是迭代器做出來的瘪吏。 Collections集合工具類:
認(rèn)識一下JDK API?
什么是API,就是java里面所有官方公布的操作類舵抹,和這些類里面的方法肪虎,和一些簡單的小案例,是一個幫助惧蛹、說明文檔。
網(wǎng)上在線中文API 刑枝,百度輸入 JDK API
通常情況下拿API 來是為了看某個操作類下的一些方法香嗓,看它們是怎么使用的,用來完成什么樣的功能的装畅。
Collections集合工具類:
Collections集合工具類里面的方法大部分都是針對List集合進(jìn)行相應(yīng)功能操作的:
1.混合打亂Collections.shuffle(List l);
這種打亂方法靠娱,每次運(yùn)行產(chǎn)生的結(jié)果都是不一樣的。 排序方法Collections.sort(List l):
其實(shí)掠兄,上面的String為啥能夠直接進(jìn)行排序像云,是有原因的,那是因?yàn)镾tring里面實(shí)現(xiàn)了Comparable接口里面的CompareTo方法蚂夕,所以才能夠直接進(jìn)行排序迅诬,我們自己定義一個student類,看看能否直接排序婿牍?
我們自己寫的類Student侈贷,最開始沒有實(shí)現(xiàn)Comparable接口,在使用sort方法來比較不同的student對象的時(shí)候會報(bào)錯等脂,這是肯定的俏蛮,因?yàn)槟銢]有實(shí)現(xiàn)Comparable的接口,它不知道按照什么東西來進(jìn)行比較上遥,然后我們?nèi)?shí)現(xiàn)Comparable接口:
如上所示搏屑,我們的student類實(shí)現(xiàn)了Comparable接口后,重寫了compareTo方法粉楚,然后就可以使用sort方法來進(jìn)行直接排序了辣恋。
Collections.addAll批量的加入數(shù)據(jù):
Collections.replaceAll()替換集合里面的數(shù)據(jù):
Collections.binarySearch()搜索對象在哪個下標(biāo)下:
Collections.reverse()反轉(zhuǎn),將集合里面的對象反轉(zhuǎn)過來:
Collections.fill()全部替換,將集合里面的對象全部替換為某個對象:
Collections.copy()拷貝抑党,將一個集合的數(shù)據(jù)拷貝到另一個集合中包警,目標(biāo)集合的長度至少要比源集合的長度長,不然會報(bào)錯底靠。如果源集合長度比目標(biāo)集合長度短害晦,則源集合里面的數(shù)據(jù)會覆蓋目標(biāo)集合里面前面部分的數(shù)據(jù):
還有很多方法,以后要用的時(shí)候可以參考JDK API文檔進(jìn)行查詢暑中。
Map集合:雙列集合壹瘟,一個主鍵一個值。又稱之為鍵值對集合鳄逾,一個key 一個value稻轨。
鍵值對集合,鍵不可以重復(fù)雕凹,值可以重復(fù)殴俱,因?yàn)槲覀兊哪弥怠⒉橹得兜帧h值都是根據(jù)主鍵來進(jìn)行的线欲,如果你兩個或多個主鍵相同的話,就無法進(jìn)行拿值汽摹、查值李丰、刪值等操作了。
Map集合的結(jié)構(gòu):下面有HashMap和Hashtable兩個集合逼泣,Map集合里面的主要方法如上: HashMap集合繼承于AbstractMap趴泌,然后AbstractMap實(shí)現(xiàn)了Map接口。 HashMap是非線程安全的拉庶,Hashtable是線程安全的嗜憔。
HashMap的方法和Hashtable的方法是幾乎一樣的,只要看看HashMap里面的方法:
由上所示砍的,當(dāng)多個主鍵一樣的時(shí)候痹筛,你去拿值的話,拿的是最后一個廓鞠。
Hashtable的主鍵和值都不能是null帚稠。
而HashMap的主鍵或者值都可以是null。
拿出集合中的所有值床佳,用到方法values()滋早,返回值是一個Collection集合對象,然后用for-each循環(huán)把Collection集合里面的【學(xué)Java砌们,到凱哥學(xué)堂kaige123.com】所有數(shù)據(jù)拿出來杆麸,這里如果是HashMap集合的話搁进,拿出來的數(shù)據(jù)是雜亂無序的,而如果是Hashtable的話昔头,拿出來的數(shù)據(jù)是有順序的:
取出集合里面所有的鍵饼问,用方法keySet(),這個方法的返回值是Set集合對象揭斧,然后使用for-each循環(huán)把Set集合里面的所有數(shù)據(jù)都取出來莱革。
如上顯示,用HashMap的話取出來的鍵是雜亂無序的讹开,而Hashtable取出來的鍵是有序的盅视。 鍵-值一起拿方法entrySet(),它的返回值是一個Set,Set集合里面存放的是Entry實(shí)體旦万,然后用for-each循環(huán)把集合里面所有的實(shí)體對象數(shù)據(jù)Entry拿出來:
如上所示闹击,HashMap拿出的鍵-值對無序,而Hashtable拿出來的有序成艘。
還有size()赏半、remove()、containsKey()狰腌、containsValue()除破、clear()等方法,使用如上琼腔。