Java學習筆記(十七)泛型及併發線程
泛型:
泛型的形式:
<E>
<E extends 類型>
<E extends Numner&comparator> 類名&接口,表示E繼承Numner類實現comparator接口
<?> 泛型通配符表示任意類型,僅用於傳參
<? extends 類型> 表示這個類型可以是該類或者該類的子類。
<? super 類型> 表示這個類型可以是該類或者該類的父類。
泛型的優點:
指定泛型後,取出數據時不需要進行強制類型轉換,可以直接賦值給相應類型。
可以限定集合中的元素類型,保證集合中的元素是按照要求放入的。
可以增強多態(繼承多個接口而無需寫繼承類)。
保證參數有效。
泛型的侷限性:
不能實例化泛型
T t = new T(); //error
數組不可用泛型限定
List<String>[] list = new List<String>[10]; //錯誤
E[] a = new E[10]; //錯誤
類的靜態變量不能聲明爲類的泛型類型
public class GenClass<T> {
private static T t; //編譯錯誤
}
靜態方法可以是泛型方法(在修飾符和返回值之間寫泛型),但是不可以使用類的泛型。
static void copyArrayToList(Object[] os,List<T> ls){
//錯誤,T爲類的泛型
}
static <E> void copyArrayToList(E[] os,List<E> ls){
//泛型方法,正確的
}
泛型不能使用簡單類型
GenList<int> nList = new GenList<int>(); //編譯錯誤
泛型類不能是異常類,也就是該泛型類不能繼承自Throwable以及其子類
public class MyExpection<T> extends Exception{ } //編譯錯誤
可以拋出(throws)泛型類,但catch的參數不能是泛型類。
注意:
編譯時類型的泛型和運行時類型的泛型一定要一致,沒有多態。
支持泛型的集合,只能存放指定的類型,或者是指定類型的子類型。
註釋(元數據):
描述代碼的代碼,作用是規範編譯器的語法。
三種內置註釋:
@Deprecated 所標註的程序元素是不推薦使用的
@Override 檢查是否爲合法的覆蓋父類的方法
@SuppressWarnings 註釋類或方法,忽略其中的某些類型的警告信息
註釋的三種類型:
標記註釋:不需要任何參數
@Override
@Deprecated
單值註釋:有一個值的註釋
@註釋名(值名=值)
值名一般爲value,可以省略的,直接寫值就可以
值的類型是有限制的,只能是以下幾種:
8種基本數據類型
String
Class
Enum
Annotation
以及他們的數組
多值註釋:每個值之間用逗號隔開
四種元註釋:java.lang.annotation中的類
元註釋:註釋註釋的註釋,用來限定註釋的特徵
@Terget 用來限定某個註釋的使用範圍,可以對什麼元素進行註釋
@Retention 用來描述註釋的有效範圍
@Inherited 用來描述某註釋是否有繼承性
@Documented 用來限定註釋的信息是否能夠進行文檔化
自定義註釋:
在自定義註釋時,要用元註釋來進行描述。
如:
import java.lang.annotation.*;
@Target({ElementType.METHOD})
@Inherited
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface InProgress {
String author(); //定義屬性
String limited();
}
解析註釋:利用反射
1、Class.forName()
2、getMethod
3、判斷是否有註釋
4、getAnnotation
併發線程:
三個多線程包:
java.util.concurrent 包含了常用的多線程工具,是新的多線程工具的主體。
java.util.concurrent.atomic 包含了不用加鎖情況下就能改變值的原子變量。
java.util.concurrent.locks 包含鎖定的工具。
Executor接口:
替代了Thread類,他可以創建定量的、動態的以及週期性的線程池。
ExecutorService接口:
線程池,用來存放線程來節省創建和銷燬資源的消耗。
Callable和Future接口:
Callable是類似於Runnable的接口,實現Callable接口的類和實現Runnable的類都是可被其它線程執行的任務。Callable和Runnable有幾點不同:
Callable規定的方法是call(),而Runnable規定的方法是run().
Callable的任務執行後可返回值,而Runnable的任務是不能返回值的。
call()方法可拋出異常,而run()方法是不能拋出異常的。
運行Callable任務可拿到一個Future對象,通過Future對象可瞭解任務執行情況,可取消任務的執行,還可獲取任務執行的結果。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.