1. 程式人生 > 其它 >985畢業的“打工人”,Android開發2年被裁,重新出發終於拿下位元組offer

985畢業的“打工人”,Android開發2年被裁,重新出發終於拿下位元組offer

個人自我介紹

鄙人出生於南方小鄉鎮,為了走出小鎮,在當地夠拼夠努力,不是自誇,確確實實也算得上“別人家的小孩”,至少在學習這件事情少,沒有要家裡人操過心。

高考特別順利,一個老牌985,具體哪個學校就不說了,不想給母校丟臉。畢業後,也算是“風光”地進入了理想公司,不說是龍頭,但在當時不算差吧,那個時候算是一線。拿到offer那一刻是激動的,但沒想到我人生的轉折點也從此刻開始。

進入這家網際網路公司後後,工作順利,但也正因為太順利,由順利變成了安逸,基本上沒想太多事,正因如此,也沒有為自己的後來考慮,腦海裡的職業規劃一下子就模糊了不少。

後續

後果可想而知,在這家公司待了2年,自身技術更新不及時,加上恰巧碰到網際網路環境遇冷,被裁了。公司伙食很好,待遇也不錯,行業內口碑也非常nice,公司以生產精品為榮,但最終還是敗給了資本,連最值錢的電商業務也賣掉了。

離開是新的開始?

被裁之後,算是對杭州心灰意冷,離開的那天,天也灰濛濛的,我非常清楚自己在這座城市生存的自信力已經被摧毀掉了,唯一的解決辦法,就是換一個城市生活。沒有太多猶豫的,毅然決然買了高鐵票去了深圳,或許這座生命力旺盛的一線城市能夠給我帶來不一樣的開始。

“理想很豐滿,現實很骨感”這句話沒想到我也能夠派上用場,很顯然,初入深圳的我並不順利,經歷裁員風波被消磨掉的自信心,一線城市的陌生感和距離感,沒有朋友和家人的孤獨感,同時襲來差一點就完全壓垮了我。

近年來的安逸工作狀態,讓我的技術沒有一點長進,我自知這個狀態下去想要進到網際網路頭部公司定是不現實的,畢竟學歷不能代表全部,技術才是最重要的。最後也是重新振作起來,梳理自己的技術知識,大膽的去嘗試各種大廠面試,最終也是拿下位元組的Offer,以下是我這些年來所經歷的面試題,分享給大家了。

常規面試題

Android面試題

  • ListView 如何快取的?
  • RecyclerView聯絡人列表如何實現A-Z快速定位
  • 廣播和EventBus的區別
  • 主執行緒Looper迴圈為什麼沒有卡主執行緒?nativePollOnce
  • SharedPreference的執行緒安全、程序安全,如何跨程序
  • Android 中實現多執行緒:threads,Handler,AsyncTask,IntentService
  • Android 中如何實現多程序
  • 自定義View的過程:measure,layout,draw
  • LayoutInflater#inflate 的 attrachToParent true 是什麼意思
  • theme 和 style 有什麼區別,優先順序
  • 有哪些程序間通訊方式
  • View 的渲染過程
  • Binder 的原理和優勢
  • AIDL 中的 oneway 有什麼用,方向標籤 in、out、inout 是什麼意思
  • Android 中有哪些動畫,都說下
  • Serializable 和 Parcelable 的區別
  • 你知道哪些Layout,ConstraintLayout 的特點是什麼
  • 手機開發者選項有哪些,不保留活動是什麼
  • 基本的資料型別有哪些?
  • String、StringBuilder、StringBuffer的區別?
  • Fragment是什麼,使用場景和生命週期
  • 說一下Context和記憶體洩露
  • 執行緒建立的方法?
  • Activity的啟動模式和適用場景?
  • ViewPager用過嗎?然後扯到了它和Fragment聯合;

記憶體洩露和記憶體溢位說一下

(1)記憶體洩漏memory leak :是指程式在申請記憶體後,無法釋放已申請的記憶體空間,一次記憶體洩漏似乎不會有大的影響,但記憶體洩漏堆積後的後果就是記憶體溢位。

(2)記憶體溢位 out of memory :指程式申請記憶體時,沒有足夠的記憶體供申請者使用,或者說,給了你一塊儲存int型別資料的儲存空間,但是你卻儲存long型別的資料,那麼結果就是記憶體不夠用,此時就會報錯OOM,即所謂的記憶體溢位。

記憶體溢位的原因及解決方法

(1)記憶體溢位原因:

①記憶體中載入的資料量過於龐大,如一次從資料庫取出過多資料;

②集合類中有對物件的引用,使用完後未清空,使得JVM不能回收;

③程式碼中存在死迴圈或迴圈產生過多重複的物件實體;

④使用的第三方軟體中的BUG;

⑤啟動引數記憶體值設定的過小

(2)記憶體溢位的解決方案:

①第一步,修改JVM啟動引數,直接增加記憶體。(-Xms,-Xmx引數一定不要忘記加。)

②第二步,檢查錯誤日誌,檢視“OutOfMemory”錯誤前是否有其 它異常或錯誤。

③第三步,對程式碼進行走查和分析,找出可能發生記憶體溢位的位置。

垃圾回收機制說一下?

四大元件

  • 當記憶體不足時Service被殺死了,如何重啟這個Service
  • Android系統殺程序時,是怎麼考慮程序優先順序的?
  • Fragment 的 ViewModel 如何訪問到 Activity 的 ViewModel 的資料
  • Activity 4種啟動模式說下,各種啟動模式適合的應用場景
  • Activity 任務棧從底到頂為 A-B-C,低記憶體殺死程序後,重新點選,顯示哪個?這時如果C裡面有Fragment是怎樣恢復的?
  • Activity如何傳參給Fragment?為什麼用setArgument傳參,而不是使用帶有引數的構造器?
  • window、view 和 Activity 的關係
  • Activity、Fragment 的各個生命週期依次說一下,各個生命週期裡面適合做什麼
  • Activity 呼叫 finish 方法後怎麼走到 onDestroy 的

圖片

  • Glide快取特點
  • Glide為我們做了哪些記憶體優化
  • Glide如何載入 GIF
  • ListView 圖片錯位的原因,解決方案
  • bitmap如何處理大圖,30M的大圖如何防止OOM?

網路

  • OKHttp 如何實現快取
  • OKHttp 的超時時間,有考慮DNS超時碼
  • OKHttp 執行緒池、連線池講下
  • OKHttp 的所有攔截器有哪些,請求失敗了重試1、2次怎麼做
  • Retrofit實現機制
  • Room註解如何在編譯時生成類檔案
  • http 和 https 的區別,shakehand的過程說下
  • 狀態碼400、401,3xx有哪些
  • 網路劫持是什麼,應該怎麼做
  • TCP三次握手,握手中的網路包各個標記位是多少,四次揮手說一下
  • TCP 傳送視窗是什麼?
  • 混合開發h5瞭解多少
  • 瀏覽器視窗訪問一個網址的過程
  • POST 和 GET 有什麼區別

優化

  • 記憶體洩漏分析,LeakCanary的原理,洩漏物件是如何找到引用鏈的
  • APK瘦身
  • 啟動優化
  • 卡頓分析!!
  • ANR分析!!
  • 為什麼佈局檔案中層級越多,效能可能差很多
  • 你有哪些應用效能優化的經驗必問
  • ProGuard怎麼寫

Java

1、Java中==和equals和hashCode的區別
2、int與integer的區別
3、談談對java多型的理解
4、String、StringBuffer、StringBuilder區別
5、抽象類和介面區別
6、Serializable 和Parcelable 的區別
7、string 轉換成 integer的方式及原理
8、哪些情況下的物件會被垃圾回收機制處理掉?
9、什麼是強引用、軟引用、弱引用以及虛引用?
10、什麼是依賴注入?能說幾個依賴注入的庫麼?
11、靜態代理和動態代理的區別,什麼場景使用?
12、Java的異常體系
13、JVM的回收演算法是怎樣的
14、說一下泛型原理,並舉例說明
15、能說說HashMap常用操作的底層實現原理嗎?
16、垃圾回收機制和呼叫 System.gc()的區別?
17、說一下你所瞭解的設計模式有哪些
18、說下java中的執行緒建立方式,執行緒池的工作原理。

Kotlin

  • Kotlin協程為什麼能以同步程式碼寫出非同步邏輯?
  • suspend 函式的工作原理
  • 在協程上定義了一個區域性變數,為什麼在其中的其他執行緒裡的協程也能訪問到?
  • by 的兩種場景,by Lazy 的實現
  • object 單例的實現

演算法

  • 各種排序演算法(冒泡、選擇、快排、歸併。。。)的時間複雜度,各種查詢演算法(順序查詢,二分查詢。。。)的時間複雜度
  • LRU 實現(146)參考LinkedHashMap實現的3個方法
  • LFU 快取(460) 同一頻率使用LRU的NodeList,外面套一層{freq to NodeList},NodeList用雙鏈表實現
  • 兩數相加(445)
  • 找缺失的數字(268)注意相似題目裡有中等
  • 兩個佇列實現棧(225)
  • 刪除子資料夾(1233)
  • 螺旋矩陣列印(54)
  • 用生成隨機數1-5(1,2,3,4,5)的方法,得到一個可以生成隨機數(1-7)的方法
  • 54張撲克牌,分成3堆,大小王出現在同一堆的概率(排列組合算數題)

Android第三方庫原始碼

1、網路底層框架:OkHttp實現原理
2、OKhttp針對網路層有哪些優化?
3、網路請求快取處理,okhttp如何處理網路快取的?
4、從網路載入一個10M的圖片,說下注意事項?
5、網路封裝框架:Retrofit實現原理
6、響應式程式設計框架:RxJava實現原理
7、圖片載入框架:Glide實現原理
8、Glide如何確定圖片載入完畢?
9、Glide記憶體快取如何控制大小?
10、載入bitmap過程(怎樣保證不產生記憶體溢位)
11、Android中軟引用與弱引用的應用場景。
12、LruCache原理
13、Fresco與Glide的對比:
14、Bitmap如何處理大圖,如一張30M的大圖,如何預防OOM?
15、事件匯流排框架EventBus實現原理
16、記憶體洩漏檢測框架:LeakCanary實現原理
17、leakCannary中如何判斷一個物件是否被回收?
18、依賴注入框架:ButterKnife實現原理
19、依賴全域性管理框架:Dagger2實現原理
20、資料庫框架:GreenDao實現原理

效能優化

這個主要結合你所做過的專案問,一般面試官會問你專案做過哪些方面的優化,常見的問法就是:
優化的思路是什麼
用到了哪些技術
遇到了哪些困難(問題)
如何解決
有什麼心得
主要結合自己專案回答。切記不要自己給自己挖坑,比如沒有做過這方面優化,你為了表現自己,說做過,結果面試官往下問回答不出來,這關乎誠信問題,你們懂的~

抽象問題

  • 講講做過的專案,有哪些亮點
  • 你自己的亮點在哪裡,你的加入可以給團隊帶來什麼
  • 技術規劃,怎麼發展

設計題

  • 如果讓你設計一個音樂播放器,要實現哪些介面
  • 設計一個圖片下載庫:深挖 Glide,如果圖片沒有設定有效期,如何保證快取被更新?

下面統計一些公司的真實面試題

(一)泰科電子面經 高階安卓工程師社招面試題目

1.ContentProvider的許可權管理(解答:讀寫分離,許可權控制-精確到表級,URL控制)

2.如何通過廣播攔截和abort一條簡訊?

3.廣播是否可以請求網路?

4.廣播引起anr的時間限制是多少?

5.計算一個view的巢狀層級

6.Activity棧

7.Android執行緒有沒有上限?

8.執行緒池有沒有上限?

9.ListView重用的是什麼?

10.Android為什麼引入Parcelable?

11.有沒有嘗試簡化Parcelable的使用?

12.四大元件以及使用方式

13.網路請求

14.get/post請求的區別

15.xml/json的區別以及解析方式

16.談談對Handler的理解

17.service的啟動方式

18.螢幕適配

19.ArrayList與LinkedList區別

20.Application和Activity的Context物件的區別

21.Android屬性動畫特性

22.如何匯入外部資料庫?

23.LinearLayout、RelativeLayout、FrameLayout的特性及對比,並介紹使用場景。

24.談談對介面與回撥的理解

25.回撥的原理

26.寫一個回撥demo

27.介紹下SurfView

28.RecycleView的使用

29.動態許可權適配方案,許可權組的概念

30.Android系統為什麼會設計ContentProvider?

31.下拉狀態列是不是影響activity的生命週期

32.說說ContentProvider、ContentResolver、ContentObserver之間的關係

33.請描述一下廣播BroadcastReceiver的理解

34.廣播的分類

35.序列化的作用,以及Android兩種序列化的區別

36.Android中PID和UID的區別

37.Binder的理解,以及為什麼要用Binder,程序間通訊的方式

38.框架搭建選型的注意點

39.第三方SDK應用

40.MVC、MVP設計模式

41.TCP與UDP的區別

42.Dalvik虛擬機器方面

43.EventBus實現原理

44.對自定義view的理解

45.詳細介紹下自己做過的專案對你的成長最大?哪個的收穫最大?

46.你認為一名安卓工程師最重要的特質是什麼?你在工作中最終重視的因素是什麼?你在工作中是怎麼保持持續學習的?

(二)咻電科技 安卓工程師 社招 面試技術題目

1.mvc和mvp的使用場景和優缺點

2.Hashmap實現原理

3.效能優化(一定要具體說出很多方案,比如記憶體、電量、流量等具體解決方案)

4.單例模式的寫法和各種寫法的優缺點

5.okHttp、volley、retrofit等網路框架的使用和原理

6.四大圖片載入框架的使用和原理

7.如何考慮架構設計

8.自定義View,繪製流程、步驟,

9.事件攔截和分發機制

10.程序間的通訊方式

11.應用的建立啟動流程

12..Handler是怎麼導致記憶體洩露的

13.設計模式理解問得也多,

14.Binder驅動

15.如果在onStop的時候做了網路請求,onResume的時候怎麼恢復?

16.Bitmap使用時候注意什麼?

17.Bitmap的recycler()

18.Android中開啟攝像頭的主要步驟

19.ViewPager使用細節,如何設定成每次只初始化當前的Fragment,其他的不初始化?

20.點選事件被攔截,但是想傳到下面的View,如何操作?

21.微信主頁面的實現方式

22.微信上訊息小紅點的原理

23.如何優化自定義View

24.低版本SDK如何實現高版本api?

25.描述一次網路請求的流程

26.HttpUrlConnection和okhttp關係

27.Bitmap物件的理解

28.looper架構

29.Activity上有Dialog的時候按Home鍵時的生命週期

30.兩個Activity之間跳轉時必然會執行的是哪幾個方法?

31.前臺切換到後臺,然後再回到前臺,Activity生命週期回撥方法。彈出Dialog,生命值週期回撥方法。

32.ActivityThread,AMS,WMS的工作原理

33.自定義View如何考慮機型適配

34.自定義View的事件

35.AstncTask+HttpClient與AsyncHttpClient有什麼區別?

36事件分發中的onTouch和onTouchEvent有什麼區別,又該如何使用?

(三)騰訊社招安卓崗面試經歷(涼)

1、synchronize用法,volatile用法,兩者的區別和場景

2、動態許可權適配方案,許可權組的概念

3、網路請求快取處理,okhttp如何處理網路快取的;圖片載入庫相關,bitmap如何處理大圖,如一張30M的大圖,如何預防OOM

4、程序保活

5、listview圖片載入錯亂的原理和解決方案,listview是如何做快取的?

6、https相關,如何驗證證書的合法性,https中哪裡用了對稱加密,哪裡用了非對稱加密,兩者的區別?

7、Android系統為什麼會設計ContentProvider,程序共享和執行緒安全問題

(1)提供一種跨程序資料共享的方式:

由系統來管理ContentProvider的建立、生命週期及訪問的執行緒分配,簡化我們在應用間共享資料(程序間通訊)的方式。我們只管通過ContentResolver訪問ContentProvider所提示的資料介面,而不需要擔心它所在程序是啟動還是未啟動 。

(2)更好的資料訪問許可權管理:

ContentProvider可以對開發的資料進行許可權設定,不同的URI可以對應不同的許可權,只有符合許可權要求的元件才能訪問到ContentProvider的具體操作。

微信的聊天資料在本地都是加密處理的(防止root了被破解),設計一個類似的本地資料儲存系統

8、jvm相關和GC回收演算法的區別

9、Android相關優化(如記憶體優化、網路優化、佈局優化、電量優化、業務優化)

10、EventBus實現原理和觀察者模式在開發中的運用?

11、動態代理模式如何運用?

12、App是如何沙箱化,為什麼要這麼做?

(四)滴滴社招面試

一面

1、詢問專案相關的問題;

2、概述一下****HashMap

答:HashMap是基於雜湊表的Map介面的非同步實現。此實現提供所有可選的對映操作,並允許使用null值和null鍵。此類不保證對映的順序,特別是它不保證該順序恆久不變。

3、hashmap原理說一下;

4、HashMap什麼時候進行擴容呢?

答:當HashMap中的元素個數超過陣列大小時,就會進行陣列擴容。

5、https相關過程說一下;

6、執行緒安全。synchronized,lock各種原理

7、如何保證通訊安全性?

8、如何實現連結串列陣列?

二面

1、專案經歷介紹;

2、content-type有哪些值?

3、常見的響應碼有哪些?

(1)200:請求成功,瀏覽器會把響應體內容(通常是html)顯示在瀏覽器中;

(2)404:請求的資源沒有找到,說明客戶端錯誤的請求了不存在的資源;

(3)500:請求資源找到了,但伺服器內部出現了錯誤;

(4)302:重定向,當響應碼為302時,表示伺服器要求瀏覽器重新再發一個請求,伺服器會發送一個響應頭Location,它指定了新請求的URL地址;

4、UNICODE和utf-8是幹什麼的,一箇中文分別在其中佔據多少大小?

5、如何批量釋出?

6、應用崩潰了怎麼辦,如何收集崩潰資訊?

7、應用網路不好如何判斷?

8、通訊如何保證安全?

9、android快取如何快取,圖片如何快取,資料如何快取,快取機制?**

10、js和android耦合;

11、react native

12、kotlin以及看法;

13、flutter

14、演算法題:洗牌不回到原來位置;

三面

1、執行緒鎖的區別;

2、同一個鎖為什麼效率有差別?

3、多型和過載區別;

(1)多型是建立在重bai寫的基礎之上的,是類與類du之間的zhi關係,是發生在不同的類之dao間的,子類重寫zhuan父類的方法。實現不同的子類,不同的實現形態。多型有3個條件:繼承、重寫和父類引用指向子類物件

(2)過載則是類的內部的方法構型上的不同,是發生在同一個類裡面的。同一個函式名稱,引數不同的多個方法,實現同一型別的功能。

4、Hashmap

5、Jni

6、設計模式:觀察者模式怎麼用?

7、說一下自身的優缺點;

8、你對領導期望是?

9、你對滴滴了解有多少?印象如何?說一下你的看法。

(五)位元組社招

一面

  1. 執行緒池的底層原理

  2. 四種引用型別

  3. JAVA GC d. Sychornized關鍵字

  4. 靜態同步函式

  5. 可不可以呼叫Abstrut 父類的super方法

  6. HTTP協議中POST,GET 的區別

h. TCP/IP協議棧 i. TCP和UDP的區別

  1. 三次握手是什麼?可以兩次握手麼

  2. 程序和執行緒的區別

  3. 手寫ViewGroup樹結構遍歷

二面

  1. ArrayList / LinkedList的區別

  2. HashMap的底層實現原理

  3. 兩個執行緒分別呼叫同一個類的例項函式和類函式

  4. 什麼是可見性?舉例場景

  5. volatile關鍵字的意義

6.Class物件

  1. 執行緒結束的方法:Interrupt之後需要做什麼

  2. Android Activity切換生命週期

  3. Activity儲存狀態的函式

1 0. 子執行緒對UI的操作方法

  1. 如何在應用程式遠端呼叫中表明使用者身份

  2. 單例模式、建造者模式、中介模式

  3. 手寫中位數查詢演算法

三面

  1. 聊聊專案

  2. Handler和Looper的底層結構

  3. postRunnable方法的底層實現

  4. Thread Run和Start的底層呼叫區別(是否中斷陷入)

  5. BroadCast的使用方法

  6. Intent的使用方法

  7. Intent-Filter

  8. 手寫外部排序演算法

大廠面試複習路線

多餘的話就不講了,接下來將分享面試的一個複習路線,如果你也在準備面試但是不知道怎麼高效複習,可以參考一下我的複習路線,有任何問題也歡迎一起互相交流,加油吧!

這裡給大家提供一個方向,進行體系化的學習:

1、看視訊進行系統學習

前幾年的Crud經歷,讓我明白自己真的算是菜雞中的戰鬥機,也正因為Crud,導致自己技術比較零散,也不夠深入不夠系統,所以重新進行學習是很有必要的。我差的是系統知識,差的結構框架和思路,所以通過視訊來學習,效果更好,也更全面。關於視訊學習,個人可以推薦去B站進行學習,B站上有很多學習視訊,唯一的缺點就是免費的容易過時。

另外,我自己也珍藏了好幾套視訊,有需要的我也可以分享給你。

2、進行系統梳理知識,提升儲備

客戶端開發的知識點就那麼多,面試問來問去還是那麼點東西。所以面試沒有其他的訣竅,只看你對這些知識點準備的充分程度。so,出去面試時先看看自己複習到了哪個階段就好。

系統學習方向:

  • 架構師築基必備技能:深入Java泛型+註解深入淺出+併發程式設計+資料傳輸與序列化+Java虛擬機器原理+反射與類載入+動態代理+高效IO
  • Android高階UI與FrameWork原始碼:高階UI晉升+Framework核心解析+Android元件核心+資料持久化
  • 360°全方面效能調優:設計思想與程式碼質量優化+程式效能優化+開發效率優化
  • 解讀開源框架設計思想:熱修復設計+外掛化框架解讀+元件化框架設計+圖片載入框架+網路訪問框架設計+RXJava響應式程式設計框架設計+IOC架構設計+Android架構元件Jetpack
  • NDK模組開發:NDK基礎知識體系+底層圖片處理+音視訊開發
  • 微信小程式:小程式介紹+UI開發+API操作+微信對接
  • Hybrid 開發與Flutter:Html5專案實戰+Flutter進階

知識梳理完之後,就需要進行查漏補缺,所以針對這些知識點,我手頭上也準備了不少的電子書和筆記,這些筆記將各個知識點進行了完美的總結。

3、讀原始碼,看實戰筆記,學習大神思路

“程式語言是程式設計師的表達的方式,而架構是程式設計師對世界的認知”。所以,程式設計師要想快速認知並學習架構,讀原始碼是必不可少的。閱讀原始碼,是解決問題 + 理解事物,更重要的:看到原始碼背後的想法;程式設計師說:讀萬行原始碼,行萬種實踐。

主要內含微信 MMKV 原始碼、AsyncTask 原始碼、Volley 原始碼、Retrofit原始碼、OkHttp 原始碼等等。

4、面試前夕,刷題衝刺

面試的前一週時間內,就可以開始刷題衝刺了。請記住,刷題的時候,技術的優先,演算法的看些基本的,比如排序等即可,而智力題,除非是校招,否則一般不怎麼會問。

關於面試刷題,我個人也準備了一套系統的面試題,幫助你舉一反三。

5、簡歷+社招解答+經典HR面試解析

以上是整理總結的Android中高階面試遇到的真題解析,希望對大家有幫助;同時很多人經常也會遇到很多關於簡歷製作,職業困惑、HR經典面試問題回答等有關面試的問題。同樣我也蒐集整理了全套簡歷製作、金三銀四社招困惑、HR面試等問題解析,有疑問,可以提供專業的解答。

對於Android開發的朋友來說應該是最全面最完整的面試資料,為了更好地整理每個模組,我參考了很多網上的優質博文和專案,力求不漏掉每一個知識點。很多朋友靠著這些內容進行復習,拿到了BATJ等大廠的offer,這個資料也已經幫助了很多的安卓開發者,希望也能幫助到你。

最後想要獲取以上完整的《2021 Android BAT面試寶典》,點這裡可以看到全部內容