1.Java中的泛型是什么?使用泛型的好處是什么?
這是在各種Java泛型面試中,一開場(chǎng)你就會(huì)被問(wèn)到的問(wèn)題中的一個(gè),主要集中在初級(jí)和中級(jí)面試中。那些擁有Java1.4或更早版本的開發(fā)背景的人都知道,在集合中存儲(chǔ)對(duì)象并在使用前進(jìn)行類型轉(zhuǎn)換是多么的不方便。泛型防止了那種情況的發(fā)生。它提供了編譯期的類型安全,確保你只能把正確類型的對(duì)象放入集合中,避免了在運(yùn)行時(shí)出現(xiàn)ClassCastException。
2.Java的泛型是如何工作的?什么是類型擦除?
這是一道更好的泛型面試題。泛型是通過(guò)類型擦除來(lái)實(shí)現(xiàn)的,編譯器在編譯時(shí)擦除了所有類型相關(guān)的信息,所以在運(yùn)行時(shí)不存在任何類型相關(guān)的信息。例如List<String>在運(yùn)行時(shí)僅用一個(gè)List來(lái)表示。這樣做的目的,是確保能和Java5之前的版本開發(fā)二進(jìn)制類庫(kù)進(jìn)行兼容。你無(wú)法在運(yùn)行時(shí)訪問(wèn)到類型參數(shù),因?yàn)榫幾g器已經(jīng)把泛型類型轉(zhuǎn)換成了原始類型。根據(jù)你對(duì)這個(gè)泛型問(wèn)題的回答情況,你會(huì)得到一些后續(xù)提問(wèn),比如為什么泛型是由類型擦除來(lái)實(shí)現(xiàn)的或者給你展示一些會(huì)導(dǎo)致編譯器出錯(cuò)的錯(cuò)誤泛型代碼。請(qǐng)閱讀我的Java中泛型是如何工作的來(lái)了解更多信息。
3.什么是泛型中的限定通配符和非限定通配符?
這是另一個(gè)非常流行的Java泛型面試題。限定通配符對(duì)類型進(jìn)行了限制。有兩種限定通配符,一種是<?extendsT>它通過(guò)確保類型必須是T的子類來(lái)設(shè)定類型的上界,另一種是<?superT>它通過(guò)確保類型必須是T的父類來(lái)設(shè)定類型的下界。泛型類型必須用限定內(nèi)的類型來(lái)進(jìn)行初始化,否則會(huì)導(dǎo)致編譯錯(cuò)誤。另一方面<?>表示了非限定通配符,因?yàn)?lt;?>可以用任意類型來(lái)替代。更多信息請(qǐng)參閱我的文章泛型中限定通配符和非限定通配符之間的區(qū)別。
4.List<?extendsT>和List<?superT>之間有什么區(qū)別?
這和上一個(gè)面試題有聯(lián)系,有時(shí)面試官會(huì)用這個(gè)問(wèn)題來(lái)評(píng)估你對(duì)泛型的理解,而不是直接問(wèn)你什么是限定通配符和非限定通配符。這兩個(gè)List的聲明都是限定通配符的例子,List<?extendsT>可以接受任何繼承自T的類型的List,而List<?superT>可以接受任何T的父類構(gòu)成的List。例如List<?extendsNumber>可以接受List<Integer>或List<Float>。在本段出現(xiàn)的連接中可以找到更多信息。
5.如何編寫一個(gè)泛型方法,讓它能接受泛型參數(shù)并返回泛型類型?
編寫泛型方法并不困難,你需要用泛型類型來(lái)替代原始類型,比如使用T,EorK,V等被廣泛認(rèn)可的類型占位符。泛型方法的例子請(qǐng)參閱Java集合類框架。最簡(jiǎn)單的情況下,一個(gè)泛型方法可能會(huì)像這樣:
publicVput(Kkey,Vvalue){
returncache.put(key,value);
}
6.Java中如何使用泛型編寫帶有參數(shù)的類?
這是上一道面試題的延伸。面試官可能會(huì)要求你用泛型編寫一個(gè)類型安全的類,而不是編寫一個(gè)泛型方法。關(guān)鍵仍然是使用泛型類型來(lái)代替原始類型,而且要使用JDK中采用的標(biāo)準(zhǔn)占位符。
7.編寫一段泛型程序來(lái)實(shí)現(xiàn)LRU緩存?
對(duì)于喜歡Java編程的人來(lái)說(shuō)這相當(dāng)于是一次練習(xí)。給你個(gè)提示,linkedHashMap可以用來(lái)實(shí)現(xiàn)固定大小的LRU緩存,當(dāng)LRU緩存已經(jīng)滿了的時(shí)候,它會(huì)把最老的鍵值對(duì)移出緩存。linkedHashMap提供了一個(gè)稱為removeEldestEntry()的方法,該方法會(huì)被put()和putAll()調(diào)用來(lái)刪除最老的鍵值對(duì)。當(dāng)然,如果你已經(jīng)編寫了一個(gè)可運(yùn)行的JUnit測(cè)試,你也可以隨意編寫你自己的實(shí)現(xiàn)代碼。
8.你可以把List<String>傳遞給一個(gè)接受List<Object>參數(shù)的方法嗎?
對(duì)任何一個(gè)不太熟悉泛型的人來(lái)說(shuō),這個(gè)Java泛型題目看起來(lái)令人疑惑,因?yàn)檎Э雌饋?lái)String是一種Object,所以List<String>應(yīng)當(dāng)可以用在需要List<Object>的地方,但是事實(shí)并非如此。真這樣做的話會(huì)導(dǎo)致編譯錯(cuò)誤。如果你再深一步考慮,你會(huì)發(fā)現(xiàn)Java這樣做是有意義的,因?yàn)長(zhǎng)ist<Object>可以存儲(chǔ)任何類型的對(duì)象包括String,Integer等等,而List<String>卻只能用來(lái)存儲(chǔ)Strings。
List<Object>objectList;
List<String>stringList;
objectList=stringList;//compilationerrorincompatibletypes
9.Array中可以用泛型嗎?
這可能是Java泛型面試題中最簡(jiǎn)單的一個(gè)了,當(dāng)然前提是你要知道Array事實(shí)上并不支持泛型,這也是為什么JoshuaBloch在EffectiveJava一書中建議使用List來(lái)代替Array,因?yàn)長(zhǎng)ist可以提供編譯期的類型安全保證,而Array卻不能。
10.如何阻止Java中的類型未檢查的警告?
如果你把泛型和原始類型混合起來(lái)使用,例如下列代碼,Java5的javac編譯器會(huì)產(chǎn)生類型未檢查的警告,例如
List<String>rawList=newArrayList()
以上就是長(zhǎng)沙一度軟件培訓(xùn)Java培訓(xùn)機(jī)構(gòu)小編介紹的“Java泛型面試題總結(jié)”的內(nèi)容,希望對(duì)大家有幫助,如有疑問(wèn),請(qǐng)?jiān)诰€咨詢,有專業(yè)老師隨時(shí)為你服務(wù)。
相關(guān)推薦
最新最全java面試題及答案(初級(jí)到高級(jí))
史上最全的中高級(jí)JAVA工程師面試題及答案匯總
Java高級(jí)開發(fā)工程師面試題
2019史上最全java面試題題庫(kù)大全800題
哪有資深java工程師面試題