激情欧美日韩一区二区,浪货撅高贱屁股求主人调教视频,精品无码成人片一区二区98,国产高清av在线播放,色翁荡息又大又硬又粗视频

10道Java泛型的面試題

時(shí)間:2023-04-02 09:07:04 面試問(wèn)題 我要投稿
  • 相關(guān)推薦

10道關(guān)于Java泛型的面試題

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

10道關(guān)于Java泛型的面試題

這是在各種Java泛型面試中,一開(kāi)場(chǎng)你就會(huì )被問(wèn)到的問(wèn)題中的一個(gè),主要集中在初級和中級面試中。那些擁有Java1.4或更早版本的開(kāi)發(fā)背景的人 都知道,在集合中存儲對象并在使用前進(jìn)行類(lèi)型轉換是多么的不方便。泛型防止了那種情況的發(fā)生。它提供了編譯期的類(lèi)型安全,確保你只能把正確類(lèi)型的對象放入 集合中,避免了在運行時(shí)出現ClassCastException。

2. Java的泛型是如何工作的 ? 什么是類(lèi)型擦除 ?

這是一道更好的泛型面試題。泛型是通過(guò)類(lèi)型擦除來(lái)實(shí)現的,編譯器在編譯時(shí)擦除了所有類(lèi)型相關(guān)的信息,所以在運行時(shí)不存在任何類(lèi)型相關(guān)的信息。例如 List<String>在運行時(shí)僅用一個(gè)List來(lái)表示。這樣做的目的,是確保能和Java 5之前的版本開(kāi)發(fā)二進(jìn)制類(lèi)庫進(jìn)行兼容。你無(wú)法在運行時(shí)訪(fǎng)問(wèn)到類(lèi)型參數,因為編譯器已經(jīng)把泛型類(lèi)型轉換成了原始類(lèi)型。根據你對這個(gè)泛型問(wèn)題的回答情況,你會(huì ) 得到一些后續提問(wèn),比如為什么泛型是由類(lèi)型擦除來(lái)實(shí)現的或者給你展示一些會(huì )導致編譯器出錯的錯誤泛型代碼。請閱讀我的Java中泛型是如何工作的來(lái)了解更 多信息。

3. 什么是泛型中的限定通配符和非限定通配符 ?

這是另一個(gè)非常流行的Java泛型面試題。限定通配符對類(lèi)型進(jìn)行了限制。有兩種限定通配符,一種是<? extends T>它通過(guò)確保類(lèi)型必須是T的子類(lèi)來(lái)設定類(lèi)型的上界,另一種是<? super T>它通過(guò)確保類(lèi)型必須是T的父類(lèi)來(lái)設定類(lèi)型的下界。泛型類(lèi)型必須用限定內的類(lèi)型來(lái)進(jìn)行初始化,否則會(huì )導致編譯錯誤。另一方面<?>表 示了非限定通配符,因為<?>可以用任意類(lèi)型來(lái)替代。更多信息請參閱我的文章泛型中限定通配符和非限定通配符之間的區別。

4. List<? extends T>和List <? super T>之間有什么區別 ?

這和上一個(gè)面試題有聯(lián)系,有時(shí)面試官會(huì )用這個(gè)問(wèn)題來(lái)評估你對泛型的理解,而不是直接問(wèn)你什么是限定通配符和非限定通配符。這兩個(gè)List的聲明都是 限定通配符的例子,List<? extends T>可以接受任何繼承自T的類(lèi)型的List,而List<? super T>可以接受任何T的父類(lèi)構成的List。例如List<? extends Number>可以接受List<Integer>或List<Float>。在本段出現的連接中可以找到更多信息。

5. 如何編寫(xiě)一個(gè)泛型方法,讓它能接受泛型參數并返回泛型類(lèi)型?

編寫(xiě)泛型方法并不困難,你需要用泛型類(lèi)型來(lái)替代原始類(lèi)型,比如使用T, E or K,V等被廣泛認可的類(lèi)型占位符。泛型方法的例子請參閱Java集合類(lèi)框架。最簡(jiǎn)單的情況下,一個(gè)泛型方法可能會(huì )像這樣:

public V put(K key, V value) {

return cache.put(key, value);

}

6. Java中如何使用泛型編寫(xiě)帶有參數的類(lèi)?

這是上一道面試題的延伸。面試官可能會(huì )要求你用泛型編寫(xiě)一個(gè)類(lèi)型安全的類(lèi),而不是編寫(xiě)一個(gè)泛型方法。關(guān)鍵仍然是使用泛型類(lèi)型來(lái)代替原始類(lèi)型,而且要使用JDK中采用的標準占位符。

7. 編寫(xiě)一段泛型程序來(lái)實(shí)現LRU緩存?

對于喜歡Java編程的人來(lái)說(shuō)這相當于是一次練習。給你個(gè)提示,LinkedHashMap可以用來(lái)實(shí)現固定大小的LRU緩存,當LRU緩存已經(jīng)滿(mǎn) 了的時(shí)候,它會(huì )把最老的鍵值對移出緩存。LinkedHashMap提供了一個(gè)稱(chēng)為removeEldestEntry()的方法,該方法會(huì )被put() 和putAll()調用來(lái)刪除最老的鍵值對。當然,如果你已經(jīng)編寫(xiě)了一個(gè)可運行的JUnit測試,你也可以隨意編寫(xiě)你自己的實(shí)現代碼。

8. 你可以把List<String>傳遞給一個(gè)接受List<Object>參數的方法嗎?

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

List<Object> objectList;

List<String> stringList;

objectList = stringList; //compilation error incompatible types

9. Array中可以用泛型嗎?

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

10. 如何阻止Java中的類(lèi)型未檢查的警告?

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

List<String> rawList = new ArrayList()

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

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

Java泛型面試題補充更新:

我手頭又拿到了幾個(gè)Java泛型面試題跟大家分享下,這幾道題集中在泛型類(lèi)型和原始類(lèi)型的區別上,以及我們是否可以用Object來(lái)代替限定通配符的使用等等:

Java中List<Object>和原始類(lèi)型List之間的區別?

原始類(lèi)型和帶參數類(lèi)型<Object>之間的主要區別是,在編譯時(shí)編譯器不會(huì )對原始類(lèi)型進(jìn)行類(lèi)型安全檢查,卻會(huì )對帶參數的類(lèi)型進(jìn)行檢 查,通過(guò)使用Object作為類(lèi)型,可以告知編譯器該方法可以接受任何類(lèi)型的對象,比如String或Integer。這道題的考察點(diǎn)在于對泛型中原始類(lèi) 型的正確理解。它們之間的第二點(diǎn)區別是,你可以把任何帶參數的類(lèi)型傳遞給原始類(lèi)型List,但卻不能把List<String>傳遞給接受 List<Object>的方法,因為會(huì )產(chǎn)生編譯錯誤。更多詳細信息請參閱Java中的泛型是如何工作的。

Java中List<?>和List<Object>之間的區別是什么?

這道題跟上一道題看起來(lái)很像,實(shí)質(zhì)上卻完全不同。List<?> 是一個(gè)未知類(lèi)型的List,而List<Object> 其實(shí)是任意類(lèi)型的List。你可以把List<String>, List<Integer>賦值給List<?>,卻不能把List<String>賦值給 List<Object>。     

List<?> listOfAnyType;

List<Object> listOfObject = new ArrayList<Object>();

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

List<Integer> listOfInteger = new ArrayList<Integer>();

listOfAnyType = listOfString; //legal

listOfAnyType = listOfInteger; //legal

listOfObjectType = (List<Object>) listOfString; //compiler error – in-convertible types

想了解更多關(guān)于通配符的信息請查看Java中的泛型通配符示例

List<String>和原始類(lèi)型List之間的區別.

該題類(lèi)似于“原始類(lèi)型和帶參數類(lèi)型之間有什么區別”。帶參數類(lèi)型是類(lèi)型安全的,而且其類(lèi)型安全是由編譯器保證的,但原始類(lèi)型List卻不是類(lèi)型安全 的。你不能把String之外的任何其它類(lèi)型的Object存入String類(lèi)型的List中,而你可以把任何類(lèi)型的對象存入原始List中。使用泛型的 帶參數類(lèi)型你不需要進(jìn)行類(lèi)型轉換,但是對于原始類(lèi)型,你則需要進(jìn)行顯式的類(lèi)型轉換。

List listOfRawTypes = new ArrayList();

listOfRawTypes.add(“abc”);

listOfRawTypes.add(123); //編譯器允許這樣 – 運行時(shí)卻會(huì )出現異常

String item = (String) listOfRawTypes.get(0); //需要顯式的類(lèi)型轉換

item = (String) listOfRawTypes.get(1); //拋ClassCastException,因為Integer不能被轉換為String

List<String> listOfString = new ArrayList();

listOfString.add(“abcd”);

listOfString.add(1234); //編譯錯誤,比在運行時(shí)拋異常要好

item = listOfString.get(0); //不需要顯式的類(lèi)型轉換 – 編譯器自動(dòng)轉換

這些都是Java泛型面試中 頻繁出現的問(wèn)題及其答案。所有這些面試題都不困難,其實(shí)它們都是基于泛型的基礎知識。任何對泛型有不錯了解的Java程序員都肯定熟知這些泛型題目。如果 你有任何好的面試題,不管是在什么面試中碰到的,或者如果你想知道任何Java泛型面試題的答案。

【10道Java泛型的面試題】相關(guān)文章:

戴爾的10道面試題11-18

名企10道面試題07-10

Java面試題集12-10

解密戴爾的10道招聘面試題07-31

邏輯型面試題03-17

2016年JAVA面試題03-29

Java認證經(jīng)典面試題目03-31

高級Java面試題匯總03-04

java基礎面試題201703-30

戴爾的27道面試題11-06

激情欧美日韩一区二区,浪货撅高贱屁股求主人调教视频,精品无码成人片一区二区98,国产高清av在线播放,色翁荡息又大又硬又粗视频