史上最全的Android面試題集錦(十一)

原文連接:https://blog.csdn.net/xiangzh...java

七、 常量池

7.一、Interger中的128(-128~127)面試

當數值範圍爲-128~127時:若是兩個new出來Integer對象,即便值相同,經過「」比較結果爲false,但兩個對象直接賦值,則經過「」比較結果爲「true,這一點與String很是類似。數組

當數值不在-128~127時,不管經過哪一種方式,即便兩個對象的值相等,經過「」比較,其結果爲false;緩存

當一個Integer對象直接與一個int基本數據類型經過「」比較,其結果與第一點相同;安全

Integer對象的hash值爲數值自己;網絡

@Override public int hashCode() { return Integer.hashCode(value); }ide

7.二、爲何是-128-127?.net

在Integer類中有一個靜態內部類IntegerCache,在IntegerCache類中有一個Integer數組,用以緩存當數值範圍爲-128~127時的Integer對象。設計

八、泛型

泛型是Java SE 1.5的新特性,泛型的本質是參數化類型,也就是說所操做的數據類型被指定爲一個參數。這種參數類型能夠用在類、接口和方法的建立中,分別稱爲泛型類、泛型接口、泛型方法。 Java語言引入泛型的好處是安全簡單。代理

泛型的好處是在編譯的時候檢查類型安全,而且全部的強制轉換都是自動和隱式的,提升代碼的重用率。

它提供了編譯期的類型安全,確保你只能把正確類型的對象放入 集合中,避免了在運行時出現ClassCastException。

使用Java的泛型時應注意如下幾點:

  • 泛型的類型參數只能是類類型(包括自定義類),不能是簡單類型。
  • 同一種泛型能夠對應多個版本(由於參數類型是不肯定的),不一樣版本的泛型類實例是不兼容的。
  • 泛型的類型參數能夠有多個。
  • 泛型的參數類型可使用extends語句,例如。習慣上稱爲「有界類型」。
  • 泛型的參數類型還能夠是通配符類型。例如Class<?> classType =
  • Class.forName(「java.lang.String」);

8.1 T泛型和通配符泛型

  • ? 表示不肯定的java類型。
  • T 表示java類型。
  • K V 分別表明java鍵值中的Key Value。
  • E 表明Element。

8.2 泛型擦除

Java中的泛型基本上都是在編譯器這個層次來實現的。在生成的Java字節碼中是不包含泛型中的類型信息的。使用泛型的時候加上的類型參數,會在編譯器在編譯的時候去掉。這個過程就稱爲類型擦除。

泛型是經過類型擦除來實現的,編譯器在編譯時擦除了全部類型相關的信息,因此在運行時不存在任何類型相關的信息。例如 List在運行時僅用一個List來表示。這樣作的目的,是確保能和Java 5以前的版本開發二進制類庫進行兼容。你沒法在運行時訪問到類型參數,由於編譯器已經把泛型類型轉換成了原始類型。

8.3 限定通配符

限定通配符對類型進行了限制。

一種是<? extends T>它經過確保類型必須是T的子類來設定類型的上界,

另外一種是<? super T>它經過確保類型必須是T的父類來設定類型的下界。

另外一方面<?>表 示了非限定通配符,由於<?>能夠用任意類型來替代。

例如List<? extends Number>能夠接受List或List。

8.4 泛型面試題

你能夠把List傳遞給一個接受List參數的方法嗎?

對任何一個不太熟悉泛型的人來講,這個Java泛型題目看起來使人疑惑,由於乍看起來String是一種Object,因此 List應當能夠用在須要List的地方,可是事實並不是如此。真這樣作的話會致使編譯錯誤。如 果你再深一步考慮,你會發現Java這樣作是有意義的,由於List能夠存儲任何類型的對象包括String, Integer等等,而List卻只能用來存儲Strings。

Array中能夠用泛型嗎?

Array事實上並不支持泛型,這也是爲何Joshua Bloch在Effective Java一書中建議使用List來代替Array,由於List能夠提供編譯期的類型安全保證,而Array卻不能。

Java中List和原始類型List之間的區別?

原始類型和帶參數類型之間的主要區別是,在編譯時編譯器不會對原始類型進行類型安全檢查,卻會對帶參數的類型進行檢查,經過使用Object做爲類型,能夠告知編譯器該方法能夠接受任何類型的對象,好比String或Integer。這道題的考察點在於對泛型中原始類型的正確理解。它們之間的第二點區別是,你能夠把任何帶參數的類型傳遞給原始類型List,但卻不能把List傳遞給接受 List的方法,由於會產生編譯錯誤。

List<?> 是一個未知類型的List,而List 實際上是任意類型的List。你能夠把List, List賦值給List<?>,卻不能把List賦值給 List。

九、反射

9.一、概念

JAVA反射機制是在運行狀態中,對於任意一個類,都可以知道這個類的全部屬性和方法;對於任意一個對象,都可以調用它的任意一個方法;這種動態獲取的信息以及動態調用對象的方法的功能稱爲java語言的反射機制。

9.二、做用

Java反射機制主要提供瞭如下功能: 在運行時判斷任意一個對象所屬的類;在運行時構造任意一個類的對象;在運行時判斷任意一個類所具備的成員變量和方法;在運行時調用任意一個對象的方法;生成動態代理。

十、代理

代理這個詞你們確定已經很是熟悉,由於現實中接觸的不少,其實現實中的東西偏偏能夠很是形象和直觀地反映出模式的抽象過程以及本質。如今房子不是吵得熱火朝天嗎?咱們就以房子爲例,來撥開代理的面紗。

假設你有一套房子要賣,一種方法是你直接去網上發佈出售信息,而後直接帶要買房子的人來看房子、過戶等一直到房子賣出去,可是可能你很忙,你沒有時間去處理這些事情,因此你能夠去找中介,讓中介幫你處理這些瑣碎事情,中介實際上就是你的代理。原本是你要作的事情,如今中介幫助你一一處理,對於買方來講跟你直接交易跟同中介直接交易沒有任何差別,買方甚至可能覺察不到你的存在,這實際上就是代理的一個最大好處。

接下來咱們再深刻考慮一下爲何你不直接買房子而須要中介?其實一個問題偏偏解答了何時該用代理模式的問題。

緣由一:你可能在外地上班,買房子的人無法找到你直接交易。

對應到咱們程序設計的時候就是:客戶端沒法直接操做實際對象。那麼爲何沒法直接操做?一種狀況是你須要調用的對象在另一臺機器上,你須要跨越網絡才能訪問,若是讓你直接coding去調用,你須要處理網絡鏈接、處理打包、解包等等很是複雜的步驟,因此爲了簡化客戶端的處理,咱們使用代理模式,在客戶端創建一個遠程對象的代理,客戶端就象調用本地對象同樣調用該代理,再由代理去跟實際對象聯繫,對於客戶端來講可能根本沒有感受到調用的東西在網絡另一端,這實際上就是Web Service的工做原理。另外一種狀況雖然你所要調用的對象就在本地,可是因爲調用很是耗時,你怕影響你正常的操做,因此特地找個代理來處理這種耗時狀況,一個最容易理解的就是Word裏面裝了很大一張圖片,在word被打開的時候咱們確定要加載裏面的內容一塊兒打開,可是若是等加載完這個大圖片再打開Word用戶等得可能早已經跳腳了,因此咱們能夠爲這個圖片設置一個代理,讓代理慢慢打開這個圖片而不影響Word原本的打開的功能。申明一下我只是猜可能Word是這麼作的,具體到底怎麼作的,俺也不知道。

緣由二:你不知道怎麼辦過戶手續,或者說除了你如今會幹的事情外,還須要作其餘的事情才能達成目的。

對應到咱們程序設計的時候就是:除了當前類可以提供的功能外,咱們還須要補充一些其餘功能。最容易想到的狀況就是權限過濾,我有一個類作某項業務,可是因爲安全緣由只有某些用戶才能夠調用這個類,此時咱們就能夠作一個該類的代理類,要求全部請求必須經過該代理類,由該代理類作權限判斷,若是安全則調用實際類的業務開始處理。可能有人說爲何我要多加個代理類?我只須要在原來類的方法裏面加上權限過濾不就完了嗎?在程序設計中有一個類的單一性原則問題,這個原則很簡單,就是每一個類的功能儘量單一。爲何要單一,由於只有功能單一這個類被改動的可能性纔會最小,就拿剛纔的例子來講,若是你將權限判斷放在當前類裏面,當前這個類就既要負責本身自己業務邏輯、又要負責權限判斷,那麼就有兩個致使該類變化的緣由,如今若是權限規則一旦變化,這個類就必需得改,顯然這不是一個好的設計。

好了,原理的東西已經講得差很少了,要是再講個沒完可能你們要扔磚頭了。呵呵,接下來就看看怎麼來實現代理。

點擊下方連接免費獲取Android進階資料:

https://shimo.im/docs/tXXKHgd...

相關文章
相關標籤/搜索