寫些安卓開發的面試題

來源:互聯網
上載者:User

標籤:

希望你可以弄懂這些,對你自己的好處會很大,如果你想在這個行業發展下面這些東西避免不了繞不過去

J2EE 部分:

  1. Switch能否用string做參數?
  2. equals與==的區別:
    1. equals是比較兩個對象的值是否相等,而==比較這兩個是否是同一對象
  3. Object有哪些公用方法?
    1. 方法equals測試的是兩個對象是否相等
    2. 方法clone進行對象拷貝
    3. 方法getClass返回和當前對象相關的Class對象
    4. 方法notify,notifyall,wait都是用來對給定對象進行線程同步的
  4. Java的四種引用,強弱軟虛,用到的情境
    1. 強引用:如果一個對象具有強引用,它就不會被記憶體回收行程回收。即使當前記憶體空間不足,JVM 也不會回收它,而是拋出OutOfMemoryError 錯誤,使程式異常終止。如果想中斷強引用和某個對象之間的關聯,可以顯式地將引用賦值為,這樣一來的話,JVM在合適的時間就會回收該對象
    2. 軟引用:在使用軟引用時,如果記憶體的空間足夠,軟引用就能繼續被使用,而不會被記憶體回收行程回收,只有在記憶體不足時,軟引用才會被記憶體回收行程回收。
    3. 弱引用:具有弱引用的對象擁有的生命週期更短暫。因為當 JVM 進行記憶體回收,一旦發現弱引用對象,無論當前記憶體空間是否充足,都會將弱引用回收。不過由於記憶體回收行程是一個優先順序較低的線程,所以並不一定能迅速發現弱引用對象
    4. 虛引用:顧名思義,就是形同虛設,如果一個對象僅持有虛引用,那麼它相當於沒有引用,在任何時候都可能被記憶體回收行程回收。
    5. 使用情境:
      1. 利用軟引用和弱引用解決OOM問題:用一個HashMap來儲存圖片的路徑 和 相應圖片對象關聯的軟引用之間的映射關係,在記憶體不足時,JVM會自動回收這些緩衝圖片對象所佔用的空間,從而有效地避免了OOM的問題
      2. 通過軟可及對象重獲方法實現Java對象的快取: 比如我們建立了一Employee的類,如果每次需要查詢一個僱員的資訊。哪怕是幾秒中之前剛剛查詢過的,都要重新構建一個執行個體,這是需要消耗很多時間的。我們可以通過軟引用和 HashMap 的結合,先是儲存引用方面:以軟引用的方式對一個Employee對象的執行個體進行引用並儲存該引用到HashMap 上,key 為此僱員的 id,value為這個對象的軟引用,另一方面是取出引用,緩衝中是否有該Employee執行個體的軟引用,如果有,從軟引用中取得。如果沒有軟引用,或者從軟引用中得到的執行個體是,重新構建一個執行個體,並儲存對這個建立執行個體的軟引用
  5. Hashcode的作用,與 equal 有什麼區別
    1. 同樣用於評鑑2個對象是否相等的,java集合中有 list 和 set 兩類,其中 set不允許元素重複實現,那個這個不允許重複實現的方法,如果用 equal 去比較的話,如果存在1000個元素,你 new 一個新的元素出來,需要去調用1000次 equal 去逐個和他們比較是否是同一個對象,這樣會大大降低效率。hashcode實際上是返回對象的儲存地址,如果這個位置上沒有元素,就把元素直接儲存在上面,如果這個位置上已經存在元素,這個時候才去調用equal方法與新元素進行比較,相同的話就不存了,散列到其他地址上
  6. String、StringBuffer與StringBuilder的區別
    1. String 類型和 StringBuffer 類型的主要效能區別其實在於 String 是不可變的對象
    2. StringBuffer和StringBuilder底層是 char數組實現的
    3. StringBuffer是安全執行緒的,而StringBuilder是線程不安全的
  7. Override和Overload的含義去區別
    1. Overload顧名思義是重新載入,它可以表現類的多態性,可以是函數裡面可以有相同的函數名但是參數名、傳回值、類型不能相同;或者說可以改變參數、類型、傳回值但是函數名字依然不變。
    2. 就是ride(重寫)的意思,在子類繼承父類的時候子類中可以定義某方法與其父類有相同的名稱和參數,當子類在調用這一函數時自動調用子類的方法,而父類相當於被覆蓋(重寫)了。
  8. 抽象類別和介面的區別
    1. 一個類只能繼承單個類,但是可以實現多個介面
    2. 介面強調特定功能的實現,而抽象類別強調所屬關係
    3. 抽象類別中的所有方法並不一定要是抽象的,你可以選擇在抽象類別中實現一些基本的方法。而介面要求所有的方法都必須是抽象的
  9. 解析XML的幾種方式的原理與特點:DOM、SAX、PULL
    1. DOM:消耗記憶體:先把xml文檔都讀到記憶體中,然後再用DOM API來訪問樹形結構,並擷取資料。這個寫起來很簡單,但是很消耗記憶體。要是資料過大,手機不夠牛逼,可能手機直接死機
    2. SAX:解析效率高,佔用記憶體少,基於事件驅動的:更加簡單地說就是對文檔進行順序掃描,當掃描到文檔(document)開始與結束、元素(element)開始與結束、文檔(document)結束等地方時通知事件處理函數,由事件處理函數做相應動作,然後繼續同樣的掃描,直至文檔結束。
    3. SAX:與 SAX 類似,也是基於事件驅動,我們可以調用它的next方法,來擷取下一個解析事件(就是開始文檔,結束文檔,開始標籤,結束標籤),當處於某個元素時可以調用XmlPullParser的getAttributte方法來擷取屬性的值,也可調用它的nextText擷取本節點的值。
  10. wait和sleep的區別
    1. sleep來自Thread類,和wait來自Object類
    2. 調用sleep方法的過程中,線程不會釋放對象鎖。而 調用 wait 方法線程會釋放對象鎖
    3. sleep睡眠後不出讓系統資源,wait讓出系統資源其他線程可以佔用CPU
    4. sleep(milliseconds)需要指定一個睡眠時間,時間一到會自動喚醒
  11. JAVA 中堆和棧的區別,說下java 的記憶體機制
    1. 基礎資料型別 (Elementary Data Type)比變數和對象的引用都是在棧分配的
    2. 堆記憶體用來存放由new建立的對象和數組
    3. 類變數(static修飾的變數),程式在一載入的時候就在堆中為類變數分配記憶體,堆中的記憶體位址存放在棧中
    4. 執行個體變數:當你使用java關鍵字new的時候,系統在堆中開闢並不一定是連續的空間分配給變數,是根據零散的堆記憶體位址,通過雜湊演算法換算為一長串數字以表徵這個變數在堆中的"物理位置”,執行個體變數的生命週期--當執行個體變數的引用丟失後,將被GC(記憶體回收行程)列入可回收“名單”中,但並不是馬上就釋放堆中記憶體
    5. 局部變數: 由聲明在某方法,或某程式碼片段裡(比如for迴圈),執行到它的時候在棧中開闢記憶體,當局部變數一但脫離範圍,記憶體立即釋放
  12. JAVA多態的實現原理
    1. 抽象的來講,多態的意思就是同一訊息可以根據發送對象的不同而採用多種不同的行為方式。(發送訊息就是函數調用)
    2. 實現的原理是動態綁定,程式調用的方法在運行期才動態綁定,追溯源碼可以發現,JVM 通過參數的自動轉型來找到合適的辦法。
  13. JAVA 記憶體回收機制
    1. 什麼是記憶體回收機:釋放那些不再持有引用的對象的記憶體
    2. 怎麼判斷一個對象是否需要收集?
      1. 引用計數(最簡單古老的方法):指將資源(可以是對象、記憶體或磁碟空間等等)的被引用次數儲存起來,當被引用次數變為零時就將其釋放的過程
      2. 對象引用遍曆(現在大多數 jvm 使用的方法):對象引用遍曆從一組對象開始,沿著整個對象圖上的每條連結,遞迴確定可到達(reachable)的對象。如果某對象不能從這些根對象的一個(至少一個)到達,則將它作為垃圾收集
    3. 幾種記憶體回收機制
      1. 標記回收法:遍曆對象圖並且記錄可到達的對象,以便刪除不可到達的對象,一般使用單線程工作並且可能產生記憶體片段
      2. 標記-壓縮回收法:前期與第一種方法相同,只是多了一步,將所有的存活對象壓縮到記憶體的一端 ,這樣記憶體片段就可以合成一大塊可再利用的記憶體地區,提高了記憶體利用率
      3. 複製回收法:把現有記憶體空間分成兩部分,gc運行時,它把可到達對象複製到另一半空間,再清空正在使用的空間的全部對象。這種方法適用於短生存期的對象,持續複製長生存期的對象則導致效率降低。
      4. 分代回收發:把記憶體空間分為兩個或者多個域,如年輕代和老年代,年輕代的特點是對象會很快被回收,因此在年輕代使用效率比較高的演算法。當一個對象經過幾次回收後依然存活,對象就會被放入稱為老年的記憶體空間,老年代則採取標記-壓縮演算法
  14. 講講 Java 中的集合有多少種,區別是什嗎?
    1. ArrayList、LinkedList、Vector的區別:ArrayList 和Vector底層是採用數組方式儲存資料,Vector由於使用了synchronized方法(安全執行緒)所以效能上比ArrayList要差,LinkedList使用雙向鏈表實現儲存,隨機存取比較慢
    2. HashMap的底層源碼實現:當我們往HashMap中put元素的時候,先根據key的hashCode重新計算hash值,根據hash值得到這個元素在數組中的位置(即下標),如果數組該位置上已經存放有其他元素了,那麼在這個位置上的元素將以鏈表的形式存放,新加入的放在鏈頭,最先加入的放在鏈尾。如果數組該位置上沒有元素,就直接將該元素放到此數組中的該位置上。
    3. Fail-Fast機制:在使用迭代器的過程中有其他線程修改了map,那麼將拋出ConcurrentModificationException,這就是所謂fail-fast機制。這一機制在源碼中的實現是通過modCount域,modCount顧名思義就是修改次數,對HashMap內容的修改都將增加這個值,那麼在迭代器初始化過程中會將這個值賦給迭代器的expectedModCount。 在迭代過程中,判斷modCount跟expectedModCount是否相等,如果不相等就表示已經有其他線程修改了Map.
    4. HashMap和 HashTable 的區別:
      1. HashTable比較老,是基於Dictionary 類實現的,HashTable 則是基於 Map介面實現的
      2. HashTable 是線程不安全的, HashMap 則是線程不安全的
      3. HashMap可以讓你將空值作為一個表的條目的key或value

Android部分:

  1. 註冊廣播有哪幾種方式,有什麼區別
  2. 繪製 Activity 的生命流程圖
  3. 註冊Service需要注意什麼
  4. Service與Activity怎麼實現通訊
  5. Handle通訊具體到源碼,是怎麼實現的
  6. Handle的機制
  7. 怎麼實現ListView多種布局?
  8. ListView與資料庫綁定的實現
  9. 怎麼實現一個部分更新的 ListView?
  10. ListView卡頓的原因與效能最佳化,說的越多越好
  11. Android中的動畫有哪些,區別是什麼
  12. JNI怎麼使用
  13. 說說記憶體泄露的情況有哪些
  14. OOM是怎麼引起的?怎麼盡量避免 OOM 問題的出現
  15. 什麼是 ANR 問題?為什麼會引起 ANR 問題?
  16. Socker編程的步驟
  17. 設計一個圖片緩衝載入機制
  18. Fragment嵌套多個Fragment會出現bug嗎
  19. Activity中如何動態添加Fragment
  20. 記憶體不足時,怎麼保持Activity的一些狀態,在哪個方法裡面做具體操作?
  21. Scrollview怎麼判斷是否滑倒底部
  22. ViewPager 的怎麼做效能最佳化
  23. Asynctask具體用法?
  24. Asynctask的Do in background方法是怎麼通知UI線程重新整理進度條的?
  25. Asynctask的Do in background方法預設是返回 true ,表示任務完成,如果想返回具體的資料呢,怎麼做。如果Activity被銷毀了,還會執行到postexcutd方法嗎?
  26. View中onTouch,onTouchEvent,onClick的執行順序
  27. 不使用動畫,怎麼實現一個動態 View?
  28. Postvalidata與Validata有什麼區別?
  29. Asset與raw都能存放資源,他們有什麼區別?
  30. 如何自訂ViewGroup?
  31. 什麼是 MVC 模式?MVC 模式的好處是什嗎?
  32. JVM 和Dalvik虛擬機器的區別
  33. 應用常駐後台,避免被第三方殺掉的方法,講講你用過的奇淫巧技?
  34. 資料持久化的四種方式有哪些?

資料結構與演算法部分:

  1. 給最外層的rootview,把這個根視圖下的全部button背景設定成紅色,手寫代碼,不許用遞迴
  2. 給一串字串比如abbbcccd,輸出a1b3c3d1,手寫代碼(注意有個別字元可能會出現十次以上的情況)
  3. 一個序列,它的形式是12349678,9是最高峰,經曆了一個上升又下降的過程,找出裡面的最大值的位置,要求效率儘可能高
  4. 二叉尋找樹的刪除操作,手寫代碼
  5. 反轉鏈表,手寫代碼
  6. 二分尋找,手寫代碼
  7. 有海量條 url,其中不重複的有300萬條,現在希望挑選出重複 出現次數最高的url,要求效率儘可能的高
  8. 一篇英語文章,去掉字元只留下k個,如何去掉才能使這k個字元字典序最小
  9. 弗洛伊德演算法和 Dijkstra演算法的區別?複雜度是多少?講講 Dijkstra演算法的具體過程
  10. 反轉字串,要求手寫代碼,最佳化速度、最佳化空間
  11. 給出兩個無向圖,找出這2個無向圖中相同的環路。手寫代碼
  12. 單例模式,手寫代碼
  13. 生產者與消費者,手寫代碼
  14. 二叉樹鏡像,手寫代碼
  15. 最長不重複子串(最長重複子串),手寫代碼

作業系統部分:

  1. 分別從作業系統的記憶體角度與進程線程角度解釋分析堆,棧二者的區別
  2. 什麼是事務?
  3. OSI七層模型有哪些,各層次的作用
  4. TCP的三向交握過程,四次揮手過程,為什麼需要三次?
  5. 說說作業系統中進程的通訊方式
  6. 瀏覽器輸入地址之後,之後的過程
  7. 談談 HTTP 中Get 和 Post 方法的區別?

寫些安卓開發的面試題

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.