人生是一個漫長的過程,我們懷有太多的期望,就難免會遭遇失望與挫折。
今天這篇文章是我自己2020的小總結,2020感恩遇見。
一年的遭遇
2020開頭就是一個不平凡的一年,疫情來襲,許多互聯網公司面臨倒閉的風險,而很多程序員則在面臨着失業裁員的風險。
而我就是裁員大隊中的一員,組織架構調整,進行了人員優化,業務線被解散,被裁員。
然後爲了更快的工作, 草草的面試了幾家公司最後入職了一家小公司,每天做着沒有技術含量重複的工作,剛開始只是想填補被裁員的資金漏洞,但是工作久了還是無法適應,工作都是一些邊緣化的內容,自己考慮到沒有什麼實質性地成長,然後在幾個月後裸辭了。
後來開始重視面試,仔細挑選公司投遞簡歷,在面試前也前前後後複習準備了四五個月,後來面試了十幾家大小廠,拿到了幾個offer,入職了一家大廠,目前工作已經有小几個月,工作氛圍很好,幹勁滿滿,2021繼續加油!
不放棄,不氣餒!
接下來分享一下面試的一些題目,只記錄了一部分,因爲有些忘了。
字節跳動4輪面試
一面
- 插件化,啓動activity的hook方式,taskAffity
- okhttp支持HTTP2?http2的功能有哪些?tcp方面擁塞控制?tsl的握手和具體的非對稱加密算法。非對稱名稱
- handler的post(Runnable)如何實現的。callback,runnable,msg的執行優先級。
- 阻塞是怎麼實現的?爲什麼不會阻塞主線程?
- 求二叉樹中兩個節點之間的最大距離。
- 206含義,未修改資源是哪個,302含義,301含義
- 多進程通信問題。binder優勢。aidl生成的java類細節。多進程遇到哪些問題?
- 動態代理傳入的參數都有哪些?非接口的類能實現動態代理嗎?ASM的原理
- Application和Activity在Context的繼承樹上有何區別?二者使用上有何不同?
- 任意一顆二叉樹,求最大節點距離
二面
- 設計一個日誌系統。
- 內存泄露的分類。怎麼查看內存泄露的問題
- touch事件源碼問題。
- 組件化的問題。module和app之間的區別。moduler通信是如何實現的。
- native奔潰的日誌採集,怎麼處理?
- 註解實現一個提示功能:如果int的值大於了3需要提示。
三面
- 介紹下flutter的啓動流程
- 介紹下flutter與weex的區別
- 組件化介紹一下
- webview中與js通信的手段有哪些?
- 介紹下flutter_boost的原理
四面
- 適配器和裝飾模式各自特點和使用場景
- 視頻編解碼是怎麼做的
- 三色球排序
騰訊面試
- 音視頻採集編碼播放流程
- Mediacodec編碼內部原理與工作流程(什麼狀態機之類的),使用Mediacodec時遇到過什麼問題,怎麼解決的
- ffmpeg怎樣編碼和解碼的,怎麼做視頻編輯,添加特效
- 怎麼取一幀視頻畫面編輯成圖片並將二維碼合成到圖片中,然後進行壓縮處理,壓縮要保證圖片的清晰度不變
- 平時做過哪些性能優化,怎麼做的,已經發布的app怎麼監測性能
- Jetpack會不會,livedata、databinding的使用及原理
- Kotlin、flutter也提了一下
- Android中進程通信方式除了aidl,還有什麼用的比較多(不包括Linux的)
- App的啓動流程,從點擊圖標開始
- 一個算法問題
- app的啓動優化方案有哪些(主要是非常規的那些方法)
滴滴面試
- 創建線程有哪幾種方法
- 線程池的運行機制
- 如果有一個任務需要線程池裏所有任務執行完以後執行,應該怎麼做
- synchronize和lock有什麼區別
- 如何避免線程鎖死
- 手寫單例,如果在不使用鎖的情況下創建單例並保證單例安全性
- handler原理,子線程可以創建Handler嗎?
- 內存泄漏與內存溢出的區別
- 有沒有做過安全性能檢測的項目
- 原生與H5如何交互,傳參數?
- 用過哪些算法?
- 如何在服務中啓動一個耗時操作
- Activity的啓動模式
小米麪試
- 介紹一下binder和原理
- measure layout draw流程,滑動衝突
- 常用的多線程工具類。blockingqueue ,concurrenthashmap,信號量,countdownlatch,cyclicbarrier,exchanger等,stringbuffer
- stringbuilder 和stringbuffer區別
- lock和syncrognized原理區別,適合什麼場景。
- 實現生產者,消費者
- handler原理,是如何實現延時的。
- 一個activity啓動另外一個activity的生命週期。
算法題:
- 反轉鏈表
- 歸併排序
- 快速排序
- feiboqiena數列
- 二分查找
- 兩個隊列實現棧
- 兩個棧實現隊列
- 判斷鏈表是否成環,找到成環的交點。
順豐面試
- 使用過hook技術嗎?談談理解。
- 談談對android虛擬機的理解。
- 有做過推送相關嗎?原理有去了解過嗎?
- 談談startActivity的流程。
- 談談對自定義View的理解。
- 談談binder的理解。
- 你知道數據庫有哪些,android sqlite存儲數據的上限大小是多少?
- 談談TCP與UDP的理解。
- Java的引用。
- GC算法
- 談談對android應用的理解。
手百3輪面試
一面
- 爲什麼工作一年就想換工作?
- onTouchEvent/onTouchListenr.onTcouchEvent/onClickListenr
- hashmap的原理?
- java的hashcode和equals的區別
- java的gc瞭解多少?
- kt的伴生對象是餓漢模式還是懶漢模式?
- handler.postDelayed的原理
- ANR怎麼產生?怎麼捕捉?
- 智力題:桌子上有101塊餅***拿先手,他拿後手,你需要怎麼贏
- tcp 三次握手/四次揮手, 爲什麼要三次握手,四次揮手?
- 內存泄漏是什麼?怎麼找?
- 算法題:斐波拉契數列,遞歸的方式怎麼優化?
二面
- 手淘這種大型app是怎麼迭代起來的?
- 你對小程序的原理了解麼?
- v8binding怎麼做?
- 你項目的價值是什麼?
- 圖片緩存怎麼做?你要設計一個圖片緩存框架怎麼搞?
- lrucache怎麼實現?爲什麼是o(1)的時間複雜度?
- voliate 關鍵字解釋下?
- voliate 關鍵字不能實現什麼?
- https解釋下
- 常見的對稱加密算法和非對稱加密算法有哪些?
- 讓你設計一個打點系統怎麼做?
- 如果進程被殺死或者切換後臺,數據如何保存丟失?
- 你怎麼設計埋點系統一個線程模型?
- 快速排序?快速排序是穩定的麼?
- 如何實現一個快速排序的穩定性?
- minstack怎麼設計?
- kotlin和java混用有哪些問題?
- 設計一個數據結構,微博裏面有人發了文章怎麼實現?關注怎麼實現?
- 微博裏面有人發了文章,關注的人如何獲取最新的10條?如何獲取關注的人的文章的最新1000條?設計一個高效的算法
三面
- 你爲什麼選擇換工作?
- 你組裏面的人都怎麼樣?
- 你怎麼解決項目中的難點?
- 你有工作中遇到過哪些比較麻煩的地方?
- 你平時怎麼學習的啊?
- 你除去學習之外都看什麼書?
網易2輪面試
一面
- HashMap擴容原理,爲什麼要2的指數冪容量,如果輸入17會是多少容量?
跟HashCode有關係,如果輸入17,會向後達到2的指數冪,32。
- CurrentHashMap 讀寫鎖是如何實現的?
如果沒有hash衝突的情況下,使用CAS進行插入,如果有hash衝突,使用synchronized加鎖進行插入。當鏈表長度大於8且數據長度>=64時,會使用紅黑樹替代鏈表。
ReentrantReadWriteLock類中有readLock()和writeLock()方法可以分別獲取WriteLock和ReadLock對象,調用他們的lock方法,就可以實現讀寫鎖。實現原理就是AQS的acquire和acquireShared方法。
- List加鎖要如何加?
二面
- app優化 內存優化 cpu使用率優化
- 如何設計一個類似於微信朋友圈的首頁的功能,UI 數據等方面
- 如何設計一個無限數據的氣泡顯示聊天內容
- 5個G數據,如何在500M內存的情況下實現排序
- 大文件在傳輸過程中要考慮哪些問題,如何保證大文件的一致性
- JSbridge 是如何實現js和native聯通的
- 如何做到單個信號源,多個頁面響應
一些高頻重點問題
APP性能優化 內存優化 cpu佔用率 流暢性等,考慮一下如何評價一款app的性能,如何監控線上app的性能問題
多線程同步Sync和Lock實現原理
HashMap ConcurrentHashMap實現原理 鏈表轉紅黑樹的條件,擴容原理,ConcurrentHashMap線程安全原理、如何做到性能好
面試總結
講一下大廠面試一些必備的技能
1. 一般情況下第一輪都是基礎面試,需要紮實的基礎
- 最常用的Android 基礎知識
- Java 基礎知識
- 瞭解一些 常用東西的原理,例如:handler, thread 等
- 項目中的技術點
2. 第二輪的時候需要了解更深層次的東西
- Android 事件分發機制原理
- Android 繪圖機制原理
- WindowManager 的相關知識
- 進程間傳輸方式
- Java 內存管理機制
3. 能進入第三輪基本沒什麼問題,但是要注意以下問題
該輪一般是 老大或者部門負責人,問的問題一般都看 深度與廣度
當問及薪水的時候,要說一個合適的,小公司隨意,大公司一定要慎重,當心裏沒底的時候,可以告訴對方,讓對方給一個合理的薪資。一般都是在原工資基礎之上增長,聽獵頭說一般漲幅都在15%-30%,超 NB 的可以要30%及以上,如果感覺自己還不錯的,挺厲害的,建議最高20%,一般人就定在15% 左右最靠譜。公司內部一般有一套機制,根據公司情況而定。
我們的面試原則就是拿到合理薪資,得到 offer
個人發展情況,這個問題很難回答,如果和公司方向不符合,極有可能和公司無緣。建議多試探性的問問公司缺少什麼,你能否給予公司對應的東西。當然對於有自我追求的人,那可以放心大膽的提。我的方向就是架構師,哈哈哈,挺極端的,別學我哦。我感覺選擇都是雙向的,因此我知道自己需要的是什麼。
你最擅長什麼UI 還是其他什麼?這個問題更不好回答。你要說你擅長 UI,是不是意味着你其他能力就不行?雖然我不知道面試官的用意,但是我能感覺到,這個問題不是那麼好回答,我會回答說自己都行,來什麼業務接什麼需求。可能回答不太好,總之和公司的職位吻合就行,這樣總不至於出錯吧。
最後
其實客戶端開發的知識點就那麼多,面試問來問去還是那麼點東西。所以面試沒有其他的訣竅,只看你對這些知識點準備的充分程度。so,出去面試時先看看自己複習到了哪個階段就好。
關於知識梳理,這裏再分享一下我面試這段時間的複習路線:(以下體系的複習資料是我從各路大佬收集整理好的)
知識梳理完之後,就需要進行查漏補缺,所以針對這些知識點,我手頭上也準備了不少的電子書和筆記,這些筆記將各個知識點進行了完美的總結。
3.項目覆盤
實際上,面試的一二輪所問到的技術問題,很多都是圍繞着你的項目展開,因此在面試前最後要做好的一件事情就是項目覆盤。關於項目覆盤,我個人的思路如下,可供參考:
- 你在這個項目中承擔了什麼樣的角色?
- 這個項目的背景是什麼,如果是技術項目,爲什麼要做?
- 有哪些技術難點,是怎麼解決的,是否還有更好的方案?
- 你認爲項目中是否有可以改進的點?
- 這個項目解決了什麼問題,最好用數據說話,這個數據又是怎麼得出來的?
提前把思路捋一捋,上面這些問題好好思考或準備一下,做到心中有譜以後,自然能夠面試官聊得融洽,保持一個好的心態,通過的機率就會更大一些。
資料太多,全部展示會影響篇幅,暫時就先列舉這些部分截圖,以上資源均免費分享,以上內容均放在了開源項目:【github】 中已收錄,大家可以自行獲取(或者關注主頁掃描加微信獲取)。