今天早上參加了深圳 OPPO 開發工程師的技術面試,總的來講面試過程不是很順利。面試官並無問一些很深奧的底層原理,基本都是一些 Java 基礎以及 Android 四大組件內的基礎,可是我自身在開發過程當中並無很重視這些理論基礎,致使不少知識點都忘記了。整個面試過程耗時一小時,感謝兩位面試官不厭其煩地給我提示,一方面讓我可以回想起來那些遺忘的知識點,另外一方面也緩解了尷尬的氣氛。。。
順便一說,OPPO 的保密工做仍是作得比較嚴格的,進去後海卓越中心大樓前須要申請臨時通行證才能進去。而在面試前還須要登記,而且把手機的先後攝像頭都給用膠帶封起來才能進行面試。廢話少說,下面分紅兩部分彙總一下此次技術面試的知識點。html
1. 如何理解Java的多態?其中,重載和重寫有什麼區別?java
多態是同一個行爲具備多個不一樣表現形式或形態的能力,多態是同一個接口,使用不一樣的實例而執行不一樣操做,多態就是程序運行期間才肯定,一個引用變量倒底會指向哪一個類的實例對象,該引用變量發出的方法調用究竟是哪一個類中實現的方法。多態存在的三個必要條件是:繼承,重寫,父類引用指向子類引用。多態的三個實現方式是:重寫,接口,抽象類和抽象方法。android
重寫(Override)和重載(Overload)的區別web
區別點重載重寫參數列表必須修改不能修改返回類型能夠修改不能修改異常能夠修改能夠減小或刪除,必定不能拋出新的或者更廣的異常訪問能夠修改必定不能作更嚴格的限制(能夠下降限制)面試
2. 談一下JVM內存區域劃分?哪部分是線程公有的,哪部分是私有的?JVM 的內存區域能夠分爲兩類:線程私有和區域和線程共有的區域。 線程私有的區域:程序計數器、JVM 虛擬機棧、本地方法棧;線程共有的區域:堆、方法區、運行時常量池。sql
其實除了程序計數器,其餘的部分都會發生 OOM。數據庫
3. final關鍵字的用法?設計模式
final 能夠修飾類、變量和方法。修飾類表明這個類不可被繼承。修飾變量表明此變量不可被改變。修飾方法表示此方法不可被重寫 (override)。api
4. 死鎖是怎麼致使的?數據結構
如何定位死鎖某個任務在等待另外一個任務,然後者又等待別的任務,這樣一直下去,直到這個鏈條上的任務又在等待第一個任務釋放鎖。這獲得了一個任務之間互相等待的連續循環,沒有哪一個線程能繼續。這被稱之爲死鎖。當如下四個條件同時知足時,就會產生死鎖:
(1) 互斥條件。任務所使用的資源中至少有一個是不能共享的。
(2) 任務必須持有一個資源,同時等待獲取另外一個被別的任務佔有的資源。
(3) 資源不能被強佔。
(4) 必須有循環等待。一個任務正在等待另外一個任務所持有的資源,後者又在等待別的任務所持有的資源,這樣一直下去,直到有一個任務在等待第一個任務所持有的資源,使得你們都被鎖住。
要解決死鎖問題,必須打破上面四個條件的其中之一。在程序中,最容易打破的每每是第四個條件。
關於如何手寫死鎖和定位方法,可參考這篇博客。https://blog.csdn.net/Andy_96...
5. 數據庫如何進行升級?SQLite增刪改查的基礎sql語句?
<pre style="box-sizing: border-box; outline: none; margin: 0px; padding: 0px; border: 0px; font-style: normal; font-variant-ligatures: normal; font-variant-caps: normal; font-variant-numeric: inherit; font-variant-east-asian: inherit; font-weight: 400; font-stretch: inherit; font-size: 18px; line-height: inherit; font-family: couriernew, courier, monospace; vertical-align: baseline; color: rgb(93, 93, 93); letter-spacing: normal; orphans: 2; text-align: start; text-indent: 0px; text-transform: none; widows: 2; word-spacing: 0px; -webkit-text-stroke-width: 0px; background-color: rgb(255, 255, 255); text-decoration-style: initial; text-decoration-color: initial;">
/** * Create a helper object to create, open, and/or manage a database. * This method always returns very quickly. The database is not actually * created or opened until one of {@link #getWritableDatabase} or * {@link #getReadableDatabase} is called. * * @param context to use to open or create the database * @param name of the database file, or null for an in-memory database * @param factory to use for creating cursor objects, or null for the default * @param version number of the database (starting at 1); if the database is older, * {@link #onUpgrade} will be used to upgrade the database; if the database is * newer, {@link #onDowngrade} will be used to downgrade the database */ public SQLiteOpenHelper(Context context, String name, CursorFactory factory, int version) { this(context, name, factory, version, null); } public SQLiteDatabase getWritableDatabase() { synchronized (this) { return getDatabaseLocked(true); } } private SQLiteDatabase getDatabaseLocked(boolean writable) { ....... db.beginTransaction(); try { if (version == 0) { onCreate(db); } else { if (version > mNewVersion) { onDowngrade(db, version, mNewVersion); } else { onUpgrade(db, version, mNewVersion); } } db.setVersion(mNewVersion); db.setTransactionSuccessful(); } finally { db.endTransaction(); } }
</pre>
在 SQLiteOpenHelper 的構造函數中,包含了一個 version 的參數。這個參數便是數據庫的版本。 因此,咱們能夠經過修改 version 來實現數據庫的升級。 當version 大於原數據庫版本時,onUpgrade()會被觸發,能夠在該方法中編寫數據庫升級邏輯。具體的數據庫升級邏輯示例可參考這裏。
經常使用的SQL增刪改查:
ps:操做數據表是:ALTER TABLE。該語句用於在已有的表中添加、修改或刪除列。ALTER TABLE table_name ADD column_name datatypeALTER TABLE table_name DROP COLUMN column_name
1. Broadcast的分類?有序,無序?粘性,非粘性?本地廣播?
2. Android中的事件傳遞機制?
當咱們的手指觸碰到屏幕,事件是按照Activity->ViewGroup->View這樣的流程到達最終響應觸摸事件的View的。而在事件分發過程當中,涉及到三個最重要的方法:dispatchTouchEvent()、onInterceptTouchEvent()、onTouchEvent。咱們的手指觸摸到屏幕的時候,會觸發一個Action_Down類型的事件,當前頁面的Activity會首先作出相應,也就是說會走到Activity的dispatchTouchEvent()方法內。在這個方法內部有下面兩個邏輯:
一般狀況下,ViewGroup 的 onInterceptTouchEvent() 都返回 false,表示不攔截。這裏須要注意的是事件序列,好比Down事件、Move事件…Up事件,從 Down到 Up 是一個完整的事件序列,對應着手指從按下到擡起這一系列事件,若是ViewGroup 攔截了 Down 事件,那麼後續事件都會交給這個 ViewGroup 的onTouchEvent。若是 ViewGroup 攔截的不是 Down 事件,那麼會給以前處理這個Down 事件的 View發送一個Action_Cancel 類型的事件,通知子View這個後續的事件序列已經被 ViewGroup 接管了,子 View 恢復以前的狀態便可。
這裏舉一個常見的例子:
有時候會有人混淆onTouchEvent和onTouch。首先,這兩個方法都在View的dispatchTouchEvent()中:
最後附上流程圖總結:
touch事件傳遞流程
參考:https://juejin.im/entry/58df5...
https://juejin.im/post/5b8f15...
3. Handler的原理?
與Handler密切相關的還有Message、MessageQueue、Looper。
4. ANR出現的狀況有幾種? 怎麼分析解決ANR問題?
ANR(Application Not responding)。Android中,主線程(UI線程)若是在規定時內沒有處理完相應工做,就會出現ANR。具體來講,ANR會在如下幾種狀況中出現:
(1) 輸入事件(按鍵和觸摸事件)5s內沒被處理
(2) BroadcastReceiver的事件(onRecieve方法)在規定時間內沒處理完(前臺廣播爲10s,後臺廣播爲60s)
(3) service 前臺20s後臺200s未完成啓動(4) ContentProvider的publish在10s內沒進行完
分析ANR問題,須要結合Log以及trace文件。具體分析流程,可參照如下兩篇文章:https://www.jianshu.com/p/fa9...
https://blog.csdn.net/droyon/...
5. 內存泄露的場景有哪些?內存泄漏分析工具使用方法?常見的內存泄露有:
而對於內存泄露的檢測,經常使用的工具備LeakCanary、MAT(Memory Analyer Tools)、Android Studio自帶的Profiler。關於用法,網上教程不少,可自行查閱,下面兩個經供參考:
三種用法、MAT同時附上官方Android Profiler教程
6. 如何實現啓動優化,有什麼工具可使用?重點提到了systrace這個工具,詳細用法能夠參考下面幾篇文章:https://blog.csdn.net/Kitty_L...
https://www.cnblogs.com/baiqi...
https://blog.csdn.net/xiyangy...
https://blog.csdn.net/cxq2348...
7. 經常使用的設計模式有哪些?是否瞭解責任鏈模式?單例模式,觀察者模式,工廠模式,建造者模式,構造者模式,中間者模式,橋接模式,適配器模式等等。
如今回顧一下,問的問題並不難,只是環環相扣問出了不少細節相關的知識點。由此看來,在平常開發中還須要注重基礎。尤爲對於開發經驗是 1-5年內的 Android Developer,面試官考察的多數是基礎知識是否牢固,溝通表達能力,總結能力。雖然這次面試黃了,但不失爲一次很好的經歷。
文章不易,若是你們喜歡這篇文章,或者對你有幫助但願你們多多點贊轉發關注哦。文章會持續更新的。絕對乾貨!!!