Android面試題-最新

其實面試題並不是只有需要面試的朋友看的,平時看看鞏固一下,加強記憶也是很好的,下面我在網上查找了一些Android面試題,希望可以幫到大家,也爲自己溫習起到幫助。
Java部分

  1. Switch能否用string做參數?
    在 Java 7 之前, switch 只能支持byte,short,char,int 或者其對應的封裝類以及 enum 類型。在JAVA 7中,String 支持被加上了。

  2. equals與==的區別:
    ==是判斷兩個變量或實例是不是指向同一個內存空間
    equals是判斷兩個變量或實例所指向的內存空間的值是不是相同

  3. Object有哪些公用方法?
    方法equals測試的是兩個對象是否相等
    方法clone進行對象拷貝
    方法getClass返回和當前對象相關的Class對象
    方法notify,notifyall,wait都是用來對給定對象進行線程同步的

  4. String、StringBuffer與StringBuilder的區別
    String 類型和 StringBuffer 類型的主要性能區別其實在於 String 是不可變的對象
    StringBuffer和StringBuilder底層是 char[]數組實現的
    StringBuffer是線程安全的,而StringBuilder是線程不安全的

  5. Override和Overload的含義去區別
    Overload顧名思義是重新加載,它可以表現類的多態性,可以是函數裏面可以有相同的函數名但是參數名、返回值、類型不能相同;或者說可以改變參數、類型、返回值但是函數名字依然不變。
    就是ride(重寫)的意思,在子類繼承父類的時候子類中可以定義某方法與其父類有相同的名稱和參數,當子類在調用這一函數時自動調用子類的方法,而父類相當於被覆蓋(重寫)了。

  6. 抽象類和接口的區別
    一個類只能繼承單個類,但是可以實現多個接口
    接口強調特定功能的實現,而抽象類強調所屬關係
    抽象類中的所有方法並不一定要是抽象的,你可以選擇在抽象類中實現一些基本的方法。而接口要求所有的方法都必須是抽象的

  7. 解析XML的幾種方式的原理與特點:DOM、SAX、PULL
    DOM:消耗內存:先把xml文檔都讀到內存中,然後再用DOM API來訪問樹形結構,並獲取數據。這個寫起來很簡單,但是很消耗內存。要是數據過大,手機不夠牛逼,可能手機直接死機
    SAX:解析效率高,佔用內存少,基於事件驅動的:更加簡單地說就是對文檔進行順序掃描,當掃描到文檔(document)開始與結束、元素(element)開始與結束、文檔(document)結束等地方時通知事件處理函數,由事件處理函數做相應動作,然後繼續同樣的掃描,直至文檔結束。
    SAX:與 SAX 類似,也是基於事件驅動,我們可以調用它的next()方法,來獲取下一個解析事件(就是開始文檔,結束文檔,開始標籤,結束標籤),當處於某個元素時可以調用XmlPullParser的getAttributte()方法來獲取屬性的值,也可調用它的nextText()獲取本節點的值。

  8. wait()和sleep()的區別
    sleep來自Thread類,和wait來自Object類
    調用sleep()方法的過程中,線程不會釋放對象鎖。而 調用 wait 方法線程會釋放對象鎖
    sleep睡眠後不出讓系統資源,wait讓出系統資源其他線程可以佔用CPU
    sleep(milliseconds)需要指定一個睡眠時間,時間一到會自動喚醒

  9. JAVA 中堆和棧的區別,說下java 的內存機制
    基本數據類型比變量和對象的引用都是在棧分配的
    堆內存用來存放由new創建的對象和數組
    類變量(static修飾的變量),程序在一加載的時候就在堆中爲類變量分配內存,堆中的內存地址存放在棧中
    實例變量:當你使用java關鍵字new的時候,系統在堆中開闢並不一定是連續的空間分配給變量,是根據零散的堆內存地址,通過哈希算法換算爲一長串數字以表徵這個變量在堆中的”物理位置”,實例變量的生命週期–當實例變量的引用丟失後,將被GC(垃圾回收器)列入可回收“名單”中,但並不是馬上就釋放堆中內存
    局部變量: 由聲明在某方法,或某代碼段裏(比如for循環),執行到它的時候在棧中開闢內存,當局部變量一但脫離作用域,內存立即釋放

  10. JAVA多態的實現原理
    抽象的來講,多態的意思就是同一消息可以根據發送對象的不同而採用多種不同的行爲方式。(發送消息就是函數調用)
    實現的原理是動態綁定,程序調用的方法在運行期才動態綁定,追溯源碼可以發現,JVM 通過參數的自動轉型來找到合適的辦法。

  11. JAVA 垃圾回收機制
    什麼是垃圾回收機:釋放那些不再持有引用的對象的內存
    怎麼判斷一個對象是否需要收集?
    引用計數(最簡單古老的方法):指將資源(可以是對象、內存或磁盤空間等等)的被引用次數保存起來,當被引用次數變爲零時就將其釋放的過程
    對象引用遍歷(現在大多數 jvm 使用的方法):對象引用遍歷從一組對象開始,沿着整個對象圖上的每條鏈接,遞歸確定可到達(reachable)的對象。如果某對象不能從這些根對象的一個(至少一個)到達,則將它作爲垃圾收集
    幾種垃圾回收機制
    標記回收法:遍歷對象圖並且記錄可到達的對象,以便刪除不可到達的對象,一般使用單線程工作並且可能產生內存碎片
    標記-壓縮回收法:前期與第一種方法相同,只是多了一步,將所有的存活對象壓縮到內存的一端,這樣內存碎片就可以合成一大塊可再利用的內存區域,提高了內存利用率
    複製回收法:把現有內存空間分成兩部分,gc運行時,它把可到達對象複製到另一半空間,再清空正在使用的空間的全部對象。這種方法適用於短生存期的對象,持續複製長生存期的對象則導致效率降低。
    分代回收發:把內存空間分爲兩個或者多個域,如年輕代和老年代,年輕代的特點是對象會很快被回收,因此在年輕代使用效率比較高的算法。當一個對象經過幾次回收後依然存活,對象就會被放入稱爲老年的內存空間,老年代則採取標記-壓縮算法

  12. 講講 Java 中的集合有多少種,區別是什麼?
    ArrayList、LinkedList、Vector的區別:ArrayList 和Vector底層是採用數組方式存儲數據,Vector由於使用了synchronized方法(線程安全)所以性能上比ArrayList要差,LinkedList使用雙向鏈表實現存儲,隨機存取比較慢
    HashMap的底層源碼實現:當我們往HashMap中put元素的時候,先根據key的hashCode重新計算hash值,根據hash值得到這個元素在數組中的位置(即下標),如果數組該位置上已經存放有其他元素了,那麼在這個位置上的元素將以鏈表的形式存放,新加入的放在鏈頭,最先加入的放在鏈尾。如果數組該位置上沒有元素,就直接將該元素放到此數組中的該位置上。
    Fail-Fast機制:在使用迭代器的過程中有其他線程修改了map,那麼將拋出ConcurrentModificationException,這就是所謂fail-fast機制。這一機制在源碼中的實現是通過modCount域,modCount顧名思義就是修改次數,對HashMap內容的修改都將增加這個值,那麼在迭代器初始化過程中會將這個值賦給迭代器的expectedModCount。在迭代過程中,判斷modCount跟expectedModCount是否相等,如果不相等就表示已經有其他線程修改了Map.
    HashMap和 HashTable 的區別:
    HashTable比較老,是基於Dictionary 類實現的,HashTable 則是基於 Map接口實現的
    HashTable 是線程安全的, HashMap 則是線程不安全的
    HashMap可以讓你將空值作爲一個表的條目的key或value

Android部分

  1. Android中五種數據存儲方式分別是什麼?他們的特點?
    Android提供了五種存取數據的方式
    1)SharedPreference,存放較少的五種類型的數據,只能在同一個包內使用,生成XML的格式存放在設備中;
    2)SQLite數據庫,存放各種數據,是一個輕量級的嵌入式數據庫;
    3)File文件,通過讀取寫入方式生成文件存放數據;
    4)ContentProvider,主要用於讓其他應用程序使用保存的數據;
    5)通過網絡獲取數據和寫入數據到網絡存儲空間。

  2. 說說 android 中 mvc 的具體體現
    mvc是model,view,controller的縮寫,mvc包含三個部分:
    模型(model)對象:是應用程序的主體部分,所有的業務邏輯都應該寫在該層。
      視圖(view)對象:是應用程序中負責生成用戶界面的部分。也是在整個mvc架構中用戶唯一可以看到的一層,接收用戶的輸入,顯示處理結果。
      控制器(control)對象:是根據用戶的輸入,控制用戶界面數據顯示及更新model對象狀態的部分,控制器更重要的一種導航功能,響應用戶出發的相關事件,交給m層處理。
      android鼓勵弱耦合和組件的重用,在android中mvc的具體體現如下:
    1)視圖(view):一般採用xml文件進行界面的描述,使用的時候可以非常方便的引入。
    2)控制層(controller):android的控制層的重任通常落在了衆多的acitvity的肩上,這句話也就暗含了不要在activity中寫過多的代碼,要通過activity交割model業務邏輯層處理,這樣做的另外一個原因是android中的activity的響應時間是5s,如果耗時的操作放在這裏,程序就很容易被回收掉。
    3)模型層(model):對數據庫的操作、對網絡等的操作都應該在model裏面處理,當然對業務計算等操作也是必須放在的該層的。

  3. 簡述SharedPreferences存儲方式以及SharedPreferences與SQLite數據庫的區別。
    SharedPreferences也是一種輕型的數據存儲方式,它的本質是基於XML文件存儲key-value鍵值對數據,通常用來存儲一些簡單的配置信息。其存儲位置在/data/data/<包名>/shared_prefs目錄下。SharedPreferences對象本身只能讀取數據而不支持寫入數據,存儲修改是通過Editor對象實現。SharedPreferences對象與SQLite數據庫相比,免去了創建數據庫,創建表,寫SQL語句等諸多操作,相對而言更加方便,簡潔。但是SharedPreferences也有其自身缺陷,比如其職能存儲boolean,int,float,long和String五種簡單的數據類型,比如其無法進行條件查詢等。所以不論SharedPreferences的數據存儲操作是如何簡單,它也只能是存儲方式的一種補充,而無法完全替代如SQLite數據庫這樣的其他數據存儲方式。

  4. 描述handler 機制的原理
    andriod提供了 Handler 和 Looper 來滿足線程間的通信。
    Handler 先進先出原則。Looper類用來管理特定線程內對象之間的消息交換(Message Exchange)。
    1)Looper: 一個線程可以產生一個Looper對象,由它來管理此線程裏的Message Queue(消息隊列)。
    2)Handler: 你可以構造Handler對象來與Looper溝通,以便push新消息到Message Queue裏;或者接收Looper從Message Queue取出)所送來的消息。
    3)Message Queue(消息隊列):用來存放線程放入的消息。
    4)線程:UI thread 通常就是main thread,而Android啓動程序時會替它建立一個Message Queue。

  5. 顯式intent和隱式intent的區別是什麼(Android)
    Intent定義:Intent是一種在不同組件之間傳遞的請求消息,是應用程序發出的請求和意圖。作爲一個完整的消息傳遞機制,Intent不僅需要發送端,還需要接收端。
    顯式Intent定義:對於明確指出了目標組件名稱的Intent,我們稱之爲顯式Intent;
      隱式Intent定義:對於沒有明確指出目標組件名稱的Intent,則稱之爲隱式Intent。
      說明:Android系統使用IntentFilter 來尋找與隱式Intent相關的對象。

  6. 簡述通過contentResolver獲取ContentProvider內容的基本步驟
    1)得到ContentResolver類對象:ContentResolver cr = getContentResolver();
    2)定義要查詢的字段String數組;
    3)使用cr.query();返回一個Cursor對象;
    4)使用while循環得到Cursor裏面的內容。

  7. 描述4 種 activity 的啓動模式
    1)standard :系統的默認模式,一次跳轉即會生成一個新的實例。假設有一個activity命名爲MainActivity,執行語句:
    startActivity(new Intent(MainActivity.this, MainActivity.class))後,MainActivity將跳轉到另外一個MainActivity,也就是現在的Task棧裏面有MainActivity的兩個實例。按返回鍵後你會發現仍然是在MainActivity(第一個)裏面。
    2)singleTop:singleTop 跟standard 模式比較類似。如果已經有一個實例位於Activity棧的頂部時,就不產生新的實例,而只是調用Activity中的newInstance()方法。如果不位於棧頂,會產生一個新的實例。例:當MainActivity爲 singleTop 模式時,執行跳轉後棧裏面依舊只有一個實例,如果現在按返回鍵程序將直接退出。
    3)singleTask: singleTask模式和後面的singleInstance模式都是隻創建一個實例的。在這種模式下,無論跳轉的對象是不是位於棧頂的activity,程序都不會生成一個新的實例(當然前提是棧裏面已經有這個實例)。這種模式相當有用,在以後的多activity開發中,經常會因爲跳轉的關係導致同個頁面生成多個實例,這個在用戶體驗上始終有點不好,而如果你將對應的activity聲明爲 singleTask 模式,這種問題將不復存在。
    4)singleInstance: 設置爲 singleInstance 模式的 activity 將獨佔一個task(感覺task可以理解爲進程),獨佔一個task的activity與其說是activity,倒不如說是一個應用,這個應用與其他activity是獨立的,它有自己的上下文activity。

  8. Android中如何訪問自定義ContentProvider?
    通過ContentProvider的Uri訪問開放的數據。
    1)ContenResolver對象通過Context提供的方法getContenResolver()來獲得。
    2)ContenResolver提供了以下方法來操作:insert delete update query這些方法分別會調用ContenProvider中與之對應的方法並得到返回的結果。

  9. Android中的動畫有哪幾類,它們的特點和區別是什麼?
    Android中動畫可以分爲兩大類:幀動畫、補間動畫
    1)補間動畫:你定義一個開始和結束,中間的部分由程序運算得到。主要有:旋轉、平移、放縮和漸變;AlphaAnimation(漸變型動畫)、scaleAnimation(縮放型動畫)、 TranslateAnimation(平移型動畫)、 RotateAnimation(旋轉型動畫)、
    2)逐幀動畫:Frame(把一連串的圖片進行系列化連續播放,如同放電影的效果),它是通過播放一張一張圖片來達到動畫的效果。

  10. View的繪製流程
    View的繪製流程

    measure()方法,layout(),draw()三個方法主要存放了一些標識符,來判斷每個View是否需要再重新測量,佈局或者繪製,主要的繪製過程還是在onMeasure,onLayout,onDraw這個三個方法中
    1.onMesarue() 爲整個View樹計算實際的大小,即設置實際的高(對應屬性:mMeasuredHeight)和寬(對應屬性: mMeasureWidth),每個View的控件的實際寬高都是由父視圖和本身視圖決定的。
    2.onLayout() 爲將整個根據子視圖的大小以及佈局參數將View樹放到合適的位置上。
    3.onDraw() 開始繪製圖像,繪製的流程如下
    首先繪製該View的背景
    調用onDraw()方法繪製視圖本身 (每個View都需要重載該方法,ViewGroup不需要實現該方法)
    如果該View是ViewGroup,調用dispatchDraw ()方法繪製子視圖
    繪製滾動條

更多Android Java面試題:http://download.csdn.net/detail/chengliang0315/9717089

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章