<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    Java泛型面試題


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

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

      2. Java的泛型是如何工作的 ? 什么是類型擦除 ?

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

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

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

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

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

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

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

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

      6. Java中如何使用泛型編寫帶有參數(shù)的類?

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

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

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

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

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

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

      9. Array中可以用泛型嗎?

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

      10. 如何阻止Java中的類型未檢查的警告?

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

    List<String> rawList = new ArrayList() 注意: Hello.java使用了未檢查或稱為不安全的操作; 

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

      Java泛型面試題補充更新:

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

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

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

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

      這道題跟上一道題看起來很像,實質(zhì)上卻完全不同。List<?> 是一個未知類型的List,而List<Object>其實是任意類型的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>和原始類型List之間的區(qū)別.

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

    List listOfRawTypes = new ArrayList(); listOfRawTypes.add("abc"); listOfRawTypes.add(123); //編譯器允許這樣 - 運行時卻會出現(xiàn)異常 String item = (String) listOfRawTypes.get(0); //需要顯式的類型轉(zhuǎn)換 item = (String) listOfRawTypes.get(1); //拋ClassCastException,因為Integer不能被轉(zhuǎn)換為String       List<String> listOfString = new ArrayList(); listOfString.add("abcd"); listOfString.add(1234); //編譯錯誤,比在運行時拋異常要好 item = listOfString.get(0); //不需要顯式的類型轉(zhuǎn)換 - 編譯器自動轉(zhuǎn)換 

    posted on 2014-08-08 15:14 鍵盤動物 閱讀(543) 評論(0)  編輯  收藏


    只有注冊用戶登錄后才能發(fā)表評論。


    網(wǎng)站導(dǎo)航:
     
    <2014年8月>
    272829303112
    3456789
    10111213141516
    17181920212223
    24252627282930
    31123456

    導(dǎo)航

    統(tǒng)計

    常用鏈接

    留言簿

    隨筆檔案

    新聞分類

    搜索

    最新評論

    閱讀排行榜

    評論排行榜

    主站蜘蛛池模板: 一区二区三区免费视频观看| 亚洲日韩国产一区二区三区在线 | 另类小说亚洲色图| 免费人成在线视频| 四虎影视久久久免费观看| 精品剧情v国产在免费线观看| 久久久久亚洲国产| 免费无码看av的网站| 亚洲JIZZJIZZ妇女| 国产真人无码作爱视频免费| 国产亚洲成归v人片在线观看| 一边摸一边桶一边脱免费视频 | 老司机午夜精品视频在线观看免费 | 国产一区二区三区亚洲综合 | 99久久国产免费-99久久国产免费| 亚洲ⅴ国产v天堂a无码二区| 无码国产精品一区二区免费16| 亚洲国产第一站精品蜜芽| 97国产在线公开免费观看| 亚洲国产精品综合久久久| 黄色成人网站免费无码av| 亚洲成AV人片高潮喷水| 亚洲精品国产日韩无码AV永久免费网| 国产va免费精品| 亚洲天堂中文字幕| 在线jyzzjyzz免费视频| 日韩在线观看免费| 久久亚洲AV成人无码国产 | 中文字幕成人免费高清在线| 亚洲国产日韩一区高清在线| 日本视频一区在线观看免费| www亚洲精品久久久乳| 中文字幕亚洲乱码熟女一区二区 | 免费观看AV片在线播放| 久久精品国产亚洲av品善| 亚洲欭美日韩颜射在线二| 久久综合久久综合亚洲| 亚洲男女内射在线播放| 久久精品视频免费看| 九九精品国产亚洲AV日韩| 亚洲国产另类久久久精品|