java基礎(chǔ)面試題——泛型

139. Java中的泛型是什么 ? 使用泛型的好處是什么?

創(chuàng)新互聯(lián)專注于當(dāng)雄網(wǎng)站建設(shè)服務(wù)及定制,我們擁有豐富的企業(yè)做網(wǎng)站經(jīng)驗。 熱誠為您提供當(dāng)雄營銷型網(wǎng)站建設(shè),當(dāng)雄網(wǎng)站制作、當(dāng)雄網(wǎng)頁設(shè)計、當(dāng)雄網(wǎng)站官網(wǎng)定制、小程序開發(fā)服務(wù),打造當(dāng)雄網(wǎng)絡(luò)公司原創(chuàng)品牌,更為您提供當(dāng)雄網(wǎng)站排名全網(wǎng)營銷落地服務(wù)。

(更多相關(guān)面試題推薦:java面試題及答案)

泛型是Java SE 1.5的新特性,泛型的本質(zhì)是參數(shù)化類型,也就是說所操作的數(shù)據(jù)類型被指定為一個參數(shù)。

好處:

1、類型安全,提供編譯期間的類型檢測

2、前后兼容

3、泛化代碼,代碼可以更多的重復(fù)利用

4、性能較高,用GJ(泛型JAVA)編寫的代碼可以為java編譯器和虛擬機帶來更多的類型信息,這些信息對java程序做進一步優(yōu)化提供條件。

140,Java的泛型是如何工作的 ? 什么是類型擦除 ?如何工作?

1、類型檢查:在生成字節(jié)碼之前提供類型檢查

2、類型擦除:所有類型參數(shù)都用他們的限定類型替換,包括類、變量和方法(類型擦除)

3、如果類型擦除和多態(tài)性發(fā)生了沖突時,則在子類中生成橋方法解決

4、如果調(diào)用泛型方法的返回類型被擦除,則在調(diào)用該方法時插入強制類型轉(zhuǎn)換

類型擦除:

所有類型參數(shù)都用他們的限定類型替換:

比如

T->Object   ? extends BaseClass->BaseClass

如何工作:

泛型是通過類型擦除來實現(xiàn)的,編譯器在編譯時擦除了所有類型相關(guān)的信息,所以在運行時不存在任何類型相關(guān)的信息。例如 List<String>在運行時僅用一個List來表示。這樣做的目的,是確保能和Java 5之前的版本開發(fā)二進制類庫進行兼容。你無法在運行時訪問到類型參數(shù),因為編譯器已經(jīng)把泛型類型轉(zhuǎn)換成了原始類型。根據(jù)你對這個泛型問題的回答情況,你會得到一些后續(xù)提問,比如為什么泛型是由類型擦除來實現(xiàn)的或者給你展示一些會導(dǎo)致編譯器出錯的錯誤泛型代碼。

141,你可以把List<String>傳遞給一個接受List<Object>參數(shù)的方法嗎?

對任何一個不太熟悉泛型的人來說,這個Java泛型題目看起來令人疑惑,因為乍看起來String是一種Object,所以 List<String>應(yīng)當(dāng)可以用在需要List<Object>的地方,但是事實并非如此。真這樣做的話會導(dǎo)致編譯錯誤。如果你再深一步考慮,你會發(fā)現(xiàn)Java這樣做是有意義的,因為List<Object>可以存儲任何類型的對象包括String, Integer等等,而List<String>卻只能用來存儲String s。

List<Object> objectList;
List<String> stringList;
objectList = stringList; //compilation error incompatible types

142,如何阻止Java中的類型未檢查的警告?

如果你把泛型和原始類型混合起來使用,例如下列代碼,java 5的javac編譯器會產(chǎn)生類型未檢查的警告,例如

List<String> rawList = newArrayList()

注意: Hello.java使用了未檢查或稱為不安全的操作;

這種警告可以使用@SuppressWarnings(“unchecked”)注解來屏蔽。

143,Java中List<Object>和原始類型List之間的區(qū)別?

原始類型和帶參數(shù)類型<Object>之間的主要區(qū)別是,在編譯時編譯器不會對原始類型進行類型安全檢查,卻會對帶參數(shù)的類型進行檢查,通過使用Object作為類型,可以告知編譯器該方法可以接受任何類型的對象,比如String或Integer。

這道題的考察點在于對泛型中原始類型的正確理解。它們之間的第二點區(qū)別是,你可以把任何帶參數(shù)的類型傳遞給原始類型List,但卻不能把List<String>傳遞給接受 List<Object>的方法,因為會產(chǎn)生編譯錯誤。

144,編寫一段泛型程序來實現(xiàn)LRU緩存?

對于喜歡Java編程的人來說這相當(dāng)于是一次練習(xí)。給你個提示,LinkedHashMap可以用來實現(xiàn)固定大小的LRU緩存,當(dāng)LRU緩存已經(jīng)滿了的時候,它會把最老的鍵值對移出緩存。

LinkedHashMap提供了一個稱為removeEldestEntry()的方法,該方法會被put() 和putAll()調(diào)用來刪除最老的鍵值對。當(dāng)然,如果你已經(jīng)編寫了一個可運行的JUnit測試,你也可以隨意編寫你自己的實現(xiàn)代碼。

(推薦教程:java課程)

145,Array中可以用泛型嗎?

這可能是Java泛型面試題中最簡單的一個了,當(dāng)然前提是你要知道Array事實上并不支持泛型,這也是為什么Joshua Bloch在Effective Java一書中建議使用List來代替Array,因為List可以提供編譯期的類型安全保證,而Array卻不能。

146,如何編寫一個泛型方法,讓它能接受泛型參數(shù)并返回泛型類型?

編寫泛型方法并不困難,你需要用泛型類型來替代原始類型,比如使用T, E or K,V等被廣泛認可的類型占位符。最簡單的情況下,一個泛型方法可能會像這樣:

public V put(K key, V value) {
return cahe.put(key,value);
}

147,C++模板和java泛型之間有何不同?

java泛型實現(xiàn)根植于“類型消除”這一概念。當(dāng)源代碼被轉(zhuǎn)換為Java虛擬機字節(jié)碼時,這種技術(shù)會消除參數(shù)化類型。有了Java泛型,我們可以做的事情也并沒有真正改變多少;他只是讓代碼變得漂亮些。鑒于此,Java泛型有時也被稱為“語法糖”。

這和 C++模板截然不同。在 C++中,模板本質(zhì)上就是一套宏指令集,只是換了個名頭,編譯器會針對每種類型創(chuàng)建一份模板代碼的副本。

由于架構(gòu)設(shè)計上的差異,Java泛型和C++模板有很多不同點:

C++模板可以使用int等基本數(shù)據(jù)類型。Java則不行,必須轉(zhuǎn)而使用Integer。

在Java中,可以將模板的參數(shù)類型限定為某種特定類型。

在C++中,類型參數(shù)可以實例化,但java不支持。

在Java中,類型參數(shù)不能用于靜態(tài)方法(?)和變量,因為它們會被不同類型參數(shù)指定的實例共享。在C++,這些類時不同的,因此類型參數(shù)可以用于靜態(tài)方法和靜態(tài)變量。

在Java中,不管類型參數(shù)是什么,所有的實例變量都是同一類型。類型參數(shù)會在運行時被抹去。在C++中,類型參數(shù)不同,實例變量也不同。

相關(guān)推薦:java入門

文章標題:java基礎(chǔ)面試題——泛型
本文來源:http://www.muchs.cn/article10/cjjhdo.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供ChatGPT手機網(wǎng)站建設(shè)、品牌網(wǎng)站制作虛擬主機、微信公眾號、網(wǎng)站設(shè)計

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)

網(wǎng)站建設(shè)網(wǎng)站維護公司