聲明:本欄目所使用的素材都是凱哥學(xué)堂VIP學(xué)員所寫,學(xué)員有權(quán)匿名,對(duì)文章有最終解釋權(quán);凱哥學(xué)堂 旨在促進(jìn)VIP學(xué)員互相學(xué)習(xí)的基礎(chǔ)上公開筆記。
枚舉也是在JDK1.5以后才出現(xiàn)的,泛型主要解決的是說(shuō)明一個(gè)集合里面存儲(chǔ)的是什么類型的對(duì)象的。那枚舉是用來(lái)干啥的呢?
枚舉在java中是專門用來(lái)做選擇的。先建好maven環(huán)境:
配置好的環(huán)境如上,我們回想一下Calendar類下的get方法,它的參數(shù)是int field,其實(shí)本意是要我們傳入年、月、日、時(shí)、分、秒這些參數(shù)從而來(lái)得到對(duì)應(yīng)的值的,但是它的參數(shù)的變量名field并沒有描述清楚這個(gè)參數(shù)到底該傳什么樣的值的,像這種整形的參數(shù)變量,描述含義不清楚的(不是weight、height、length之類的含義清晰的變量),我們不知道該傳入什么樣的參數(shù)值的時(shí)候,通常可以通過看這個(gè)類中定義了哪些常量,然后把類中定義的常量(常量標(biāo)示符表示某個(gè)int數(shù)值)作為參數(shù)值傳入,比如這里的get方法,就可以傳入Calendar.YEAR這樣的常量值,來(lái)得到年份。
但是最開始的時(shí)候我們并不知道這種int field的參數(shù)就應(yīng)該傳入類中定義的常量標(biāo)示符的,那么java中就推出了枚舉來(lái)解決這個(gè)問題。
枚舉是一個(gè)選擇器,比如你的方法的參數(shù)類型要限定在A/B/C/D/E/F這六個(gè)對(duì)象之間,你就可以定義一個(gè)枚舉選擇器Type,把A/B/C/D/E/F六個(gè)對(duì)象寫進(jìn)來(lái),然后在方法中的參數(shù)寫成Type t,當(dāng)使用方法的時(shí)候,一點(diǎn)到t上面就會(huì)知道這個(gè)參數(shù)是一個(gè)枚舉,同時(shí)知道了參數(shù)類型是在什么之間做選擇。如下:
如上,使用枚舉你就能很清楚的知道該傳入的參數(shù)在哪些對(duì)象之間做選擇,相反你如果寫int,同時(shí)變量名的表義又不清楚的話,是無(wú)法知道該傳入什么樣的參數(shù)值的。
那么我們方法的參數(shù)是枚舉的方法,我們就可以在方法里面做一些選擇的邏輯處理:
枚舉里面既可以寫構(gòu)造器也可以寫方法,構(gòu)造器必須是私有的,但是在枚舉里面寫構(gòu)造器和方法都是沒有實(shí)際意義的:
補(bǔ)充一個(gè)泛型的循環(huán):
這里的for-each循環(huán)實(shí)際上也就是迭代器做出來(lái)的。 Collections集合工具類:
認(rèn)識(shí)一下JDK API?
什么是API,就是java里面所有官方公布的操作類,和這些類里面的方法,和一些簡(jiǎn)單的小案例,是一個(gè)幫助、說(shuō)明文檔。
網(wǎng)上在線中文API ,百度輸入 JDK API
通常情況下拿API 來(lái)是為了看某個(gè)操作類下的一些方法,看它們是怎么使用的,用來(lái)完成什么樣的功能的。
Collections集合工具類:
Collections集合工具類里面的方法大部分都是針對(duì)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)行排序,我們自己定義一個(gè)student類,看看能否直接排序?
我們自己寫的類Student,最開始沒有實(shí)現(xiàn)Comparable接口,在使用sort方法來(lái)比較不同的student對(duì)象的時(shí)候會(huì)報(bào)錯(cuò),這是肯定的,因?yàn)槟銢]有實(shí)現(xiàn)Comparable的接口,它不知道按照什么東西來(lái)進(jìn)行比較,然后我們?nèi)?shí)現(xiàn)Comparable接口:
如上所示,我們的student類實(shí)現(xiàn)了Comparable接口后,重寫了compareTo方法,然后就可以使用sort方法來(lái)進(jìn)行直接排序了。
Collections.addAll批量的加入數(shù)據(jù):
Collections.replaceAll()替換集合里面的數(shù)據(jù):
Collections.binarySearch()搜索對(duì)象在哪個(gè)下標(biāo)下:
Collections.reverse()反轉(zhuǎn),將集合里面的對(duì)象反轉(zhuǎn)過來(lái):
Collections.fill()全部替換,將集合里面的對(duì)象全部替換為某個(gè)對(duì)象:
Collections.copy()拷貝,將一個(gè)集合的數(shù)據(jù)拷貝到另一個(gè)集合中,目標(biāo)集合的長(zhǎng)度至少要比源集合的長(zhǎng)度長(zhǎng),不然會(huì)報(bào)錯(cuò)。如果源集合長(zhǎng)度比目標(biāo)集合長(zhǎng)度短,則源集合里面的數(shù)據(jù)會(huì)覆蓋目標(biāo)集合里面前面部分的數(shù)據(jù):
還有很多方法,以后要用的時(shí)候可以參考JDK API文檔進(jìn)行查詢。
Map集合:雙列集合,一個(gè)主鍵一個(gè)值。又稱之為鍵值對(duì)集合,一個(gè)key 一個(gè)value。
鍵值對(duì)集合,鍵不可以重復(fù),值可以重復(fù),因?yàn)槲覀兊哪弥怠⒉橹怠h值都是根據(jù)主鍵來(lái)進(jìn)行的,如果你兩個(gè)或多個(gè)主鍵相同的話,就無(wú)法進(jìn)行拿值、查值、刪值等操作了。
Map集合的結(jié)構(gòu):下面有HashMap和Hashtable兩個(gè)集合,Map集合里面的主要方法如上: HashMap集合繼承于AbstractMap,然后AbstractMap實(shí)現(xiàn)了Map接口。 HashMap是非線程安全的,Hashtable是線程安全的。
HashMap的方法和Hashtable的方法是幾乎一樣的,只要看看HashMap里面的方法:
由上所示,當(dāng)多個(gè)主鍵一樣的時(shí)候,你去拿值的話,拿的是最后一個(gè)。
Hashtable的主鍵和值都不能是null。
而HashMap的主鍵或者值都可以是null。
拿出集合中的所有值,用到方法values(),返回值是一個(gè)Collection集合對(duì)象,然后用for-each循環(huán)把Collection集合里面的【學(xué)Java,到凱哥學(xué)堂kaige123.com】所有數(shù)據(jù)拿出來(lái),這里如果是HashMap集合的話,拿出來(lái)的數(shù)據(jù)是雜亂無(wú)序的,而如果是Hashtable的話,拿出來(lái)的數(shù)據(jù)是有順序的:
取出集合里面所有的鍵,用方法keySet(),這個(gè)方法的返回值是Set集合對(duì)象,然后使用for-each循環(huán)把Set集合里面的所有數(shù)據(jù)都取出來(lái)。
如上顯示,用HashMap的話取出來(lái)的鍵是雜亂無(wú)序的,而Hashtable取出來(lái)的鍵是有序的。 鍵-值一起拿方法entrySet(),它的返回值是一個(gè)Set,Set集合里面存放的是Entry實(shí)體,然后用for-each循環(huán)把集合里面所有的實(shí)體對(duì)象數(shù)據(jù)Entry拿出來(lái):
如上所示,HashMap拿出的鍵-值對(duì)無(wú)序,而Hashtable拿出來(lái)的有序。
還有size()、remove()、containsKey()、containsValue()、clear()等方法,使用如上。