1v1面試題彙總JAVA【持續更新中】

JAVA系列:

  1. 聊一下類加載器

     類加載器是用於加載類文件的類。Java源碼通過javac編譯器編譯成類文件,
     然後JVM來執行類文件中的字節碼來執行程序。
     類加載負責加載文件系統、網絡或其他來源的類文件。有三種默認使用的類加載器:
     Bootstrap類加載器、Extension類加載器和System類加載器(又稱Application類加載器)
     1. Bootstrap類加載器負責加載JDK類文件,是所有類加載器的父加載器。
     另外Bootstrap類加載器是唯一一個大部分是由C語言實現的,其他類加載器都是通過java實現的
     2. Extension類加載器將加載類的請求先委託Bootstrap,若未成功加載,
     再從其他目錄進行加載。
     3. System類加載器,負責從classpath環境中加載應用相關的類
     
     類加載器的工作原理基於三個機制:委託、可見性和一致性
     委託: 假設有一個類需要加載,首先由System類加載器委託Extension類加載器加載,
     Extension再委託Bootstrap類加載器進行加載。Bootstrap進行查找,若存在這個類則加載,
     若沒有這個類可以加載,再回到Extenstion類加載器查找,若找不到再回到System類加載器加載
     可見機制:子類加載器可以看到父類加載器加載的類,反之不行
     單一性:父類加載器加載過的類不能被子加載器加載第二次
    
  2. 介紹restfult規範

     1. 使用標準方法(GET、POST、PUT、PATCH、DELETE)操作資源
     2. 儘量採用https協議
     3. 請求體與響應體 統一使用json格式承載,json使用駝峯命名,
     媒體類型媒體類型需設置爲 ”application/json"
     4. 請求響應統一使用UTF8格式,時間使用UTC格式:年月日時分秒
     5. 消息響應對應的狀態碼
    
  3. 介紹整個JAVA虛擬機的構造(知道多少說多少)

  4. 介紹一下GC機制

  5. 聊一下Java中的數據結構

    Java中常見的數據結構,主要分爲Collection 和 map 兩個主要接口
    1. 常用類:
    a. ArrayList
    b. Vector (線程安全)
    c. LinkedList
    d. HashMap
    e. HashTable(線程安全)
    2. 區分Vector、ArrayList和LinkedList
    性能上來說ArrayList最好,但如果集合中元素需要頻繁插入刪除時LinkedList表現會更好,
    Vector適合用於線程同步的:
    a. 如果能用數組儘量用數組
    b. 如果沒有頻繁增刪,優先用ArrayList
    c. 多線程時,考慮用Vector
    d. 頻繁增刪考慮用LinkedList
    
  6. SpingCloud組件

  7. 客戶端和服務端使用socket進行連接,客戶端向服務端發送一條信息,並顯示發送成功,服務端收到了嗎

  8. 講一下Java的HashMap實現

     HashMap實際上是一個“鏈表散列”的數據結構,即數組和鏈表的結合體。
     HashMap底層是一個數組結構,數組中的每一項又是一個鏈表,
     當新建一個HashMap時,就會初始化一個數組。
     進入Map的KV,會根據hash值得到這個元素在數組中的位置(數組下標),
     若該位置已存放了其他元素,那麼這個位置上的元素將以鏈表形式存放,
     新加入的放在鏈頭(頭插法)。
     當用戶試圖將一個KV存入HashMap中時,程序首先根據key的hashCode返回值決定Entry的存儲位置。
     先遍歷該位置鏈表的key,是否存在相同的key,若存在則進銷覆蓋value,不存在則插入
    
  9. 線程之間如何進行通訊

     1.  同步:通過Synchronized關鍵字來實現線程通信。
     線程A和線程B需要調用同一個類中兩個不同的Synchronized方法,
      儘管調用的方法不同,但是需要等待其中一個線程執行完對應方法,其他線程才能執行(相當於共享變量)
     3. while輪詢:線程A在使用資源,線程B不斷使用while循環去查看資源是否到位
     4. wait/notify:線程A需要調用資源1,而資源1未到位,則線程A調用wait()放棄CPU,
     當資源1到位了,線程B調用notify()喚醒線程A,線程A進入就緒狀態 
     5. 管道通信
    
  10. 進程之間的通信:

    1. 管道(Pipe)
    2. 命名管道(FIFO)
    3. 消息隊列
    4. 信號量
    5. 共享內存
    
  11. 簡介Volatile

    1. volatile是一種比sychronized更輕量的同步機制
    2. 當一個變量定義爲volatile後, 此變量對所有線程可見當一個變量定義爲volatile後, 此變量對所有線程可見
    3. 用volatile修飾的變量會被存到內存中而非cpu緩存中,相當於多了一層內存屏障
    
  12. ThreadLocal

  13. 跨域問題

    跨域問題即同源問題,解決方法有jsonp、利用nginx反向代理、修改請求頭等
    
  14. 比較int和Integer

    1. Integer是int 類型的包裝類,int則是java的基本數據類型
    2. Integer必須實例化後才能使用,int不需要
    3. 當new一個Integer時,實際上是生成一個指針指向對象,而int則是直接存儲數據值
    4. Integer默認值爲null, int 默認值爲0
    5. Integer通過new生成兩個值相同的對象是不相等的,因爲內存地址不同
    6. java對-128到127之間的數會進行緩存,即Integer i = 127時會進行緩存,
    下一次再寫Integer j = 127會直接從緩存中取出,不會再new一次
    
  15. 一個進程可以允許最大的線程數

    默認情況下,一個線程棧大概要預留1M的空間,而一個進程可用的內存空間爲2G,理論上
    一個進程中最多可以開2048個線程,但是內存不可能完全用於做線程棧,所以實際數目應該
    比這個值要小。
    

計算機網絡系列:

  1. 七層OSI及對應的協議

  2. 三次握手和四次揮手

  3. 如果客戶端和服務端建立了tcp連接,突然將客戶端網線拔掉,服務器端知道嗎?

    當客戶端與服務端建立正常TCP連接後,若客戶端主機斷開網線、電源掉電或系統崩潰,
    服務器進程將永遠不會知道(通過我們常用的select,epoll監控不到斷開或錯誤時間),
    如果不主動處理或重啓系統的話服務端會一直維持這個連接,這種情況稱爲半開連接。
    除非我們配置了系統的SO_KEEPALIVE選項,或應用層的心跳檢測。
    若網線斷開時間短暫,在SO_KEEPALIVE探測時間內,當連上網線此TCP連接會自動恢復。
    反之,連上網線後要重新建立連接
    
  4. 聊一下常見的狀態碼

    302重定向、304服務器無法滿足請求資源、400參數錯誤、401鑑權失敗、404無法找到網頁、
    403服務器拒絕訪問、500服務器響應錯誤、503服務器故障
    
  5. 一條請求從瀏覽器發出後經過什麼到達服務器(假設後端使用SpringMVC):

    瀏覽器請求 -> 應用層 -> 顯示層 -> 會話層 -> 傳輸層 -> 網絡層 -> 鏈路層 -> 物理層
    -> 鏈路層 -> 網絡層 -> 傳輸層 -> 會話層 ->  顯示層 -> 應用層 -> dispatch Servlet ->
    Controller -> Model -> View -> 迴流
    

操作系統系列:

  1. 進程、線程、協程之間的關係

       1. 進程是操作系統資源分配的最小單位
       2. 線程是CPU調度的最小單位。一個進程可以由多個線程,多個線程共享進程資源
       3. 協程被稱爲輕量級線程, 調度完全由用戶控制,擁有自己的寄存器上下文和棧
       4. 線程的執行過程可以理解爲一個自上而下執行的程序,可以將這個程序切分成多個部分,
       如A 、B、C.而協程,可以認爲一個程序由A、B、C多個部分組成。
       現在執行到A的某一行,先暫停執行將其保存,轉而去執行B,如A 、B、C.而協程,
       可以認爲一個程序由A、B、C多個部分組成。現在執行到A的某一行,先暫停執行將其保存,
       轉而去執行B,等一定時間再回來接着執行A
    
  2. 死鎖場景

MySQL :

  1. 數據庫爲什麼要用B+樹:

       文件很大,需要存儲到磁盤,使用B+樹可以減少訪問磁盤的次數  
    
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章