1. 程式人生 > >Java 泛型概念相關面試題

Java 泛型概念相關面試題

老版本 string 語言 值類型 新特性 exce cep bsp 組類型

問:Java 的泛型是什麽?有什麽好處和優點?JDK 不同版本的泛型有什麽區別?

答:泛型是 Java SE 1.5 的新特性,泛型的本質是參數化類型,這種參數類型可以用在類、接口和方法的創建中,分別稱為泛型類、泛型接口、泛型方法。在 Java SE 1.5 之前沒有泛型的情況的下只能通過對類型 Object 的引用來實現參數的任意化,其帶來的缺點是要做顯式強制類型轉換,而這種強制轉換編譯期是不做檢查的,容易把問題留到運行時,所以 泛型的好處是在編譯時檢查類型安全,並且所有的強制轉換都是自動和隱式的,提高了代碼的重用率,避免在運行時出現 ClassCastException。

JDK 1.5 引入了泛型來允許強類型在編譯時進行類型檢查;JDK 1.7 泛型實例化類型具備了自動推斷能力,譬如 List<String> list = new ArrayList<String>(); 可以寫成 List<String> llist = new ArrayList<>(); 了,JDK 具備自動推斷能力。下面幾種寫法可以說是不同版本的兼容性了:

//JDK 1.5 推薦使用的寫法

List<String> list =new ArrayList<String>();

//JDK 1.7 推薦使用的寫法

List<String> llist =new ArrayList<>();

//可以使用,但不推薦,是為了兼容老版本,IDE 會提示警告,可以通過註解屏蔽警告

List<String> list =new ArrayList();

//可以使用,但不推薦,是為了兼容老版本,IDE 會提示警告,可以通過註解屏蔽警告

List list =new ArrayList<String>();

問:Java 泛型是如何工作的?什麽是類型擦除?

答:泛型是通過類型擦除來實現的,編譯器在編譯時擦除了所有泛型類型相關的信息,所以在運行時不存在任何泛型類型相關的信息,譬如 List<Integer> 在運行時僅用一個 List 來表示,這樣做的目的是為了和 Java 1.5 之前版本進行兼容。泛型擦除具體來說就是在編譯成字節碼時首先進行類型檢查,接著進行類型擦除(即所有類型參數都用他們的限定類型替換,包括類、變量和方法),接著如果類型擦除和多態性發生沖突時就在子類中生成橋方法解決,接著如果調用泛型方法的返回類型被擦除則在調用該方法時插入強制類型轉換。

問:Java 泛型類、泛型接口、泛型方法有什麽區別?

答:泛型類是在實例化類的對象時才能確定的類型,其定義譬如 class Test<T> {},在實例化該類時必須指明泛型 T 的具體類型。

泛型接口與泛型類一樣,其定義譬如 interface Generator<E> { E dunc(E e); }。

泛型方法所在的類可以是泛型類也可以是非泛型類,是否擁有泛型方法與所在的類無關,所以在我們應用中應該盡可能使用泛型方法,不要放大作用空間,尤其是在 static 方法時 static 方法無法訪問泛型類的類型參數,所以更應該使用泛型的 static 方法(聲明泛型一定要寫在 static 後返回值類型前)。泛型方法的定義譬如 <T> void func(T val) {}。

問:Java 如何優雅的實現元組?

答:元組其實是關系數據庫中的一個學術名詞,一條記錄就是一個元組,一個表就是一個關系,紀錄組成表,元組生成關系,這就是關系數據庫的核心理念。很多語言天生支持元組,譬如 Python 等,在語法本身支持元組的語言中元組是用括號表示的,如 (int, bool, string) 就是一個三元組類型,不過在 Java、C 等語言中就比較坑爹,語言語法本身不具備這個特性,所以在 Java 中我們如果想優雅實現元組就可以借助泛型類實現,如下是一個三元組類型的實現:

Triplet<A,B,C>{

private A a;

private B a;

private C a;

public Triplet(A a,B b,C c){

this.a =a;

this.b =b;

this.c =c;

}

}


歡迎加入學習交流群569772982,大家一起學習交流。

Java 泛型概念相關面試題