sqlite工具类 java_Java之泛型、集合工具类
在我們講完常用的基本集合后,我們就要介紹下位于java.util包下的collections類,注意:我們之前的collection是集合的接口,而collections是一個類。collections里面的方法也都是靜態的,所以可以說是集合的工具類。接下來還是看幾個常用的方法:
sort方法可以對List集合進行一個排序。(排序前提是類實現了comparable的接口,或者方法中傳入一個comparator比較器)
還記得我們在說Arrays工具類中也有binarySearch方法——二分法查找,這種方法前提都是排好序的。這里就需要一個排好序的List了。因為底層有調用對應的比較方法,所以要么里面的元素對應的類實現了comparable接口,又或者傳入comparator比較器才能實現。
和上面的解釋差不多,可以用它們找出最值。
可以返回指定元素在Collection集合中出現的次數。
不管傳進去的List是不是有序的,都可以使之的順序顛倒過來。
使對應的集合變成線程安全(學會了線程就知道這個方法的意義了)
泛型在集合的文章中作者說了集合里面可以放不同數據類型,但在我們的實際運用中,其實一般都是存放同一種數據類型。那我們怎么去保證一個集合去指定只能存取的數據類型呢?這時候就需要用到我們的泛型機制了。泛型機制是JDK5的新特性。我們看下百度百科對之的解釋:
百度百科說了,泛型的本質是參數化類型,那么這是什么意思呢?我們之前自定義方法的時候用形參來代替之后傳入的實參數據。泛型也是差不多的原理,只是它是不是用來代替數據的,而是用來代替對應的作用范圍內的數據類型。
泛型的最基本特征就是<>符號。相信讀者在看集合的源代碼的時候肯定多次看到<>這個符號了,上面的集合工具類中也有。接下來我們通過Map及子類來理解泛型機制。
泛型類
后面的繼承與實現我們姑且不看,就看HashMap后面的,這就是一個泛型了。那么這個K和V分別有什么用呢?我們先看看HashMap中的put方法:
我們可以看到put的返回值是一個V,而傳入的key和value的數據類型寫著K和V。這時候讀者應該能知道了,這里的K和V對應著我們HashMap后面的。也就是說將來我們構造的時候傳入的是什么數據類型,那么對應的put中的K和V也對應著相同的數據類型。
注:HashMap的其他方法的K和V也是一樣的,這里就用put來作簡要說明。
看上面的例子我們可以看到指定的HashMap的key的數據類型為Integer,而value為String。這時候我們如果不按這個規定,編譯器就會報錯。
從以上的例子我們就可以知道一個基本泛型類的定義格式為:
修飾符?class?類名 {??}泛型的類體可以寫有泛型標識的方法或者屬性。所以泛型類中的泛型標識就是為了來代替類中的屬性的數據類型或者方法中的一些參數的數據類型的。
泛型方法
上述的put方法里面有了泛型標識就可以說它就是一個泛型方法了嘛?答案是不是的。一個泛型方法的格式應該是這樣的:
修飾符??返回值類型?方法名?(參數列表) {??}泛型方法必須在修飾符和返回值類型中加,否則不算泛型方法!那么泛型方法我們可以在哪里看到呢?其實很簡單的,集合的工具類就用到了泛型方法。例如sort方法:
是不是可以看到它的修飾符和返回值類型中就有泛型標識了呢?
那么泛型方法什么時候用的多呢?當我們在一個非泛型類中想在方法中用泛型時,泛型方法的作用就來了。我們看集合工具類的源代碼可以看到Collections不是一個泛型類,而sort方法是一個泛型方法,那么修飾符類型和返回值之間聲明的其實就是為了說明方法內對應的泛型標識是使用了泛型機制,不然編譯器不知道你使用的是泛型機制,會報錯。
那泛型類中能用泛型方法嘛?當然是可以的。不過我們需要注意一點:
我們可以看到我們在一個泛型類中用一個T來代表這個類的泛型,然后在泛型方法中用了同一個T,那么如果按照我們之前的說法我們new一個Integer泛型的Generics,里面的print方法只能傳入Integer類型才是,這時候我們傳字符串居然沒有報錯?這時候我們就要細分了:泛型類的泛型標識只是用來代替類體中非泛型方法和屬性中相同的泛型標識,泛型方法中相同的泛型標識代替不了。(所以上面泛型方法的T非泛型類中的T)
泛型接口
從Map源代碼就可以知道泛型接口的書寫格式了,這里作者就不寫了,對于泛型接口需要知道的是,當我們在實現泛型接口時,其需要有對應的泛型標識(一般是數量一致)。看HashMap可以知道它在實現Map接口時,就有對應的泛型標識了。
泛型類型限制范圍
對于泛型,有時候我們不想讓傳入的泛型類型太過寬泛,我們可以定義泛型的上下界。我們看集合工具類中的一個簡單例子:
看這個泛型方法的泛型標識:
>
咋一眼看有點復雜,但我們拆解來看,我們會發現有一個?,這個符號是什么呢?我們可以這么理解:?是一個實際參數,代表我們Java中所有的數據類型,因此也稱為通配符。要與T等這種泛型標識區分開,這種泛型標識(如:T,K,V等)是我們自定義的,所以是形式參數,需要我們傳值才有實際作用。
先看 super T>,這個代表什么意思呢?super我們都知道,是上級的意思,那么super T就可以理解為T類型的上級,也就是T的父類。所以Comparable中的對應的數據類型只能是T的父類。
(源代碼)
接著看>,extends我們也都知道是繼承的意思,T去繼承Comparable<...>,那傳入的參數只能是comparable<...>的子類。
經過簡單的解釋,可以知道extends和super關鍵字在泛型中代表范圍限制,extends用來聲明使用泛型的上界,super用來聲明使用泛型的下界。
于是乎,上面的sort方法傳入的List的T需要滿足下面的條件:1、T必須包含在Comparable里。2、Comparable接口里的泛型必須是T的父類型。
其他注意事項1、泛型傳入的實參只能是引用數據類型,不能是基本數據類型。
2、泛型類不可以繼承Exception類。
3、數組沒有泛型機制。
到這,讀者不妨再返回去看看集合中那些用到泛型機制的內容,相信這時候你一定能夠豁然開朗的。最后,我們看下之前我們在TreeMap中寫的沒有泛型的比較器:
可以看到沒有用泛型的時候我們重寫方法時參數只能是Object,于是在比較時需要強制轉換數據類型,一旦數據類型不匹配就會報類型轉換異常。這無疑是不理想的,但是如果我們用泛型的話:
可以看到,這樣我們就不用進行強制類型轉換了,減少了錯誤率。
總結
以上是生活随笔為你收集整理的sqlite工具类 java_Java之泛型、集合工具类的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 笔记本电脑一键迁移系统到固态盘笔记本怎么
- 下一篇: 联想T550笔记本蓝牙支持5.0版本吗?