2020互聯網寒冬下,一個 Android 程序員的面試心得,將來路在何方?

回顧一下本身這段時間的經歷,九月份的時候,公司通知了裁人,我匆匆忙忙地出去面了幾家,但最終都沒有拿到offer,我感受今年的寒冬有點冷。到十二月份,公司開始第二波裁人,我決定主動拿賠償走人。後續的面試過程我作了一些準備,基本都能走到hr面,後面我也順利地拿到了offer,我給你們分享下個人求職體會,但願能給你們一些參考。

通常Android面試分爲兩部分:Java部分和Android部分,下面說一下本身面試過程遇到的一些具體題目和一些相關知識點。java

一 JAVA相關

1)JAVA基礎

  1. java基本數據類型有哪些,int, long佔幾個字節
  2. == 和 equals有什麼區別
  3. hashcode 和 equals做用
  4. new String建立了幾個對象
  5. 位運算符的一些計算
  6. java的拆裝箱
  7. compareable 和 compartor的區別

下面列一兩個遇到的題吧git

基本數據類型,int大小,一個字節佔幾位, int的取值區間。
Integer a = 123456
Integer b = 123456
return a==b 若是a = a b = 1 結果呢
int a = 2;
int rusult = a++ + 4<<2

求 result的值
public static String fun(String s) {
        return s.length() < 0 ? (fun(s.substring(1) + s.charAt(0))) : "";
    }

System.out.println("result = " + fun("Smart"));

它的打印結果是什麼。

相似這種的題不少,考察的都是基礎知識的牢固性。因此須要本身多鞏固基礎。github

2)數據結構和算法

常見的數據結構就是:數組,棧,隊列,集合,映射,鏈表,堆,二分搜索樹,紅黑樹。固然還有其餘的一些,好比AVL平衡樹等一些數據結構。面試

咱們要作的就是了解它們的實現原理和各自的優缺點。算法

數據結構部分面試遇到最多的就是:編程

  1. ArrayList和LinkedList的區別,優缺點
  2. hashmap實現,擴容是怎麼作的,怎麼處理hash衝突,hashcode算法等
  3. 鏈表須要知道。LinkedHashMap通常再問LRU的時候會問到
  4. 二分搜索樹的特性和原理。前中後序遍歷寫出其中一種,當問到二分搜索樹的缺點的時候,你須要提出基於二分搜索樹的紅黑樹,說出他的特性。
  5. 堆的實現,最大堆,最小堆,優先隊列原理。

算法算法其實就是咱們平時常見的一些排序:選擇排序,插入排序,冒泡排序,希爾排序,歸併排序,快速排序。以及和數據結構相關聯的解決部分問題的一些計算方法。設計模式

算法面試遇到的一些題:數組

  1. 手寫快速排序,插入排序,冒泡排序
  2. 翻轉一個數字
  3. 翻轉一個鏈表
  4. O(n)複雜度找出數組中和是9的兩個數的索引
  5. 寫出二分搜索樹前中後序遍歷中的其中一個
  6. 實現一個隊列,並能記錄隊列中最大的數。

算法這一塊是須要練習的推薦去Leetcode上面刷刷題,開拓一下思惟。算法也並不必定要求你能寫出來,主要考察你的思路,已經如何優化你的算法。緩存

3)JVM虛擬機

JVM虛擬機咱們須要知道他們內部組成:堆,虛擬機棧,本地方法棧,方法區,計數器。每一塊都存放什麼東西,以及垃圾回收的時候主要回收哪些塊的東西。GC-ROOT鏈是從哪些地方開始的,垃圾回收集算法(不多遇到問的)。安全

類加載ClassLoader已經雙親委派機制,類加載的過程,類加載的信息對應在JVM的哪些塊中。

列一個遇到的類加載的面試題:

public class TestClassLoader {
    static class Father {
        public static final String TAG = "Father";

        static {
            System.out.println("static Father");
        }

        {
            System.out.println("unStatic Father");
        }

        public Father() {
            System.out.println("constract Father");
            method();
        }

        public void method() {
            System.out.println("method Father");
        }

        @Override
        public String toString() {
            return "toString Father";
        }
    }

    static class Son extends Father {
        public static Son instance = new Son();

        static {
            System.out.println("static Son");
        }

        {
            System.out.println("unStatic Son");
        }

        public Son() {
            System.out.println("constract Son");
            method();
        }

        public void method() {
            System.out.println("method Son");
        }

        @Override
        public String toString() {
            return "toString Son";
        }
    }

    public static void main(String[] args) {
        System.out.println("1.---------------------");
        System.out.println(Son.TAG);
        Son[] sons = new Son[10];
        System.out.println(sons);
        System.out.println("2.---------------------");
        System.out.println(Son.instance);
        System.out.println("3.---------------------");
        Son son = new Son();
        Father father = son;
        father.method();
        System.out.println(son);
    }
}

寫出打印輸出。

加一個小插曲:上面的題是餓了嗎面試問到的。面試個人人本身說是17年北航畢業的研究生。說本身很是注重基礎,全程問了不少JAVA基礎,包括上面的類加載的題,很自豪的說這個題是他本身出的。還有Collections下面的子類都有哪些,都有什麼不一樣。可是Android相關的題目問的水平很通常,說這個沒有嘲諷的意思。想說的是有些面試從一開始就註定了你可能進不了這個公司。面試有的時候也是要看眼緣的。不要灰心,找出本身的不足,補齊它,繼續前行。還有就是上面那個題,的確很不錯。

4)線程安全

當多個線程訪問一個對象的時候,若是不用考慮這些線程在運行時環境下的調度和交替執行,也不須要進行額外的同步,或者在調用方進行任何其餘的協調操做,調用這個對象的行爲均可以獲取正確的結果,咱們就認爲這個對象時線程安全的。

線程安全就是一些多線程下載,同步,鎖,死鎖,線程池。volatile關鍵字的特性,變量的原子性。以及java.util.concurrent包下的類,也須要了解一下。

通常會問的是手寫單例,以及雙重鎖式單例的優勢。還有就是讓你本身實現一個多線程下載,看你怎麼設計。

5)編程思想

封裝,繼承,多態,抽象,反射,註解,設計模式,設計模式的原則。

面試中通常會問下:

  1. 抽象和接口有什麼不同
  2. 工做中經常使用的設計模式,一些源碼中的設計模式
  3. 具體給你一個設計模式讓你說說你對他的瞭解,好比觀察者,工廠。

以上這些東西主要考察你的代碼設計能力。

6)網絡協議

  1. 互聯網的實現主要分爲幾層,http、ftp、tcp、ip分別位於哪一層。
  2. http和https的區別
  3. 爲何tcp要通過三次握手,四次揮手
  4. socket瞭解過嗎

通常http和https問的比較多,對稱加密和非對稱加密也會問。tcp和socket偶爾碰見問的。

二 JAVA部分總結

我以爲JAVA部分大體上能夠分爲這幾大塊,細想一套代碼,其實就是類和組合這些類,怎麼組合其實就是設計模式。而類裏面包含的其實就是基本數據類型和一些數據機構來存放這些基本數據類型或者類,而後就是JVM去怎麼加載這些類。針對上面幾個部分我推薦幾本書吧:《JAVA編程思想》《深刻理解JAVA虛擬機 第二版》《大話設計模式》《HeadFirst設計模式》《數據結構和算法》《圖解HTTP》

數據結構和算法重點推薦:https://github.com/wangxp423/... 以及readme中提到的劉宇波(liuyubobobo)他開源的代碼和文檔。他在慕課網錄製了四套視頻來說解數據結構和算法。文檔通俗易懂。很適合初學者,和想系統瞭解的人。

三 Android相關

Android部分我就不分幾大塊了。直接列舉,可是列舉到的每一項都是面試常常會問到而且會延伸問的,因此須要深刻的去研究。

  1. 四大組件有哪些,說出你對他們在Android系統中的做用和理解。
  2. Activity生命週期,A啓動B兩個頁面生命週期怎麼運行的,爲何會這樣,生命週期爲何這麼設計,你有了解過嗎。
  3. 四種啓動模式,內部堆棧是怎麼回事,你工做中怎麼使用的。
  4. Activity的啓動過程,這個我強烈建議每一個Android開發人員都要清楚的知道,而且跟一下源碼,幾個核心類的做用。你會對Android有一個更好的認識。
  5. 事件分發流程,怎麼處理滑動衝突。舉例:長按ListView的一個Item它變灰了。這個時候在滑動。item恢復原來的樣子,這個時候他們內部的事件傳遞是什麼樣子。有不少種問法,因此你必定要搞清楚。
  6. 自定義View,View的繪製流程。onMeasure,onLayout,onDraw都是什麼做用。ViewGroup是怎麼分發繪製的。onDraw裏面怎麼去作繪製,Canvas,Path,Paint你都須要瞭解。而且配合ValueAnimtor或者Scroller去實現動畫。有時候面試的會突發奇想問你ViewGroup是樹形結構,我想知道樹的深度,你怎麼計算,忽然就變成了一個數據結構和算法的題。
  7. Bitmap和Drawable
  8. Animation和Animator
  9. LinearLayout、RelativeLayout、FrameLayout三種經常使用佈局的特性,他在佈局的時候是怎麼計算的。效率如何。CoordinatorLayout配合AppbarLayout的使用,以及自定義Behavior。ConstraintLayout的使用。用來減小層級。
  10. Handler消息機制,推薦看一下Looper的源碼
  11. 進程間通訊,Binder機制
  12. AsyncTask源碼看一下。
  13. 圖片的壓縮處理,三級緩存,Lru算法
  14. 分辨率和屏幕密度,以及計算一個圖片大小。mdpi,hdpi的關係和比例。
  15. 優化,內存優化,佈局優化,啓動優化,性能優化。內存泄露,內存溢出。怎麼優化,用了什麼工具,具體怎麼作的。
  16. listView和RecycleView對比,以及緩存策略。
  17. JNI(不多問)
  18. MVC,MVP,MVVM
  19. 開源框架Okhttp,Glide,EventBus,Rxjava等,以及JetPack下的開源庫,要會用,還說說出一些東西,推薦 Retrofit,Okhttp,Glide,EventBus這些看一下源碼。
  20. RecyclerView四大塊,能實現什麼效果,大體怎麼實現的,內心要有數
  21. DecorView,Window,WindowManager,PhoneWindow關係,以及個子的職責。

加分項:Kotlin,Gradle,Flutter,組件化,插件化,熱修復。

四 Android相關總結

上面的列的相關內容,看似很短一句話,可是每一項都須要你深刻的去研究,要了解原理,最好去看一下源碼實現。固然還有一些是我沒寫到的,多是我寫的時候沒有想起來,並不表明他們不重要,你也須要重視,再來一波推薦:《Android開發藝術探索》強烈推薦,建議細細的讀,若是粗枝大葉建議讀兩到三遍,針對性的讀。《Android進階之光》《高級Android開發強化實戰》《Android組件化架構》《Android熱修復技術原理》《Android插件化開發指南》

五 面試心得

  1. 準備要充分,知識面要儘可能的廣,同時深度也要夠。
  2. 面試安排上,若是不着急,儘可能給本身留多時間,兩天一家,及時作總結和補充。
  3. 心態要放平,當作一次技術交流,面試要看一部分的運氣,也要看一些眼緣,有的面試官一張嘴你就能感受到你此次面試完了。想去的公司沒有面試好,不要氣餒,繼續加油準備。
  4. 簡歷投遞方面,拉勾上投了不少常常不匹配,多是我學歷問題(自考本),有一些打擊自信心,若是有一樣感覺的,不妨換BOSS或者其餘平臺。避免打擊自信心。
  5. 寫簡歷必定要體現本身的優點,最好能體現相似於,用到了什麼技術,解決了什麼問題。簡歷上寫到的必定要成竹在胸。
  6. 相似於你的優點是什麼,你以爲你項目中作的比較好的地方有哪些,你能給公司帶來什麼,這種問題內心要先想一些,省得臨場發揮容易緊張說很差。
  7. 我所經歷的面試,通常技術面最少是兩輪。若是一輪後讓你走了,而你還自我感受良好,那我以爲你有必要回顧一下面試內容,並一條一條找找該問題的相關內容,大部分問題就在於你沒有答到點子上,多是深度不夠,也多是擴展不夠。繼續加油。

六 閒聊

如今外面面試問的的確比較多,要求也挺高的,行情很差,薪資也很差要,因此心態必定要放好,找好本身的定位,心態必定要好。

面試以後要儘可能作到總結,從我最開始沒什麼準備就出去面試,被打擊一通以後,總結了七八家面試題,會發新面試問到的都是那些知識點,可能角度不同,可是你只要深度夠,他怎麼問,你基於原理來回答,基本上都沒差,從簽了賠償協議之後出來面試,連續四家公司都走到了HR面,能夠說面試的感受上來了。前面的總結積累終究沒有白費。

在寫這篇文章以前,我專門看了下我以前收藏的別的公號上發的面試題,很全,我都有點不想寫這篇文章了。可是想了下我這三個月聽到要裁人開始面試,到第一批沒被裁,第二批裁人遲遲不來。到第二批來的時候主動申請被裁。中間面試被打擊,失落,看到新聞那那都在裁人,到如今面試總體感受還不錯。仍是想分享一下本身的內心路程,想告訴你們,裁人別慌,作本身該作的,其餘本身決定不了的,先放一放,內心列一個123,一條一條來。

能夠看到我在上面推薦了不少書籍,並且JAVA部分時分塊來了。是由於當我看到不少面試題,針對題來的時候,題會不少,並且有時候你會以爲你的題都會了,可是面試的時候仍是面很差,說明你的知識並不紮實。或者你知識會了這個題,並無融會貫通,因此在JAVA部分我分大塊來描述,並且針對每一塊,我都有推薦一本相關的書,你可能不須要都看,能夠針對性的看。而Android部分時詳細的知識點,這些知識點我但願的是,可以深刻研究。而推薦的書籍,書中的部分都有一些相關的知識點,你們也能夠選擇性的看,固然論壇,博客都是知識的來源,你們作好知識點深度和廣度的基類就好了。

最後,雖然裁人的不少,都在說Android要沒落,可是,不要慌,作本身的計劃,學本身的習,競爭無處不在,每一個行業都是如此。祝你們2020年萬事大吉。

相關文章
相關標籤/搜索