JAVA面試題(43)

    本文首發於cartoon的博客
    轉載請註明出處:cartoonyu.github.io/cartoon-blo…java

java

  1. 對synchronized的瞭解git

    1. java的一個關鍵字,用於重量級鎖的設定
    2. 利用synchronized關鍵字,能夠實現對互斥資源的訪問
    3. 做用範圍
      1. 普通方法,鎖的粒度爲當前對象
      2. 靜態方法,鎖的粒度爲當前類的class對象
      3. 代碼塊,鎖的粒度爲括號內使用的對象
  2. 多線程的同步機制github

    1. 使用同步代碼塊synchronized
    2. 經過標誌位輪詢訪問臨界資源
    3. 經過Condition以及lock對資源的鎖定以及釋放
    4. 經過阻塞隊列BlockQueue(生產者/消費者)
  3. threadLocal的概念以及使用場景redis

    1. 每一個線程都能擁有該變量的獨立副本
    2. 內部經過ThreadLocalMap進行值的存儲以及讀取
      1. 初始容量爲16
        1. 負載因子爲2/3
        2. 經過再hash法解決hash衝突
  4. final,finally,finalize的區別算法

    1. final爲不可變修飾詞,用於聲明屬性,方法或類不可變
    2. finally爲異常捕獲機制一部分,老是會被執行。若try或catch有return語句,finally早於此return語句執行
    3. finalize爲Object方法,調用此方法能夠實現資源的回收,可是回收時間由JVM決定
  5. java註解的做用spring

    1. 生成文檔
    2. 完成特定的標識(@Service等)
    3. 在編譯時進行格式檢查(@Override)
  6. java集合間的區別sql

    1. set與list都只含單個元素,而Map含有key-value對
    2. Map將entry數組置爲null,就是set,因此set內元素是無序的,list元素是有序的
  7. BIO NIO AIO的區別數據庫

    1. BIO
      1. 同步阻塞
        1. 線程阻塞進行運算後返回結果
    2. NIO
      1. 同步非阻塞
        1. 請求共用一個線程進行處理
        2. 線程會直接返回結果到請求
    3. AIO
      1. 異步非阻塞
        1. 線程處理後會經過回調返回結果
  8. java反射機制的理解編程

    1. 做用
      1. 在程序運行中,動態獲取對象所屬類,屬性以及方法等信息
      2. 在程序運行時,動態改變對象屬性
    2. 動態代理以及靜態代理

jvm

  1. 怎麼判斷對象是否可回收?
    1. 引用計數法
    2. 可達性分析算法(GC ROOT)
  2. java內存區域劃分
    1. 運行時數據區域
    2. 線程共享
      1. 方法區
    3. 線程隔離區
      1. 虛擬機棧
      2. 本地方法棧
      3. 程序計數器

數據庫

  1. MyBatis分頁方式以及區別
    1. 邏輯分頁
      1. 數組分頁
      2. RowBounds分頁
    2. 物理分頁
      1. sql分頁
      2. 攔截器分頁
  2. 數據庫事務特性以及隔離級別
    1. 特性
      1. 原子性(Atomicity)
        1. 事務執行結果是一致的,成功或者回滾
      2. 一致性(Consistency)
        1. 事務執行先後數據庫狀態不受影響
      3. 隔離性(Isolation)
        1. 事務間操做相互獨立
      4. 持久性
        1. 事務執行產生的結果是永久存儲下來的
    2. 隔離級別
      1. read uncommitted
        1. 讀取事務未提交的數據
      2. read commited
        1. 屢次查詢某一數據結果不一致
      3. repeatable
        1. 同時修改同一元素形成事務提交結果發生誤差
      4. serializable
        1. 事務的順序執行
  3. redis的數據類型以及底層數據結構
    1. string
      1. 經過DDS(簡單的動態字符串)實現
      2. DDS的實現經過雙端鏈表實現
    2. hash
      1. 壓縮列表(數據量較小)
        1. key-value對少於512個且全部鍵對大小都要小於64字節
      2. 散列表
        1. 鏈地址法解決衝突
    3. set
      1. 有序數組
        1. 數據都是整數
        2. 元素個數不超過512個
      2. 散列表
    4. list
      1. 壓縮列表
      2. 雙循環鏈表
        1. 全部數據大小小於64字節
        2. 數據個數小於128個
    5. 有序集合
      1. 壓縮列表
        1. 相似於數組,存儲空間是連續的,可是元素所佔空間不惟一
      2. 雙循環鏈表
  4. 緩存穿透的概念,解決方法
    1. 緩存穿透是指請求訪問不存在的key,請求穿透到DB,流量大會形成DB崩潰
    2. 解決方法
      1. 採用布隆過濾器或者BitMap對請求進行過濾
  5. 緩存雪崩的概念,解決方法
    1. 大量key設置統一過時時間,形成瞬間DB訪問量過大
    2. 解決方法
      1. key的過時時間用隨機數進行設置
  6. 緩存擊穿的概念,解決方法
    1. 存在key在緩存失效的瞬間被大量請求訪問,形成DB請求量大
    2. 解決方法
      1. 設置短時間key替代原始key
      2. key再生成後刪除短時間key

spring

  1. AOP,IOC的概念
    1. AOP
      1. AOP面向切面編程,它將本來縱向的程序看做成一個個切面的組合,是OOP的補充
      2. 動態插入執行邏輯到原有執行流程中
      3. 通知(Advice):具體實現邏輯
      4. 鏈接點(JoinPoint):使用通知的位置
      5. 切入點(PointCut):指定使用通知的鏈接點位置
      6. 切面(Aspect):通知與切入點集合
      7. 引入(introduction):添加新方法屬性到現有類中
      8. 目標(target):被通知的對象
      9. 代理(proxy)
      10. 靜態代理
      11. 動態代理
      12. 織入(weaving):將切面引用到目標對象生成代理對象的過程
    2. IOC
      1. 我把IOC稱做爲控制反轉或者依賴注入,IOC是Spring的核心思想,它使調用者不用管理對象的生存週期以及具體實現,可以更加註重於業務邏輯的實現。
      2. 在平時實際開發中,我一般使用向上轉型的對象完成業務邏輯,這樣我以爲能使對象中的耦合度下降,並且在代碼重構的時候可以輕易切換實現類。
  2. Spring bean的做用域
    1. singleton
    2. prototype
    3. session
    4. request
    5. global session
  3. Spring bean是線程安全嗎?
    1. prototype,request每次被調用都會建立新對象,不存在線程問題
    2. singleton,session,globalSession會形成線程間競爭,無狀態bean是線程安全的,有狀態beanSpring經過ThreadLocal進行解決
  4. spring mvc的執行流程
    1. 請求經過http到達後端,由DispatcherServlet進行分發
    2. DispatchServlet經過HandlerMapping查找處理的Controller,中間或者會有過濾器等進行處理
    3. 若是在查找過程當中發生錯誤,HandlerExceptionResolver會返回一個HandlerExecutionChain對象到DispathchServlet
    4. 請求正確分發到Controller,Controller調用Service以及Repository等進行處理,調用RequestAndViewNameResolver處理後返回ModelAndView對象到DispatchServlet
    5. DispatchServlet根據返回的ModelAndView對象,將對象交給ViewResolver組件進行視圖的渲染,若是在語言上有特殊要求,渲染會調用LocaleResolver以及ThemeResolver進行國際化的適配

網絡

  1. Session與cookie的區別後端

    1. cookie存儲在客戶端,session存儲在服務器
    2. cookie只能存儲字符串,session能夠存儲任意對象
    3. cookie的存儲大小受客戶端影響,大小爲4KB,session存儲大小不受影響
    4. 後端獲取cookie經過http報文中的cookie字段獲取,session則經過cookie中的sessionId標識尋找
  2. session的工做原理

    1. session是存儲在服務器端的一種標識客戶端的數據結構
    2. 用戶請求到達後臺,後臺檢測是否有sessionId字段的存在
      1. 有的話,校驗字段是否合法
      2. 沒有的話,建立新session並返回對應sessionId到客戶端
  3. TCP與UDP區別

    1. TCP面向鏈接,UDP不面向鏈接
    2. TCP有擁塞控制,UDP沒有擁塞控制
    3. TCP資源開銷大,UDP資源開銷小
    4. TCP只支持一對一,UDP支持一對多
    5. TCP提供可靠傳輸,UDP儘量交付
    6. TCP面向字節流,UDP面向報文
  4. tcp粘包的緣由以及解決辦法

    1. 緣由
      1. 不一樣數據包在到達接收方時首尾部粘在一塊兒
      2. 解決方法
        1. 在每一個tcp報文首部添加報文長度
        2. 在報文的首部或者尾部設置特殊的符號位標識
  5. tcp的三次握手與四次揮手

    1. 三次握手(鏈接過程)
      1. 一次握手(客戶端發起)
        1. 建立TCB
        2. 發送SYN=1,seq=x
        3. 進入SYN-SENT
      2. 二次握手(服務器發起)
        1. 發送ACK=1,syn=1,ack=y+1,seq=x+1
        2. 進入SYN-RCVD
      3. 三次握手(客戶端發起)
        1. 發送ACK=1,seq=x+1,ack=x+1
        2. 進入ESTABLISHED
    2. 四次揮手(結束鏈接過程)
      1. 一次揮手
        1. 客戶端發送FIN=1,seq=u爲內容的請求報文
        2. 客戶端進入FIN-SENT-1狀態
      2. 二次揮手
        1. 服務器端發送ACK=1,seq=v,ack=u+1爲內容的確認報文
        2. 服務器端進入CLOSE_WAIT
        3. 客戶端進入FIN-SENT-2狀態
      3. 三次揮手
        1. 服務器端發送FIN=1,seq=w,ACK=1,ack=u+1爲內容的釋放報文
        2. 服務器端進入LAST_ACK狀態
      4. 四次揮手
        1. 客戶端發送ACK=1,ack=w+1,seq=u+1爲內容的確認報文
        2. 客戶端進入TIME_WAIT狀態,等待2MSL後關閉鏈接
        3. 服務器端接受報文後關閉鏈接

設計模式

  1. 抽象工廠與簡單工廠的區別
    1. 抽象工廠定義建立產品的大概流程,子工廠經過繼承抽象工廠負責具體產品的建立,產品種類的增長不須要改變抽象工廠的代碼邏輯
    2. 簡單工廠負責具體產品的建立,產品種類的增長鬚要改變建立的邏輯

算法

  1. 快速排序實現
    1. 主要採用分治的思想
    2. 定義左右指針遍歷元素(左右指針的初始值爲邊界)
    3. 循環遍歷數組(左指針小於右指針)
      1. 循環遍歷左指針直到元素大於右指針指向的元素
      2. 交換左右指針的元素值
      3. 循環遍歷右指針直到元素小於小指針指向的元素
      4. 交換左右指針的元素值
    4. 返回左指針的值做爲中線
    5. 分別遞歸中線左右,依據2,3的步驟進行處理
相關文章
相關標籤/搜索