12月份辭職,我的如意算盤是年前面一下定下來,然后休息,年后入職~~美滋滋!約面幾家發現現在要求都好高啊,技術深度源碼架構級,小紅書、猿輔導每一面都有算法,算法不過,就止步了。所以就踏踏實實的準備了,年后回來面了一下,最后拿了三家的offer,在這給大家分享一些經驗!我覺得很多同學其實技術都是不錯的,就是面試的話術上可能表述的不夠清楚有條理,所以可能這個面經更偏重與幫大家總結面試時回答的重點,沒有特別具體的答案,如果有哪些問題,搞不清楚答案的,可以留言我會私信解答!
有的面試官可能會很客氣,說先問一下基礎哈,如果你只答基礎,那你就太天真了!一定要有延伸~有深度思考~有拓展~,不要給一個合理但是不出彩的答案,一定要給一個有條理的全面的優秀的答案。
一 、View相關
1.自定義View
合理的答案:自定義一個View,需要考慮構造方法,onMeasure方法,onSizechanged(),onLayout,onDraw。
優秀的答案:Android中有幾種自定義View,有繼承View的,有繼承ViewGroup的,有繼承特定View的,有繼承特定ViewGroup的,然后每一種我們都需要重寫哪些方法,為什么有的要重寫measure方法等。
面試官延伸:getMeasureWidth 和 getWidth的區別?view的invalidate和requestLayout區別?
2.View的繪制
合理的答案:onMeasure()+? onLayout() + onDraw() 調用順序,以及父View和子View各個方法在做什么。
優秀的答案:View的繪制從哪里開始的?(加分點可以不說)+繪制基礎+自定義View時需要注意的+自己遇到過的坑/在View的繪制流程中有哪些可以優化的點(或需要注意的點)
面試官延伸:LinearLayout和RelativeLayout 測量的區別,多次測量都在測什么?有weight的時候,怎么測量?
3.觸摸反饋
合理的答案:涉及到哪些方法,調用順序,這個部分只要看過應該都能說出來,就是別說的亂了。
優秀的答案:觸摸反饋的過程中涉及到哪些角色,比如Activity 、ViewGroup、View,他們都負責做什么,他們接收到不同的事件都做了哪些處理。區分Down事件和Move /Up事件,分別描述。
面試官延伸:滑動沖突? scrollView里面有一個button,然后按住button向上滑,講述事件傳遞過程?按住一個button,然后手指移到別處,click事件還能不能響應?
4.ListView RecyclerView
合理的答案:兩者使用上的區別
優秀的答案:使用上的區別+緩存機制的區別(源碼)
面試官延伸:如何優化
二、Handler的消息處理機制相關
1、ThreadLocal工作原理
合理的答案:作用域+怎么存?
優秀的答案:在哪些情況下用+java 的和Android的有什么區別(加分點)+優點(如果沒有ThreadLocal,我們就要。。。)+具體應用(looper或者其他應用的實例)
面試官延伸:ThreadLocal和使用synchronized有什么區別?
2、Handler工作原理
合理的答案:handler looper message都負責什么,然后handler.sendMessage之后哪些方法被調用了,最后handler怎么收到的消息。一定要講源碼?。。?/p>
優秀的答案:handler是負責線程切換的,結合具體調用源碼,講述怎么切換的,先講UI和非UI,再講子線程使用handler和主線程有什么區別。
面試官延伸:一個線程能否創建多個Handler,Handler跟Looper之間的對應關系?looper.loop為什么沒有阻塞主線程?子線程的looper.loop()之后的語句嗎還會被執行嗎?handler的postDelayed方法是在哪個線程等待?View的post方法實現原理?
三、多線程相關
1、volatile關鍵字作用
合理的答案:保證可見性,禁止指令重排
優秀的答案:jvm內存模型+線程安全(原子性、可見性、有序性)+volatile保證了哪個
2、synchronized原理及使用
合理的答案:保證可見性和有序性
優秀的答案:jvm內存模型+線程安全(原子性、可見性、有序性)+synchronized保證了哪個+底層如何實現(monitor)
面試官延伸:類鎖和方法鎖的區別?與Lock的區別?
3、Android實現多線程的方式
合理的答案:thread 、runnable、線程池等
優秀的答案:以上加上適用的場景+幾種線程池的分析
面試官延伸:sleep wait區別?生產者消費者(代碼實現)死鎖(代碼實現)
四、java相關
1、垃圾回收
合理的答案:什么樣的東西是垃圾,怎么回收
優秀的答案:jvm內存模型,GC roots? ,垃圾回收算法及怎么選擇,Android的Dalvik和ART 在垃圾回收上有什么不同?
面試官延伸:內存泄漏?ooM問題的排查?垃圾回收在哪個線程?
2、類加載器
合理的答案:雙親委托 加載過程
優秀的答案:java有幾種類加載器,加載過程,Android 幾種類加載器,加載過程,為什么要設計成這種委托模式?JVM在搜索類的時候,又是如何判定兩個class是相同的呢?
面試官延伸:插件化、熱更新(最好還能擴展除了類加載以外的其他的熱更新方式)
3、動態代理 注解 反射
合理的答案:解釋概念
優秀的答案:解釋概念加上比如動態代理在Retrofit當中的應用 ,自定義注解,反射為什么耗性能
面試官延伸:注解如何實現一個findViewById
4、泛型
合理的答案:解釋概念
優秀的答案:為何引入泛型+泛型擦除+泛型邊界
面試官延伸:一般會手寫代碼考你對泛型擦除和邊界的理解
5、數據結構(別的不會HashMap也要會的熟練的仿佛是自己寫的)
合理的答案:數組+鏈表
優秀的答案:結構+put元素如何實現+擴容+size()
面試官延伸:ArrayMap和SparseArray的改進?是不是一定比HashMap好?是查找算法好還是結構比hashmap合理?ConcurrentHashMap的原理?(此處坑多,不同的JDK版本結構不一樣)
五、優化和設計相關
1、優化相關
合理的答案:網上也很多文章,很多優化點,就怕說不全。
優秀的答案:其實Android的優化涉及的方面比較多,啟動優化、內存優化、布局優化、卡頓優化、電量優化、網絡優化等,我主要負責過哪部分的優化。。。然后,項目原來。。。優化的目標。。。,我們在線下如何排查問題,用了哪些工具,我們在線上怎么監控,我們怎么保持優化的長期效果等
面試官延伸:這個部分可能會問,你們優化后的具體數值體現?
2、設計相關
這個部分通常都是加分項,可以參照看過的網絡框架、圖片框架等的結構進行設計。比如一個網絡的話,肯定要考慮它的協議層,還有其他負責連接管理和線程管理的基礎組件等。
六、開源框架相關
1、網絡框架
合理的答案:okhttp retrofit volley如何使用
優秀的答案:源碼級別,okhttp(攔截器鏈的每個攔截器都負責什么+具體應用)retrofit(動態代理+適配器等挖掘里面用的好的編程思想和設計模式)volley我不熟,參考前兩個。。。
面試官延伸:如何給某些特定域名的url增加header?https?
2、圖片框架
合理的答案:對比Glide 和 Picasso 和Fresco,下載圖片的方式,緩存機制,加載到內存的機制都有什么不同。
優秀的答案:以上+深入一個框架的源碼,進行分析,比如Fresco的MVC、Drawable層次及繪制,內存緩存、硬盤緩存、職責鏈模式、對象池、自定義計數引用等
面試官延伸:如果你設計一個圖片庫?
以上是我在面試過程中出現率比較高的部分,如果大家有遇到過比較好的面試題,可以留言,我在整理補充在后面,先這樣,希望大家都能在面試中真正發揮出自己的真正水平~~~