Keywords: 泛型、Collections工具類、Arrays工具類、可變參數、靜態(tài)導入、System類、Math類、Date&DateFormat&Calendar類
泛型
泛型的概述
問題: 什么類型的元素都可以往集合中存儲,導致取出時,如果出現強轉就會引發(fā)運行時ClassCastException。能不能再創(chuàng)建集合時,就明確容器中元素的類型,如同數組一樣。
目的: 讓集合使用更安全
解決方案: 泛型,創(chuàng)建集合時,直接在集合上明確要存儲的元素的類型,只要不是指定的類型對象,編譯器檢查會報錯。這樣就將運行時的問題轉移到編譯時期。
泛型的好處:
- 安全機制
- 將運行時期的
ClassCastException轉移到編譯時期,變成了編譯失敗 - 泛型技術,是給編譯器使用的技術
- 泛型的出現避免了強轉的麻煩
格式: 集合類型<元素類型> 變量名 = new 集合類型<元素類型>()
泛型的擦除: 運行時,會將泛型去掉,生成的class文件中是不帶泛型的,這個稱為泛型的擦除。
為什么擦除: 為了兼容運行的類加載器。生成的class文件中就不帶泛型了
泛型的補償: 在運行時,通過獲取元素的類型進行轉換動作。不用使用者在強制轉換了。
泛型的表現:
泛型技術在集合框架中應用的范圍很大,只要看到類,或者接口在描述時右邊定義<>,就需要泛型。其實是容器在不明確操作元素的類型的情況下,對外提供了一個參數<>,使用容器時,只要將具體的類型實參傳遞給該參數即可。說白了,泛型就是傳遞類型參數。
泛型的應用
定義泛型類
Object類為最上層的父類,很多程序員為了使程序更為通用,設計程序時通常使傳入的值與返回的值都以Object類型為主。當需要使用這些實例時,必須正確地將該實例轉換為原來的類型,否則在運行時將會發(fā)生ClassCastException異常。JDK1.5以后提出了泛型機制。(/day18e/src/cn/itcast/p4/generic/define/demo/Tool.java)
格式:
-
類名<T>,其中T代表元素類型 -
類名<T1,T2>,其中T1,T2代表元素類型,這樣在實例化指定類型的對象時就可以指定多個類型
定義泛型方法
當方法要操作的類型不確定,不一定和類上的泛型一致時,可以將泛型定義在方法上。(/day18e/src/cn/itcast/p4/generic/define/demo/Tool.java)
格式: public <W> void 方法名(W 參數名),其中W代表元素類型
注意: 如果方法是靜態(tài)的,且需要使用泛型,那么泛型必須定義在方法上,不能定義在類上
定義泛型接口
(/day18e/src/cn/itcast/p4/generic/define/demo/GenericDefineDemo5.java)
格式: interface 接口名<T>,其中T代表元素類型
通配符
當使用泛型類或者接口時,傳遞的具體的類型不確定,可以通過通配符?表示。
格式: 泛型類名稱<?>
一個栗子
private static void printList(Collection<?> ts) {
for (Iterator<?> iterator = ts.iterator(); iterator.hasNext();) {
System.out.println(iterator.next());
}
}
通配符在api中的使用
以Collection接口中的boolean containsAll(Collection<?> c)為例:
class Collection<E>{
public boolean containsAll(Collection<?> c){}
}
了解containsAll()方法源碼內判斷包含的依據,是equals()方法:boolean equals(Object o),可以接收任意參數類型,不必與Collection集合所接收參數類型一致。
泛型的限定
如果想要對傳遞的類型進行限制,只在一些指定的類型,使用泛型的限定。(/day18e/src/cn/itcast/p5/generic/advance/demo/GenericAdvanceDemo2.java)
格式:
- 上限:
? extends E,接收E類型或E的子類型 - 下限:
? super E,接收E類型或E的父類型
泛型的限定在api中的使用
以TreeSet接口中的TreeSet(Collection<? extends E> c)和TreeSet(Comparator<? super E> comparator)為例:
class TreeSet<E>{
TreeSet(Collection<? extends E> c){}
TreeSet(Comparator<? super E> comparator){}
}
嗐,懶得寫了,忘了就去看畢向東
使用細節(jié)
使用泛型時,要保證左右類型一致
案例
獲取集合中元素的最大值(
/day18e/src/cn/itcast/p1/generic/demo/GenericTest.java)
Collections工具類
集合框架中用于操作集合對象的工具類,都是靜態(tài)的工具方法
(/day19e/src/cn/itcast/p2/toolclass/collections/demo/CollectionsDemo.java)
Arrays工具類
用于操作數組的工具類,類中定義的都是靜態(tài)工具方法
(/day19e/src/cn/itcast/p3/toolclass/arrays/demo/ArraysDemo.java)
可變參數
數組參數的簡化表現形式(/day20_my/src/cn/itcast/param/ParamDemo.java)
public class ParamDemo {
public static void main(String[] args) {
int sum = add(4,5,23,45,2,34);
System.out.println(sum);
}
/*
* 可變參數需要注意,只能定義在參數的最后
*/
public static int add(int... arr) {
int sum = 0;
for (int i = 0; i < arr.length; i++) {
sum += arr[i];
}
return sum;
}
}
...用在參數上,稱為可變參數,同樣是代表數組,但是再調用這個帶有可變參數的函數時,不用創(chuàng)建數組,直接將數組中的元素作為實際參數進行傳遞,其實編譯成的class文件,是將這些實參先封裝到一個數組中,再進行傳遞。
注意事項:可變參數一定要定義再參數列表的最后
靜態(tài)導入
導入的是指定類中的靜態(tài)成員(/day20_my/src/cn/itcast/staticImport/StaticImportDemo.java)
import static java.util.Collections.*;
System類
- 不需要實例化,都是靜態(tài)的屬性和方法
-
out對應標準輸出流,默認顯示器 -
in屬性對應鍵盤
常見方法: (/day20e/src/cn/itcast/p1/otherapi/SystemDemo.java)
- 獲取當前時間的毫秒值,可以計算程序運行時間:結束時間-開始時間
long currentTimeMillis();
- 獲取系統(tǒng)屬性集及指定信息(
/day20e/系統(tǒng)信息.txt)
Properties prop = System.getProperties();//獲取系統(tǒng)屬性集
Set<String> keySet = prop.stringPropertyNames();
for(String key:keySet){
String value = prop.getProperty(key);//通過鍵獲取值
syso(key + "::::" + value);
}
Properties p = System.getProperty("os.name");//獲取指定信息,如:操作系統(tǒng)Windows 10

- 獲取系統(tǒng)中的行分隔符。這樣該程序在移植時很方便
//寫法一:
System.out.println("hello"+System.getProperty("line.separator")+"XenaLiu");
// 寫法二:
private static final String LINE_SEPARATOR = System.getProperty("line.separator");
System.out.println("hello"+LINE_SEPARATOR+"world");
Math類
提供了操作數學運算的方法,都是靜態(tài)的。(/day20e/src/cn/itcast/p1/otherapi/MathDemo.java)
常用方法:
ceil():返回大于參數的最小整數。
floor():返回小于參數的最大整數。
round():返回四舍五入的整數。
pow(a,b):a的b次方。
random():返回一個double值為正號,大于等于0.0,小于1.0。返回的值是從該范圍(大約)均勻分布而偽隨機選擇的。
Date&DateFormat&Calendar類
(/day20e/src/cn/itcast/p1/otherapi/DateDemo.java)
(/day20e/src/cn/itcast/p1/otherapi/DateDemo2.java)
(/day20e/src/cn/itcast/p1/otherapi/test/DateTest.java)
(/day20e/src/cn/itcast/p1/otherapi/test/DateTest2.java)