天天看點

面試遇到的問題面試重難點面試知識盲點項目問題

面試重難點

面試知識盲點

  1. AVL平衡樹和紅黑樹

    AVL平衡樹:

    • 是一棵嚴格自平衡二叉查找樹,平衡因子隻可能是-1,0,1;

      左右子樹的高度差的絕對值不超過1,并且左右子樹都是一棵平衡二叉樹

      在AVL樹中插入和删除節點,隻要不滿足上述條件就要通過旋轉來保持平衡,而旋轉是非常耗時的;AVL樹适用于插入和删除較少,查找多的情況

    紅黑樹:
    • 也是一棵平衡查找樹,但是每個節點由一個存儲位表示紅色或黑色。通過對任何一條“從根到空節點路徑上“各個節點的顔色的限制,紅黑樹可以確定沒有一條路徑會比其他路徑長出兩倍。

      是以紅黑樹是一種“弱平衡二叉樹”,相同節點下,紅黑樹的高度大于AVL樹的高度;

      但是它的旋轉次數相對較少,是以對于需要經常插入和删除的情況,用紅黑樹好。

    • 性質
      • 每個節點是黑的或紅的,根節點是黑的;葉子結點(樹尾端的null節點)是黑的;
      • 兩個紅節點不能相連,紅節點的孩子一定是黑的
      • 任意節點到葉子節點的路徑中都包含相同數目的黑節點;所有路徑中都包含相同數量的黑節點

        通過對“任何一條從根到空節點的路徑上” “各個節點的顔色的限制”,紅黑樹可以確定沒有一條路徑回比其他路徑長出2倍,是以紅黑樹是近似平衡的。

  2. GC判斷對象是否可以進行回收,GC root可達性分析
    • 引用計數:存在問題,互相引用
    • 可達性分析算法:以GC roots為起始點進行搜尋,可達到的對象都是存活的,不可達的對象可被回收;
    • 垃圾回收可達性分析算法多線程存在的問題:GC線程與使用者線程并發執行
      1. 問題:多線程情況下,其他線程可能會更新”可達性分析“已經通路過的對象的引用,進而造成誤報(将引用設定為null)或者漏報(将引用設定為未被通路過的對象)

        誤報:将引用設定為null(那麼這個引用原來指向對象就應該被标記回收;但是由于可達性分析已經周遊過該對象,保持了其存活狀态;誤報沒有什麼傷害,Java虛拟機至多這次沒有回收它。)

        漏報:将引用設定為某個未被通路的對象(原本這個對象在可達性分析時标記了要被回收,但是現在又有引用指向了它;後面一點通過引用通路了已經被回收的對象,可能會直接導緻JVM崩潰。

        即:問題:其他線程可能會将引用設定為可達性分析已經标記要回收的對象

      2. 解決:
        • 在執行GC線程時,暫停所有其他線程,以串行的方式執行GC,此時需要盡量減少停頓時間

          Serial收集器(ParNew、Paraller Scavenge、Serial Old、Parallel Old

        • 并行執行,采用标記清除算法(CMS concurrent mark sweep收集器、G1收集器)

          回收分為四個過程:

          1. 初始标記:标記GC能夠直接關聯的對象,很快,使用者程序需要停頓
          2. 并發标記:GC線程和使用者線程并發執行,在整個GC過程中耗時最長,不需要停頓
          3. 重新标記:修正并發标記過程中,因使用者線程繼續運作而導緻标記産生變動的那不分對象,需要停頓
          4. (已經完成GC标記過程)并發清除,不需要停頓;

            在整個過程中,耗時最長的是并發标記和并發清除,這兩個過程中GC線程和用于縣城可以一起工作,不需要停頓。

            浮動垃圾:并發清除過程中,由于使用者程序繼續運作而産生的垃圾,(在重新标記完成後,整個GC可達性分析就已經完成,此時不再允許将引用指向被标記回收的對象,是以這個過程中隻能産生垃圾,而不會産生GC線程和使用者線程的并發問題),這部分垃圾隻能等下一次GC時再回收。

      3. 被“可達性分析算法”标記死亡的對象是否一定會死亡?

        不一定,可以通過

        finalize()

        方法實作一次自救。
    • 可作為GC roots的對象:
      • JVM棧中引用的對象
      • 本地方法棧中引用的對象
      • 方法區static變量和常量引用的對象
    • 引用的分類:
      • 強引用,采用new的引用,隻有強引用還存在,就不會回收其對象
      • 軟引用,還有一些用但非必須的對象,隻有在記憶體不夠時才回收,SoftReference類實作
      • 弱引用,非必須的對象,一定會回收,WeakReference類實作
      • 虛引用,一個對象是否有虛引用對這個對象是否回收沒有關系,也無法通過虛引用得到對象,其作用隻是在對象被回收時收到一個系統通知,使用PhantomReference類實作
  3. 雙親委派機制的作用
    • 什麼是雙親委派機制:

      判斷某個類是否被加載時自底向上的,加載某個類是自頂向下的

      當某個類加載器需要加載

      .class

      檔案時,它首先将組織這個任務委派給他的上級類加載器,遞歸這個操作,如果上級的類加載器沒有加載,自己才會去加載。
    • 作用:
      1. 類加載是自頂向下加載的,引導類加載器先進行類加載,再是擴充類加載器,最後再是應用類加載器;為了防止重複加載同一個

        .class

        檔案,通過委托去向上面問一問,加載過了,就不用再加載一遍,保證資料安全;
      2. 保證核心的

        .class

        檔案不會被篡改。通過委托的方式,保證核心的.class檔案不被篡改;即使被篡改也不會被加載,即使被加載也不會是同一個class對象,因為不同的類加載器即使加載同一個.class也不是同一個Class對象。這樣保證Class的執行安全。
  4. TCP保證可靠性、TCP發送視窗和傳輸視窗+累計确認機制,TCP封包的序号和确認号+分片保證資料連續
    • TCP保證可靠性

      TCP使用确認機制和逾時重傳保證可靠傳輸:A向B發送TCP封包段,如果在逾時時間内沒有收到B的确認,A就會重傳這個封包段。

    • TCP滑動視窗
      1. 接收方通過TCP封包段中的視窗字段告訴發送方自己的視窗大小,發送方根據這個值和其他資訊設定自己的視窗大小。
      2. 發送視窗内的位元組都允許發送,接收視窗内的位元組都允許被接收。

        如果發送視窗左邊的位元組已經發送并且收到了确認,那麼發送視窗向右滑動

        接收視窗左邊的位元組已經發送确認并傳遞主機,就向右滑動

      3. 接收視窗隻會對最後一個按序到達的位元組進行确認,采用累計确認;
    • TCP封包的序号和确認号
      • 序号

        TCP把資料看成一個無結構、有序的位元組流;序号是建立在傳送的位元組流之上的,而不是建立在封包段的序列之上。

        一個封包段的序号是該封包段首位元組的位元組流編号;

        如:A想向B發送一個資料流,A中TCP隐式的對資料流中的每一個位元組編号。

        假定資料流由2000個位元組組成,最大封包段長度為1000位元組,資料流的首位元組編号為0;

        該TCP将為該資料流建構2個封包段,給第一個封包段分為序号0,給第二個封包段配置設定序号1000,這樣每個序号被填入到相應的TCP封包段首部的序号字段中。

      • 确認号

        B向A發送的封包段的确認号是期望A發送的下一個位元組的序号,加入B已經收到A發送的序号為0-999的位元組,那麼就期望獲得序号為1000及以後的位元組。

  5. Git分支的了解和操作
    • 分支相當于平行宇宙,head指針指向目前分支

      例如在某一個版本庫的時候,我想開發一個新的功能,就可以新建立一個分支dev,這個分支和原來的分支master在這個版本以後就不相關了;等完成功能後,再将dev分支合并到主分支上。

      git branch dev

      git merge dev

    • 兩個分支修改了檔案的同一個地方,再合并時就會産生沖突;此時需要手動打開沖突檔案并修改再送出;
    • 分支使用原則:

      master分支非常穩定,一般隻用來釋出新版本;

      我們在dev分支上幹活;

      此外每個人都有自己的分支,是不是往dev分支上合并就行

  6. 索引的使用規則
    • 最左字首原理:MySQL的索引能對多個列進行索引

      索引比對時:全列比對,最左字首比對,查詢條件中使用到了索引的精确比對,但是中間某個條件未提供,查詢條件沒有指定索引第一列;

      範圍查詢、查詢條件中含有函數和表達式;

    • 設計索引時,可以采用字首索引
    • 進行索引時,查詢條件不能含有函數或表達式,否則不使用索引
    • 覆寫索引,一般來說除了聚集索引,索引檔案的節點中包含key值和記錄的其他資訊;查找時直接從索引檔案中就可以查找到想要的資料,不必通路實際資料檔案。

項目問題

  1. 描述一下自己的這個項目
  2. RabbitMQ的細節

    消息隊列面試題要點 - Mr.peter - 部落格園 (cnblogs.com)

    1. 為什麼要使用消息隊列?
    2. 使用消息隊列有什麼缺點?
    3. 消息隊列如何選型?
    4. 如何保證消息隊列是高可用的?
    5. 如何保證消息的可靠性傳輸?
    6. 如何保證消息的順序性?
  3. Redis的用處

    Redis面試題總結 - 簡書 (jianshu.com)

    1. 為什麼要用Redis、為什麼要用緩存?
    2. 為什麼要用Redis而不是map做緩存
    3. Redis和Memcashed差別
    4. Redis資料類型
    5. Redis過期時間、淘汰機制、持久化、事務
    6. 緩存雪崩和緩存穿透 解決?
    7. 如何解決Redis并發競争key的問題?
    8. 如何保證保證緩存與資料庫的一緻性問題?

繼續閱讀