API(三)——集合框架(下)

Keywords: 泛型、Collections工具類、Arrays工具類、可變參數、靜態(tài)導入、System類、Math類、Date&DateFormat&Calendar

泛型

泛型的概述

問題: 什么類型的元素都可以往集合中存儲,導致取出時,如果出現強轉就會引發(fā)運行時ClassCastException。能不能再創(chuàng)建集合時,就明確容器中元素的類型,如同數組一樣。
目的: 讓集合使用更安全
解決方案: 泛型,創(chuàng)建集合時,直接在集合上明確要存儲的元素的類型,只要不是指定的類型對象,編譯器檢查會報錯。這樣就將運行時的問題轉移到編譯時期。

泛型的好處:

  1. 安全機制
  2. 將運行時期的ClassCastException轉移到編譯時期,變成了編譯失敗
  3. 泛型技術,是給編譯器使用的技術
  4. 泛型的出現避免了強轉的麻煩

格式: 集合類型<元素類型> 變量名 = new 集合類型<元素類型>()

泛型的擦除: 運行時,會將泛型去掉,生成的class文件中是不帶泛型的,這個稱為泛型的擦除。
為什么擦除: 為了兼容運行的類加載器。生成的class文件中就不帶泛型了

泛型的補償: 在運行時,通過獲取元素的類型進行轉換動作。不用使用者在強制轉換了。

泛型的表現:
泛型技術在集合框架中應用的范圍很大,只要看到類,或者接口在描述時右邊定義<>,就需要泛型。其實是容器在不明確操作元素的類型的情況下,對外提供了一個參數<>,使用容器時,只要將具體的類型實參傳遞給該參數即可。說白了,泛型就是傳遞類型參數。

泛型的應用

定義泛型類

Object類為最上層的父類,很多程序員為了使程序更為通用,設計程序時通常使傳入的值與返回的值都以Object類型為主。當需要使用這些實例時,必須正確地將該實例轉換為原來的類型,否則在運行時將會發(fā)生ClassCastException異常。JDK1.5以后提出了泛型機制。(/day18e/src/cn/itcast/p4/generic/define/demo/Tool.java)
格式:

  1. 類名<T>,其中T代表元素類型
  2. 類名<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)
格式:

  1. 上限:? extends E,接收E類型或E的子類型
  2. 下限:? 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類

  1. 不需要實例化,都是靜態(tài)的屬性和方法
  2. out對應標準輸出流,默認顯示器
  3. in屬性對應鍵盤

常見方法: (/day20e/src/cn/itcast/p1/otherapi/SystemDemo.java)

  1. 獲取當前時間的毫秒值,可以計算程序運行時間:結束時間-開始時間
long currentTimeMillis();
  1. 獲取系統(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
getProperties鍵值對應列表
  1. 獲取系統(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)

?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
【社區(qū)內容提示】社區(qū)部分內容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發(fā)布,文章內容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

友情鏈接更多精彩內容