如何在疫情期間離職一週成功拿到喜歡的offer

看到標題你可能就知道,我並不是一個像很多網上的文章一樣,有一些比如是面試阿里,華爲,海康之類大廠的經驗,因爲實話實說,除了內推,我的簡歷可能都過不了HR的篩選,很多大廠都說不看學歷,我承認,不是每一個大廠的員工學歷都很好,但是我敢說大廠的絕大多數員工學歷都不錯,所以學歷是一個門檻,而且慢慢的你會發現,學歷可能會是你晉升的基礎,創業型的小公司除外,所以如果你現在還是一個在校生,學校也不是很好,考個研也是不錯的選擇,作爲一個再普通不過的一個二本院校畢業的學生深有體會,廢話有點多,接下來說一些自己面試過程中面試官問到的問題和怎麼和面試官去交流。

總結一下這兩天遇到的面試題,個人有個習慣,一般就是面試完之後會記錄一下面試官問的問題

Java基礎性的問題

  1. 對JVM的理解,談談Java的內存模型,垃圾回收機制,如何確定一個對象是垃圾,一般都知道計數法和可達性分析算法,計數法的話解決不了兩個對象互相引用的問題
    class A{
      public B b;
       
    }
    class B{
      public A a;
    }
    public class Main{
        public static void main(String[] args){
        A a = new A();
        B b = new B();
        a.b=b;
        b.a=a;
        }
    }

    還有就是如果是可達性分析算法的話最好能夠知道什麼樣的對象可以作爲GCRoots,還有就是垃圾的分代收集算法的具體使用場景,比如新生代,對象頻繁創建,對象大多有朝生夕滅的情況,所以採用複製收集或者是升級版的複製整理算法,因爲需要拷貝到對象較少,而老年代則不同,大多數經歷了多次垃圾回收保留下來的對象。需要回收的相對較少,則可以使用標記清楚算法,這篇文章的主要目的不是去列舉一個個的面試問題,然後去一一作答,所以只是粗略的說一下,你知道新生代使用的是複製整理算法,那爲什麼使用賦值整理算法以及JVM對此的實現有哪些

  2. Java基礎,集合類,反射(最好能夠結合實際開發),集合類的HashMap基本上就是面試的寵兒,最好能列舉jdk版本之間的差異性,底層的數據結構,是怎麼紅黑樹化的,這時候你就可以說一下ConcurrentHashMap,如果你瞭解的話,然後就可以說一下java的併發編程,所有的回答最好都能結合實際的項目經驗,在哪個地方有併發,怎麼解決的,哪個地方用到了線程池,是用jdk的工具類Executors創建,還是自己手動創建,一般這種時候你就接着說工具類創建的有什麼弊端,不要讓面試官問你,除非他打斷你,要不然你就一直把線程池,有幾種線程池的創建方式,你能聯想到的都說了,而不是面試官問一個你答一個,這樣留個面試官問你的時間相對較少,自然就不會覺得你很多問題答不上來,比如你說到java的線程池,你就最好能舉例出幾種常見的線程池,比如,固定大小的線程池newFixedThreadPool,只有一個線程的線程池newSingleThreadPool

此時你最好能個說出newFixedThreadPool都需要什麼參數,代表什麼,比如使用的的隊列,隊列都有什麼性質,簡單看一下源碼

  public static ExecutorService newFixedThreadPool(int var0) {
        return new ThreadPoolExecutor(var0, var0, 0L, TimeUnit.MILLISECONDS, new LinkedBlockingQueue());
    }

發現底層還是使用了ThreadPoolExecutor(),這裏我們就知道如果我們要自己創建線程池,也需要使用到這個方法,簡單看一下的實現

 public ThreadPoolExecutor(int corePoolSize,
                              int maximumPoolSize,
                              long keepAliveTime,
                              TimeUnit unit,
                              BlockingQueue<Runnable> workQueue) {
        this(corePoolSize, maximumPoolSize, keepAliveTime, unit, workQueue,
             Executors.defaultThreadFactory(), defaultHandler);
    }
corePoolSize:線程池的核心線程數,就是說如果有任務提交,會創建這麼多線程,任務完成一般核心線程還會保留,除非手動設置線程回收連核心線程也回收了
maximumPoolSize:所能夠接受的最大線程數,就是任務再多,我也處理不過來了,這時就會有線程的一些拒絕策略,具體線程池的拒絕策略有哪些就自己去看吧,這篇文章不是把所有的知識點一一俱到,我也做不到
keepAliveTime:這個參數針對maximumPoolSize,當任務處理完的時候,超過核心線程的線程會被回收,但是不是馬上回收,而是在一段時間之後沒有任務提交後回收
unit:時間單位,這個沒什麼好說的
workQueue:工作隊列,阻塞隊列,這個是重點,比如用於直接交換的SynchronousQueue,無界隊列LinkedBlockingQueue,有界隊列ArrayBlockIngQueue等等,以及他們都使用在哪些地方,我們可以從上面的源碼中看到newFixedThreadPool底層用的LinkedBlockingQueue,超時時間是0,而newSingleThreadExecutor只有一個線程的方法和他唯一不同的就只有核心線程數corePoolSize是1,最大線程數maximumPoolSize也是1
public static ExecutorService newSingleThreadExecutor() {
        return new Executors.FinalizableDelegatedExecutorService(new ThreadPoolExecutor(1, 1, 0L, TimeUnit.MILLISECONDS, new LinkedBlockingQueue()));
    }

3.解決Java併發時使用的鎖和關鍵字,不加鎖也能實現線程安全的ThreadLocal的使用場景和底層實現,Thread,ThreadLocalMaps,ThreadLocal之間的關係,ThreadLocal的初始化方式都有哪些,ThreadLocal爲什麼會有OOM問題,這個地方的話就會有Java對象引用的具體內容,強引用,弱引用,虛引用等,這個我就不一一列舉了,只能說很重要

4.算法,數據結構,數據庫一樣都是很重要的知識

5.使用到的中間件,比如消息隊列RabbitMQ,Kafka,Redis也可以但是不推薦,怎麼實現消息的100%可靠傳輸(消息落庫,定時重傳),爲什麼使用這個消息隊列,而沒有使用另一個,這裏需要知道之間的差異,專人幹轉賺事,elasticsearch的使用,權限認證系統的大致流程,等等這些每個人項目使用的中間件不一樣就不一一說了,持續化集成部署有沒有了解,Jenkins,docker,k8s了不瞭解,有沒有使用過等等

最後總結一句話,知識全靠日常積累。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章