1. 程式人生 > >Java / Android 面試中所遇到的那些坑

Java / Android 面試中所遇到的那些坑

某度,去了以後才發現是做基於各類SDK的開發,用於行業國際化,後期拓展到整個產品線上的;能力方面:是想找一個架構能力非常強,或者原始碼分析能力非常強,或者coding能力非常強的一個工程師,第二家公司是想找一個資深架構師或者是專案leader;第三家,朋友所在的公司,同樣也是想找個資深程式設計師…

某度面試知識點整理,(以下只是整理個大致方向,具體內容請自己自行查詢):

1、主要是物件建立,堆記憶體、棧記憶體,資料引用地址是否發生變化等問題。

2、以及Gc Root的相關概念,以及回收機制記憶體洩露的檢測,考察了記憶體洩露的所有相關原理,裡面包括,單例、內部類、匿名內部類,靜態內部類,造成記憶體洩露的原因和解決方案;記憶體洩露的檢測方案,主要是MAT,以及檢視等,另外像圖片、網路優化處理方面的優化問題等等;

3、同時還考察了有執行緒池的ThreadPoolExecutor,底層實現機制,以及在引用執行緒池,如何實現執行緒之間的排程機制。

4、java方面考察的比較多的還有hashmap,比如hash碰撞,產生碰撞的原因,如何避免hash碰撞;陣列和連結串列之間的關係,如何實現儲存等操作。

5、同時還考察的有Handler實現機制,不是簡單的那些被市面問爛的輪詢方面內容,包含貫穿整個生命週期的啟動機制,至於複雜的內容,自行查詢;

6、常用的設計模式,以及設計模式在實戰中的應用也是少不了的。

7、另外還有動畫的相關內容,主要是view動畫以及屬性動畫的比較,以及動畫所引起的洩露問題;還有事件分發機制在實際中的問題等;

8、多執行緒問題,執行緒同步問題,以及多執行緒直接的排程問題;程序直接的通訊方式。

9、專案的架構思路,以及分析解決機制。

10、另外還有常用的三方庫,以及三方庫的實現機制以及原理。

11、應用的啟動機制,activitythread等…

第一家公司

因為個人時間緊急,申請不進行筆試答題,但是手寫程式碼、思路等都是必不可少的,某度前前後後差不多面了兩個半小時,除了ThreadPoolExecutor底層實現機制實在是想不起來其他都答出來了,整體來講沒有毛病,不過最後再攀談的時候,如之前所說的那樣,想要一個非常非常突出的人,而不是一個什麼都懂,又什麼都不精通的人,所以深度是非常的重要,畢竟是面一個高階研發做SDK方面的;一般的能力還是不符合,在面試過程中面試官反覆問我你有什麼非常擅長的領域沒有,也足以看出是想多給我些機會,可惜自己沒有把握住,而且這些只是一面,二輪面試是基於sdk架構層面的,更多的是牽涉到架構思路,整個專案的搭建思路、以及各類設計模式的運用方面了,這裡就不再訴說了,有興趣的自行研究下。

第二家公司,回答的內容就比較有趣了

基本上可以這麼說,我把我所能說的都說了,比如我用的最新的Rxjava,retrofit,okhttp,以及現在比較火的,Reactnative,databinding,效能優化,開源架構思路,以及各類開發的模式,mvp,mvc,mvvm等,比較實現等思路,而且自認為深度廣度還好,只是在問道記憶體洩露問題上,關於內部類,靜態內部類,匿名內部類造成的記憶體洩露忽略了;而且最後犯了一個比較重大的嚴重問題,演算法一般的我竟然誇大海口說,演算法就是找到規律、找出原理然後用程式碼表現出來,面試管當場出了一個演算法,思考半天,給了一個解答思路,但是效果一般;而且還提問了一些關於gc回收的排程演算法,沒接觸過只能作罷;最後感覺自身能力有限,後面要求再去面試,感覺自身駕馭不了,最後也就不了了之了。

第三家公司

哎,工作這麼久,這是最被動的一次;怎麼說呢,問的知識很多都是java基礎,可能一直沉浸於android的世界,反而把一些基礎性知識給忽略了,只知道有這個東西,具體原理都忘記了,而且在面試的時候還發現一個問題,就是一定一定要把你寫的知識點一定要講明白了,我們公司的訊息部分是自己做的,但是這部分程式碼我並沒有仔細看過,於是面試管問了訊息部分的某個細節問題,當時猛然沒有想出來,結果可想而知;還有就是你實現的功能,你單純會做是不行的,一定要把原理性的內容說出來;

面試官有時候問的一些問題如果跟你的思路不太一樣的話,一定要據理力爭,不過前提是你要把功能和原理想明白了,保證能夠實現的了才可以,不然最後坑爹的肯定是你自己。其中還問的有surfaceview實現機制,因為寫過的程式碼間隔好久了,突然被問起來,竟然大腦短路了…面完後已經知道不行了,基本功不能丟,原理性的東西一定要勤於總結…

綜述

上面所說的內容都只是一面,某度面了兩個半小時,第二家一個半小時,第三家一個多小時;總的來說,某度的面試官技術實力確實最給力;現在的面試內容確實是比之前要難了好多,無論是架構能力,還是底層實現能力,甚至是基本能力,現在面試單純知道原理是不太行的,一定要答得非常有深度,非常瞭解才行;而且基本功這東西可能在日常開發中感覺不出來,不過這些都是潛移默化影響著你,忘記的話一定要補習上來的,就像最後一個面試官問我,一些最常用的基礎性的東西怎麼可能忘記呢;事實證明當你在面的級別越高時,越是這種最最基本的東西要熟爛於心,與此同時一定要提升自己的深度以及廣度,幾次面試都是在沒有怎麼準備的情況進行的,其實,機會就那麼多次,你不珍惜,只能怪你自己,要珍惜自己的每一次機會,不能太大意了,這年頭你單純會敲程式碼是不行的,需要你把原理性的東西,揉碎了,記在自己的腦海裡才行。

有人可能會說,我要是面試管,我也能把對方問倒,確實是這樣,不過現在你是一個普通的面試者,就不要想太多了。

大家可以點選加入群:【Java高階架構進階群】:854180697 裡面有Java高階大牛直播講解知識點
走的就是高階路線,(如果你想跳槽換工作 但是技術又不夠 或者工作上遇到了瓶頸 ,我這裡有一個JAVA的免費直播課程
,講的是高階的知識點基礎不好的誤入喲,只要你有1-5年的開發經驗可以加群找我要課堂連結 注意:是免費的 沒有開發經驗誤入哦)

小建議

最後幾個建議,JNI/NDK,這個有興趣的好好學習學習,好多公司已經開始重視這個,跳槽不要太頻繁,通過好多獵頭的瞭解,13年以後畢業的研發工程師,跳槽的頻率不是一般的高,而且技術實力跟11年之前的相比,差了不是一兩個數量級,還有一個是關於現在的React native,或者是react這只是一個小的方向,不會影響安卓原生大的趨勢,就如同一個小語種一樣,需要學會,不過不建議投入太大的精力;深度和廣度兩個都不能丟棄,基礎更加是重中之重,設計模式,演算法,資料結構也不能丟棄,android的路還很長,還需要好好努力…

回來複習的時候,猛然發現一個網站,無論是最新的開源技術,還是資料結構演算法,已經最新的市場行情分析,都感覺蠻不錯的,同時也有很多開源專案,對我後來的提升有很大幫助;好東西不敢私藏,在這裡分享給大家。