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對象可瞭解任務執行情況,可取消任務的執行,還可獲取任務執行的結果。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章