Java面試 32個核心必考點徹底解析

[TOC]html

這是一份來自嗶哩嗶哩的Java面試java

Java面試 32個核心必考點徹底解析(完)ios

課程預習

1.1 課程內容分爲三個模塊

基礎模塊面試

  • 技術崗位與面試
  • 計算機基礎
  • JVM原理
  • 多線程
  • 設計模式
  • 數據結構與算法

應用模塊算法

  • 經常使用工具集
  • 經常使用框架
  • 緩存
  • 隊列
  • 數據庫

綜合模塊數據庫

  • 系統架構設計
  • 微服務架構
  • 容器化

1.2 換工做面臨問題

能力不錯,卻總被忽略編程

  1. 不知道簡歷怎麼準備
    1. 工做年限
    2. 美觀度
    3. 多分簡歷
  2. 不知道面試官考什麼
    1. 社交門戶側重於大規模併發場景的應用和架構能力
    2. OTO行業側重於綜合能力考察
    3. 金融更喜歡邏輯縝密,對高可用安全領域有經驗的候選人
    4. 校招更多對基礎知識和邏輯思惟方面的考察,以培養潛力考察爲主
    5. 初中級工程師則須要多關注知識的廣度,基礎知識的應用
    6. 高級資深工程師須要深刻理解基本原理,以綜合能力考察爲主
    7. 沒有get到面試官的考察意圖。如:問到是否使用某框架,實際是是問該框架的使用場景,有什麼特色,和同類可框架對比一系列的問題。
  3. 不知道如何提高晉級?
    1. 學習首先有個框架

1.3 課程特點

  • 全盤彙總:Java知識體現精細梳理
  • 特近實戰:面試官親自教你拿Offer
  • 潛規則:揭祕技術面試加分&潛規則
  • 權威性:拉勾40W技術崗位大數據支持

課時1:技術人職業發展路徑

1.1 工程師發展路徑

技術序列:技術攻堅、架構知識、專業知識設計模式

  • 工程師
  • 高級工程師
  • 資深工程師
  • 技術專家
  • 高級技術專家

1~3年內從工程師到高級工程師發展,夯實基礎,重點提升工做基礎能力,培養技術的深度和廣度,對不一樣方向的新技術保持強烈的好奇心和學習心api

3年以上資深工程師須要重點配音技術攻堅能力,疑難問題的排查,大型項目的工程拆分,技術品牌的塑造。具體工做包括,原理實現,注重框架能力的培養,大規模高併發場景,高可用可擴展措施和方案,業務的抽象和架構能力數組

管理序列:團隊管理、項目管理、溝通協做

  • 工程師
  • 高級工程師
  • 技術經理
  • 技術總監
  • 高級技術總監

偏向於團隊把控,須要讓團隊造成技術戰鬥力,利用一切資源讓團隊完成做戰目標,作好團隊內和跨團隊溝通工做,在實際工做中這兩種並無明顯的邊界,例如作管理不表示遠離架構設計,技術專家也不是單兵做戰。這兩個方向的區分點在於工做方向的側重點不一樣。

面試訣竅示例:同過往的經驗來看,我對項目的總體規劃、管理、推動比較感興趣,在任務協調溝通方面也有過比較突出的表現,因此個人職業規劃是成爲一名職業的技術經理,以管理方向爲發展目標。

1.2 常見技術崗位劃分

職級 工做年限 B(百度) A(阿里) T(騰訊)
高級技術專家 5-10 T7 P8
技術專家 4~8年 T6 P
資深工程師 3~6年 T5 P
高級工程師 2~4年 T4
工程師 1~3年

1.3 面試崗位選擇

公司&團隊

  1. 大公司核心業務(首選)
  2. 小公司核心業務(1~3年)
  3. 大公司邊緣業務(鍍金)
  4. 小公司邊緣業務(儘可能不選)

崗位匹配度

匹配度與發展方向相吻合

1.4 常見面試流程

  1. 前置面試
    1. 電話面試
    2. 筆試
    3. 上機編程
  2. 技術一面
    1. 純技術面(首選算法,例如排序、)
    2. 偏重於基礎與實戰能力
    3. 面試官是將來的同組同事
  3. 技術二面
    1. 純技術面(項目能力、架構能力)
    2. 偏重算法、技術深度
    3. 面試官是將來直屬leader
  4. 技術三面
    1. 半技術面(架構能力、技術敏感度、職業規劃)
    2. 架構能力與發展潛力
    3. 面試官是部門技術leader
  5. HR面
    1. 非技術面
    2. 我的發展規劃
    3. 價值觀與薪資
  6. 各級領導
    1. 通常非技術面
    2. 沒有原則性問題能都經過

1.5 面試前的準備工做

能力、心態、溝通

  1. 瞭解應試公司及崗位信息
  2. 系統複習基礎知識
  3. 對原公司負責的項目進行梳理總結
  4. 學習典型架構案例
  5. 閱讀常考考點源碼
  6. 針對性準備加分項

提早準備一份自我介紹,本身的技術特長和職業優點

避免冷場,對於回答不上來的問題,提供解題思路,或者詢問面試官是否能夠換一個問題

注意細節,坐姿、表情、觀察面試官反應

1.6 面試考察點

硬技能

  • 基礎知識
  • 項目經驗
  • 架構能力
  • 應用能力

軟實力

  • 邏輯思惟
  • 溝通協做
  • 管理推動
  • 學習思考
  • 培養潛力

![面試考察點](Java面試 32個核心必考點徹底解析.assets/面試考察點.PNG)

1.7 四類硬技能

基礎知識

  • 計算機基礎
    • 網絡
    • 操做系統
    • 數據結構
    • 算法
  • Java
    • JVM
    • 語言特性
    • 多線程

項目經驗

  • 項目描述
  • 項目難點
  • 項目問題
  • 項目改進

應用知識

  • 經常使用工具
    • 排查類
    • 協做類
    • 保障類
    • 系統類
  • 經常使用框架
    • Spring
    • Netty
    • Dubbo
    • Motan
    • Mybatis
  • 隊列
  • 數據庫
  • 緩存

架構能力

  • 微服務架構
  • Docker
  • ZK
  • SC
  • KBs

課時2:計算機與網絡基礎

  1. 知識點彙總
  2. TCP詳解
  3. 設計模式詳解
  4. Java語言基礎知識
  5. 考察點和加分項
  6. 真題

2.1 知識點彙總

2.1.1操做系統(加粗爲重點)

進程與線程

  • 區別聯繫:進程是資源分配的最小單位,線程是程序執行的最小單位;進程使用獨立的數據空間,線程共享進程的數據空間
  • 線程調度:時間片輪轉調度、先來先服務調度、優先級調度、多級反饋隊列調度、高響應比優先調度
  • 線程切換步驟:線程的上下文切換、線程切換的代價
  • Linux下的IPC(進程間通信)
    • Pipe
    • MessageQueue
    • 共享內存
    • UnixSocket
    • Signal
    • Semaphore
  • 協程

Linux經常使用命令

  • awk
  • top
  • netstat
  • grep
  • less
  • tail

死鎖

內存分頁管理於Swap

任務隊列於CPU Load

擴展知識點

  • 內存屏障
  • 指令亂序
  • 分支預測
  • CPU親和性(affinity)
  • Netfilter於iptables

2.1.2 網絡知識(加粗爲重點)

4/7層網絡模型

TCP協議

  • 創建連接三次握手
  • 關閉連接四次握手
  • 報文狀態標誌與連接狀態
  • Nagel算法與ACK延遲
  • Keepalive
  • 滑動窗口與流量控制

UDP

  • 非連接
  • 非可靠傳輸
  • 效率高

HTTP

  • 協議
    • Method
    • Header
    • Cookie
  • UrlEncode
  • 狀態碼
  • HTTPS
  • HTTP2
    • 多路複用
    • Stream
    • 流量控制
    • 服務端推送
    • 頭部壓縮

QUIC(基於UDP,可是提供了基於UDP的可靠性保障)

  • 避免前序抱阻塞(HOL阻塞)
  • 零RTT建聯
  • FEC前向糾錯

2.2 TCP詳解

TCP特色

  • 基於連接(點對點)
  • 雙工通訊
  • 可靠傳輸
  • 擁塞控制
  • 基於字節流而非報文(保證數據的可靠性和完整性)

TCP實現細節

  • 8種報文狀態
  • 滑動窗口機制
  • KeepAlive
  • Bagel算法

2.2.1 三次握手建聯

![Client-Server](Java面試 32個核心必考點徹底解析.assets/捕獲.PNG)

2.2.2 四次揮手斷連

2.3 設計模式詳解

主要考察兩點

  • 設計模式的實現
  • 設計模式的使用場景(用來解決什麼問題)

單例模式

工廠模式

代理模式

構造者模式

責任鏈模式

適配器模式

觀察者模式

其餘模式

2.3.1 單例模式線程安全實現

  1. 靜態初始化(餓漢式)
  2. 雙重檢查(懶漢式)
  3. 單例註冊表

2.3.2 經常使用設計模式與應用場景

  1. 工廠模式:Spring如何建立Bean
  2. 代理模式:Motan服務的動態代理
  3. 責任鏈模式:Netty消息處理的方式
  4. 適配器模式:Slf4J如何支持Log4J
  5. 觀察者模式:GRPC是如何支持流式請求的
  6. 構造者模式:PB序列化中的Builder

2.4 Java基礎知識詳解

JUC

  • ConcurrentXXX
  • AtomicXXX
  • Executor
  • Caller&Future
  • Queue
  • Locks

版本差別新特性

動態代理與反射

數據類型

  • 空間佔用
  • 基本數據結構
  • 自動轉型與強制轉型
  • 封箱與拆箱

經常使用集合

  • HashMap
  • ConcurrentHashMap
  • ArrayList&LinkedList
  • HashSet
  • TreeMap

對象引用

  • 強引用
  • 弱引用
  • 軟引用
  • 虛引用

異常機制

擴展知識點

  • SPI機制
  • 註解處理機制

2.4.1 Map——知識點詳解

HashMap

  • 數組加鏈表的實現方式
  • 容量大小是2的冪次方
  • 併發讀寫會有什麼風險

ConcurrentHashMap

  • 併發控制與分段鎖思想
  • 1.8中的CAS自旋鎖
  • 紅黑樹的啓用條件

2.4.1 Java版本特性

V 1.8

  • Lambda表達式
  • Stream API
  • 方法引用
  • 接口默認方法
  • Metaspace替換PermGen

V 1.9-1.10

  • 模塊系統
  • 默認G1回收器
  • 接口私有方法
  • 局部變量推斷
  • Graal編譯器

V 1.11

  • ZGC
  • 字符串API加強
  • 內建HTTP Client

2.5 考察點和加分項

面試考察點

  1. 基本概念和基本原理
  2. 實現方式與使用姿式
  3. 常常用到的知識點
  4. 實際應用中容易犯錯的點
  5. 與面試方向相關的知識點

加分項

  1. 知識點與典型的業務場景關聯
  2. 以反例來描述實際場景中誤用的危害
  3. 與知識點相關的優化點(例如在介紹TCP的建聯與斷連時最好可以指出,出現timewait時能夠調整系統參數加快連接的回收與複用)
  4. 與知識點相關的最新技術趨勢
  5. 在瞭解的前提下,儘可能增長回答內容深度

2.6 真題

真題彙總——1

  1. 線程與進程的區別與聯繫 從資源的佔用,切換效率,通訊方式回答
  2. 簡單介紹一下進程的切換過程 主要考察線程上下文的切換代價,要回答切換會保持寄存器、棧等線程相關的現場,須要由用戶態切換到內核態,最後知道能夠經過vmstate命令查看上下文的切換情況
  3. 你常用哪些Linux命令,主要用來解決什麼問題?
  4. 爲何TCP建聯須要3次握手而斷連須要4次
  5. 爲何TCP關閉連接時須要TIME_WAIT狀態,爲何要等2MSL?
  6. 一次完整的HTTP請求過程是怎樣的 DNS解析、TCP建聯、HTTP請求、HTTP相應

真題彙總——2

  1. HTTP2與HTTP的區別有哪些?
  2. 在你的項目中你使用過哪些設計模式?主要用來解決什麼問題?
  3. Object中的equal和hashCode的做用分別是什麼?
  4. final、finally、finalize的區別與使用場景
  5. 簡單描述一下java的異常機制
  6. 線上使用的哪一個版本jdk,爲何使用這個版本(有什麼特色)?

課時3:深刻淺出JVM

3.1 知識點彙總

內存模型

  • 程序計數器
  • 方法區
  • 本地方法棧

類加載器

  • 雙親委派機制
  • Boostrap類加載器
  • Extension類加載器
  • System類加載器
  • 自定義類加載器

GC

  • 分代回收
    • 老年代
    • 年輕代
    • 持久代
  • 回收器實現
    • 穿行回收器
    • 並行回收器
    • CMS
    • G1

性能調優

  • JVM參數
  • 性能分析工具
    • MAT
    • JMC
    • JStack
    • JStat

執行模式

  • 解釋模式
  • 編譯模式
  • 混合模式

編譯器優化

  • 公共子表達式的消除
  • 指令重排
  • 內聯
  • 逃逸分析
    • 方法逃逸
    • 線程逃逸
  • 棧上分配
  • 同步消除

3.2 JVM的內存模型

3.2.1 JVM內存模型

線程獨佔

  • 棧(存儲局部變量表、操做棧、動態連接、方法出口等信息)
  • 本地方法棧(native方法)
  • 程序計數器

線程共享

  • 堆(堆全部線程共享,分代管理)

  • 方法區(類信息、常量、靜態變量,jdk1.7中的永久代和jdk1.8中的metaspace都是方法區的一種實現)

面試回答要點:

  1. 各部分功能
  2. 哪些是線程共享,哪些是線程獨佔

3.2.2 JMM與內存可見性

Java內存模型,定義程序中變量的訪問規則。

在多線程進行數據交互時,例如線程A給一個共享變量賦值後由線程B來讀取這個值,線程A修改變量只修改在本身的工做內存區中,線程B是不可見的,只有從A的工做內存區寫回到工做主內存,B在從主內存讀取到本身的工做內存區才能進行進一步的操做。

因爲指令重排序的存在,寫和讀的順序可能會被打亂,所以JMM須要提供原子性、可見性、有序性的保證。

![](Java面試 32個核心必考點徹底解析.assets/JMM.PNG)

3.2.3 JMM保證

![JMM保證](Java面試 32個核心必考點徹底解析.assets/1555304865376.png)

3.3 Java類加載機制詳解

3.3.1 類的生命週期

加載:是文件到內存的過程,經過類的徹底限定名查找此類字節碼文件,並利用字節碼文件建立一個Class對象

驗證:驗證是堆文件類內容驗證,目的在於當前類文件是否符合虛擬機的要求,不會危害到虛擬機安全,主要包括四種:文件格式驗證、元數據驗證、字節碼、符號引用

準備:準備階段是進行內存分配,爲類變量,也就是類中由static修飾的變量分配內存並設置初始值,初始值是0或null,而不是代碼中設置的具體值,代碼中設置的值在初始化階段完成,另外也不包括final修飾的靜態變量,由於final變量在編譯時就已經分配

解析:解析主要是解析字段、接口、方法,主要是將常量值中的符號引用替換爲直接引用的過程,直接引用就是直接指向目標的指針或相對偏移量等;

初始化:最後是初始化,主要是完成靜態塊執行與靜態變量的賦值,這是類加載最後階段,若被加載類的父類沒有初始化,則先對父類進行初始化。

只有對類使用是纔會初始化,初始化的條件包括訪問類的實例,訪問類的靜態方法和靜態變量的時候,使用Class.forName()反射類的時候,或者某個子類被初始化的時候。

圖中淺綠的兩個部分表示類的生命週期。

![類的加載與卸載](Java面試 32個核心必考點徹底解析.assets/1555304980649.png)

3.3.2 類加載器

BootStrap ClassLoader:啓動類加載器加載JAVA_HOME/lib下的類

ExtClassLoader:擴展加載器加載JAVA_HOME/lib/ext下的類

AppClassLoader:應用加載器加載加載classpath指定目錄下的類

除此以外,還能夠自定義類加載器。

Java的類加載器使用雙親委派模式,雙親委派模型的工做過程是:

  • 若是一個類加載器收到了類加載的請求,它首先不會本身去嘗試加載這個類,而是把這個請求委派給父類加載器去完成。
  • 每個層次的類加載器都是如此。所以,全部的加載請求最終都應該傳送到頂層的啓動類加載器中。
  • 只有當父加載器反饋本身沒法完成這個加載請求時(搜索範圍中沒有找到所需的類),子加載器纔會嘗試本身去加載。

不少人對「雙親」一詞很困惑。這是翻譯的鍋,,,「雙親」只是「parents」的直譯,實際上並不表示漢語中的父母雙親,而是一代一代不少parent,即parents。

雙親委派模式優點:

採用雙親委派模式的是好處是Java類隨着它的類加載器一塊兒具有了一種帶有優先級的層次關係,經過這種層級關能夠避免類的重複加載,當父親已經加載了該類時,就沒有必要子ClassLoader再加載一次。其次是考慮到安全因素,java核心api中定義類型不會被隨意替換,假設經過網絡傳遞一個名爲java.lang.Integer的類,經過雙親委託模式傳遞到啓動類加載器,而啓動類加載器在覈心Java API發現這個名字的類,發現該類已被加載,並不會從新加載網絡傳遞的過來的java.lang.Integer,而直接返回已加載過的Integer.class,這樣即可以防止核心API庫被隨意篡改。

![三種類加載器](Java面試 32個核心必考點徹底解析.assets/1555305977442.png)

3.4 經常使用GC算法介紹

3.4.1 分代回收

分代管理主要是爲了方便垃圾回收,這樣作是基於兩個事實:

  1. 大部分對象很快都不在使用
  2. 還有一部分不會當即無用,但也不會持續很長時間

大部分對象在Eden區中生成,Eden區滿時,還存活的對象會在兩個Suivivor區交替保存,達到必定次數後對象會晉升爲老年代。

老年代用來存放從年輕代晉升而來的存活時間較長的對象。

永久代主要用來保存類信息等內容。

![1555308921705](Java面試 32個核心必考點徹底解析.assets/1555308921705.png)

3.4.2 垃圾回收算法

CMS算法——JDK 1.7之前

![1555309308617](Java面試 32個核心必考點徹底解析.assets/1555309308617.png)

G1算法——JDK 1.9後默認垃圾回收算法

![1555309418313](Java面試 32個核心必考點徹底解析.assets/1555309418313.png)

ZGC——針對大內存堆的低延遲垃圾回收算法

  • 着色指針
  • 讀屏障
  • 併發處理
  • 基於Region
  • 內存壓縮(整理)

ZGC算法

3.5 考察點和加分項

考察點

  1. 深刻理解JVM內存模型
  2. 瞭解類加載機制
  3. 瞭解內存可見性
  4. 瞭解經常使用的GC算法實現和使用場景
  5. 可以根據業務場景選擇合適JVM參數與GC算法

加分項

  1. 編譯器優化
  2. 問題排查經驗與思路
  3. JVM調優經驗與調優思路
  4. 瞭解最新的技術趨勢(例如:ZGC、Grraalvm)

3.6 真題

  1. 簡述描述一下JVM的內存模型
  2. 生命狀況下會觸發FullGC
  3. Java類加載器由幾種,關係是怎樣的?
  4. 雙親委派機制的加載流程是怎樣的,有什麼好處?
  5. 1.8爲何用Metaspace替換掉PermGen?Metasapce保存在哪裏?
  6. 編譯期會對指令作哪些優化?(簡單描述編譯器的指令重排)
  7. 簡單描述一下volatile能夠解決什麼問題?如何作到的? 強制主內存讀寫同步以及防止指令重排序兩點
  8. 簡單描述一下GC的分代回收
  9. G1垃圾回收算法與CMS的區別有哪些?
  10. 對象引用有哪幾種方式,有什麼特色? 強弱軟虛在四種引用以及在GC中的處理方式
  11. 使用過哪些JVM調試工具,主要分析哪些內容?

課時4:併發與多線程

4.1 知識點彙總

死鎖

  • 競爭條件與臨界區
  • 死鎖檢測與防止死鎖
  • 殘剩條件
    • 互斥
    • 請求並保持
    • 不可剝奪
    • 循環等待

線程通訊

  • wait
  • notify
  • notifyAll

線程狀態轉換

  • NEW
  • RUNNABLE
  • BLOCKED
  • WAITING
  • TIMED_WAITING
  • TERMINATED

經常使用工具類(JUC)

  • ConcurrentXXX
  • AtomicXXX
  • Executor
  • Caller&Future
  • Queue
  • Locks

機制

  • ThreadLocal
  • Fork/Join
  • Volatile
  • Interrupt

同步與互斥

  • Synchronized
  • Lock
    • 鎖類型
    • 鎖實現
  • CAS
    • Unsafe
    • 原語

線程池

  • 使用場景
  • 原理與實現方式
  • 線程池實現

4.2 線程的狀態轉換

4.3 線程同步與互斥

CAS與ABA問題

![1555316152196](Java面試 32個核心必考點徹底解析.assets/1555316152196.png)

Synchronized實現原理

![1555316240167](Java面試 32個核心必考點徹底解析.assets/1555316240167.png)

AQS與Lock

![1555316349493](Java面試 32個核心必考點徹底解析.assets/1555316349493.png)

4.4 線程池詳解

線程池使用場景

![1555316406381](Java面試 32個核心必考點徹底解析.assets/1555316406381.png)

線程池參數介紹

核心線程數,默認狀況下,核心線程會一直存活

最大線程數,決定線程池最多能夠建立多少線程

線程的空閒時間,空閒時間的單位,當線程閒置超過空閒時間時就會被銷燬

線程緩存隊列

  • 有界隊列
  • 無界隊列
  • 同步隊列

線程池工廠方法

線程池滿時拒絕策略

  • 拋出異常
  • 丟棄
  • 提交失敗時,由提交任務的線程直接執行任務
  • 丟棄最先提交的任務

![1555316495718](Java面試 32個核心必考點徹底解析.assets/1555316495718.png)

線程池任務執行流程

![1555316993492](Java面試 32個核心必考點徹底解析.assets/1555316993492.png)

4.5 JUC重點工具實現類

類名 特色
AtomicLong, AtomicInteger, AtomicBoolean, LongAdder, DoubleAdder, LongAccumulator, DoubleAccumulator AtomicLong經過unsafe類實現,基於CAS。LongAdder基於Cell,分段鎖思想,空間換時間,更適合高併發場景
AtomicReference, AtomicStampedReference, AtomicMarkableReference 原子對象讀、寫。AtomicStampedReference和AtomicMarkableReference用來解決ABA問題,分別基於時間戳和標記位
ReentrantLock, ReentrantReadWriteLock, StampedLock, LockSupport ReentranLock是獨佔鎖,Semaphore是共享鎖。StampedLock是1.8改進的讀寫鎖,CLH樂觀鎖,防止寫飢餓
Executors, ForkJoinPool, FutureTask, CmpletableFuture CompletableFuture支持流式調用,多future組合,能夠設置完成時間。ForkJoinPool:分治思想+工做竊取
LinkedBlockingDeque, ArrayBlockingQueue 雙端隊列,單端隊列
CountDownLatch, CyclicBarrier, Semaphore 多線程任務彙總,多線程併發執行,控制併發讀(共享鎖)
ConcurrentHashMap, CopyOnWriteArrayList COW適合讀多寫少,小數據量,高併發場景

4.6 考察點和加分項

考察點

  1. 理解線程的同步與互斥的原理(臨界資源、理解區、自旋鎖、偏向鎖 、衝入鎖、讀寫鎖概念)
  2. 掌握線程安全相關機制(CAS、Synchronized、ThreadLocal使用弱引用ThreadLocalMap)
  3. 瞭解JUC工具的使用場景與實現原理
  4. 熟悉線程池的原理、使用場景、經常使用配置
  5. 理解線程的同步與異步、阻塞與非阻塞(同步與異步的區別是任務是否在同一個線程中執行的 ,阻塞與非阻塞的區別是異步執行任務時線程是否是會阻塞等待結構仍是會繼續等待後面的邏輯)

加分項

  1. 結合實際項目經驗或實際案例介紹原理
  2. 解決多線程問題的排查思路與經驗
  3. 熟悉經常使用的線程分析工具與方法
  4. 瞭解Java8堆JUC的加強
  5. 瞭解Reactive異步編程思想

4.7 真題

  1. 如何實現一個生產者與消費者模型?(鎖、信號量、線程通訊、阻塞隊列等)
  2. 如何理解線程的同步與異步、阻塞與非阻塞?
  3. 線程池處理任務的流程是怎樣的?
  4. wait與sleep的由什麼不一樣? 一、wait屬於Object類,sleep屬於Thread類;二、wait會釋放對象鎖,而sleep不會;三、wait須要在同步塊中使用,sleep能夠在任何地方使用;四、sleep須要捕獲異常、wait不須要。
  5. Synchronized和ReentranLock有什麼不一樣?
  6. 讀寫鎖適用於什麼場景?ReentrantReadWriteLock是如何實現的? 讀寫鎖適合讀併發多,寫併發少的場景
  7. 線程之間如何通訊? wait和notify機制、共享變量Synchronized
  8. 保證線程安全的方法由哪些? CAS、Synchronized、Lock、ThreadLocal
  9. 如何儘量提升多線程併發性能? 儘可能減小臨界區範圍、使用ThreadLocal、減小線程切換、使用讀寫鎖或CopyOnWrite機制
  10. ThreadLocal用來解決什麼問題?ThreadLocal是如何實現的? 重點回答ThreadLocak不是用來解決多線程共享變量的問題,而是線程數據隔離的問題
  11. 死鎖產生的條件?如何分析是否由線程死鎖?
  12. 在實際工做中遇到過什麼樣的併發問題,如何發現(排查)並解決的?

課時5:數據結構與算法

5.1 知識點彙總

5.1.1 數據結構

隊列

  • 數組
  • 單鏈表
  • 雙鏈表
  • 循環鏈表
  • 散列表

  • 有向圖
  • 無向圖
  • 帶權圖

多叉樹

  • B、B+樹
  • 字典樹

二叉樹

  • 平衡二叉樹
  • 紅黑樹
  • 哈夫曼樹

5.1.2 算法

經常使用算法思路

  • 分治
  • 動態規劃
  • 貪心
  • 回溯
  • 分支界定

複雜度

  • 時間複雜度
  • 空間複雜度

排序

  • 插入
    • 希爾
    • 直插
  • 交換
    • 冒泡
    • 快排
  • 選擇
    • 簡單選擇
  • 歸併
  • 基數

查找

  • 二分查找
  • 二叉排序樹
  • B樹
  • BloomFilter

字符串匹配

  • BF算法
  • BM算法
  • Sundady算法
  • KMP算法
  • Tire樹

5.2 從搜索樹到B+樹

![1555322006259](Java面試 32個核心必考點徹底解析.assets/1555322006259.png)

![1555322091545](Java面試 32個核心必考點徹底解析.assets/1555322091545.png)

5.3 字符串匹配

字符串匹配問題

判斷給定字符串中的括號是否匹配

解體思路:

一、使用棧

二、遇左括號入棧

三、遇右括號出棧,判斷出棧括號是否與右括號成對

字符串匹配問題解題思路

![1555334760723](Java面試 32個核心必考點徹底解析.assets/1555334760723.png)

5.4 TopK問題

TopK問題

找出N個數中最小的K個數(N很是大)

![1555334823104](Java面試 32個核心必考點徹底解析.assets/1555334823104.png)

TopK變種

從N有序隊列中找到最小的K個值

![1555334934753](Java面試 32個核心必考點徹底解析.assets/1555334934753.png)

5.5 經常使用算法適用場景

經常使用算法介紹

![1555334984091](Java面試 32個核心必考點徹底解析.assets/1555334984091.png)

![1555335033586](Java面試 32個核心必考點徹底解析.assets/1555335033586.png)

5.6 考察點和加分項

考察點

  1. 瞭解基本數據結構與特色
  2. 表、棧、隊列、樹須要熟練掌握,深入理解使用場景(例如紅黑樹適合搜索,B+樹適合索引)
  3. 瞭解經常使用的搜索、排序算法,及複雜度和穩定性
  4. 瞭解經常使用的字符串處理算法
  5. 可以分析算法實現的複雜度
  6. 瞭解經常使用算法分類,解決問題的思路和解決哪類問題

加分項

  1. 可以將數據結構與實際使用場景結合(介紹紅黑樹時結合TreeMap的實現,介紹B+樹時結合MySQL的索引)
  2. 不一樣算法在業務場景中的應用
  3. 面對模糊的題目能溝通確認條件和邊界
  4. 書寫算法代碼前,先講一下解題思路
  5. 可以發現解答中的一些問題,給出改進的思路

5.7 真題

題一、題2基礎題,必須掌握

  1. 各類排序算法實現和複雜度、穩定性
  2. 二叉樹的前、中、後序遍歷
  3. 翻轉句子中單詞的順序
  4. 用棧模擬隊列(或用隊列模擬棧)
  5. 堆10億個數進行排序,限制內存位1G
  6. 去掉(或找出)兩個數組中重複的數字
  7. 將一顆二叉樹轉換成其鏡像
  8. 肯定一個字符串中的括號是否匹配
  9. 給定一個開始詞,一個結束詞,一個字典,如何找到從開始詞到結束詞的最短單詞接龍路徑
  10. 如何查找兩個二叉樹節點的最近公共祖先

課時6:經常使用工具集

6.1 知識點彙總

團隊協做

  • Ant
  • Maven
  • Gradle
  • Git
  • SVN

質量保證

  • Checkstyle
  • FindBugs
  • SonarQube

壓測

  • JMeter
  • JMH
  • AB
  • LoadRunner

容器與代理(隨着微服務的盛行,Envoy、OpenResty、Kong等API網關的使用也愈來愈廣泛)

  • Tomcat
  • Jetty
  • Nginx
  • Envoy
  • OpenResty
  • Kong

CI/CD

  • Gitlab-CI
  • Jenkins
  • Travis

JVM相關

  • JMC(JFR)
  • jstack、jmap、jstat

系統分析

  • vmstat
  • iostat & iotop
  • ifstat & iftop
  • netstat
  • dstat
  • strace
  • GDB
  • lsof
  • tcpdump
  • traceroute

文檔管理

  • JavaDoc
  • Swagger

網絡工具

  • PostMan
  • WireShark(網絡包分析工具)
  • Fiddler(只針對HTTP進行抓捕)
  • Charies

6.2 JVM工具

JMC

![1555342061188](Java面試 32個核心必考點徹底解析.assets/1555342061188.png)

線上調試神奇——btrace

![1555342168298](Java面試 32個核心必考點徹底解析.assets/1555342168298.png)

其餘經常使用JVM工具介紹

![1555342246235](Java面試 32個核心必考點徹底解析.assets/1555342246235.png)

6.3 Git工做流

Git經常使用命令

![1555342338332](Java面試 32個核心必考點徹底解析.assets/1555342338332.png)

Git經常使用工做流

![1555342399202](Java面試 32個核心必考點徹底解析.assets/1555342399202.png)

6.4 Linux系統分析工具

![1555342510607](Java面試 32個核心必考點徹底解析.assets/1555342510607.png)

![1555342537958](Java面試 32個核心必考點徹底解析.assets/1555342537958.png)

6.5 考察點和加分項

考察點

  1. 瞭解經常使用JVM分析工具
  2. 掌握Git的經常使用操做和工做流
  3. 瞭解Linux系統下經常使用的分析工具

加分項

  1. 可以主動出擊體現知識廣度(在描述項目問題主動引出工具)
  2. 可以體現實戰能力

6.6 真題

  1. 排查JVM問題有哪些經常使用工具?
  2. Git合併代碼有那兩種方法?有什麼區別
  3. Git與SVN有哪些差別?
  4. 你所在的團隊項目開發使用什麼樣工做流?有什麼優勢?

課時7:必會框架(上)——Spring全家桶

7.1 知識點彙總

Spring

  • Spring Framework
  • Spring Boot
  • Spring Data
  • Spring Cloud
    • Sleuth
    • Netflix
    • Config
    • Bus
    • Security

Struts

ORM

  • Hibernate
  • Mybatis

Netty

RPC

  • Motan
  • Bubbo
  • Grpc

其餘框架

  • Jersey
  • RESTEasy
  • Shiro

7.2 Spring框架

Spring基本概念

![1555395888730](Java面試 32個核心必考點徹底解析.assets/1555395888730.png)

Spring框架組件

![1555396040775](Java面試 32個核心必考點徹底解析.assets/1555396040775.png)

機制與實現

AOP

  • 動態代理
  • 靜態代理

PlaceHolder動態替換

  • PropertyPlaceholderConfigure
  • PropertySourcesPlaceholderConfigure

事務

  • 隔離級別
    • ISOLATION_DEFAULT
    • ISOLATION_READ_UNCOMMITTED
    • ISOLATION_READ_COMMITTED
    • ISOLATION_REPEATABLE_READ
    • ISOLATION_SERIALIZABLE
  • 傳播行爲
    • PROPAGATION_REQUIRED
    • PROPAGATION_SUPPORTS
    • PROPAGATION_MANDATORY
    • PROPAGATION_REQUIRED_NEW
    • PROPAGATION_NOT_SUPPORTED
    • PROPAGATION_NEVER
    • PROPAGATION_NESTED

核心接口/類

  • ApplicationContext
  • BeanFactory
  • BeanWrapper
  • FactoryBean

scope

  • Singleton
  • Prototype
  • Request
  • Session
  • Global-session
  • Application
  • Websocket

事件機制

  • ContextRefreshedEvent
  • ContextStatedEvent
  • ContextStoppedEvent
  • ContextClosedEvent
  • RequestHandledEvent

Spring應用

類型類

  • @Controller
  • @service
  • @Repository
  • @Component
  • @Configuration
  • @Bean

設置類

  • @Required
  • @Autowired && @Qualifier
  • @Scope

Web類

  • @RequestMapping && @GetMapping @ PostMapping
  • @PathVariable && @RequestParam
  • @RequestBody && @ResponseBody

功能類

  • @ImportResource
  • @ComponentScan
  • @EnableCaching && Cacheable
  • @Transactional
  • @Aspect && Poincut
  • @Scheduled

配置方式

  • XML
  • 註解
  • API

自動裝配

  • byType
  • byName
  • constructor
  • autodetect

集合屬性注入

內部bean

Spring Context初始化流程

![1555397197543](Java面試 32個核心必考點徹底解析.assets/1555397197543.png)

Spring 中bean的生命週期

![1555397260319](Java面試 32個核心必考點徹底解析.assets/1555397260319.png)

Spring 擴展接口

![1555397325596](Java面試 32個核心必考點徹底解析.assets/1555397325596.png)

Spring Boot

![1555397399875](Java面試 32個核心必考點徹底解析.assets/1555397399875.png)

課時7:必會框架(下)——RPC與ORM

7.3 Netty與RPC

![1555407949580](Java面試 32個核心必考點徹底解析.assets/1555407949580.png)

Netty線程模型

![1555408007496](Java面試 32個核心必考點徹底解析.assets/1555408007496.png)

RPC介紹

![1555408449634](Java面試 32個核心必考點徹底解析.assets/1555408449634.png)

開源RPC框架介紹

![1555408488352](Java面試 32個核心必考點徹底解析.assets/1555408488352.png)

7.4 Mybatis

Mybatis知識點

![1555408578829](Java面試 32個核心必考點徹底解析.assets/1555408578829.png)

Mybatis處理流程

![1555409715315](Java面試 32個核心必考點徹底解析.assets/1555409715315.png)

7.5 考察點與加分項

考察點

  1. 掌握Spring的IOC、AOP的概念與實現
  2. 掌握Spring的Context建立流程和Bean的生命週期
  3. 瞭解Spring經常使用註解的做用與使用方式
  4. 瞭解SpringBoot的相關知識點
  5. 掌握Netty的線程處理模型
  6. 知道經常使用RPC框架的特色
  7. 瞭解Mybatis、Hibernate的實現原理

加分項

  1. 閱讀過框架源碼,瞭解實現細節及思路
  2. 除了會應用,還可以理解理念
  3. 瞭解最新實現或方向
  4. 有實際優化經驗,例如Nett有性能調優

7.6 真題

  1. SSH和SSM框架組合的區別是生命?
  2. 能描述一些Spring Context初始化的整個流程嗎?
  3. 簡單介紹一些Bean的生命週期及做用域
  4. Spring配置中的placeholder佔位符是如何替換的?有什麼辦法能夠實現自定義的配置替換? 要答出經過beanFactoryPostProfessal後置處理器進行的替換,若是要自定義處理,能夠擴展PropertyPlaceHolderConfigure或者PropertySourcePlaceHolderConfigure來實現
  5. SpringMVC的工做流程是怎樣的?
  6. Spring如何解決循環依賴? 從構造器循環依賴和setter循環依賴兩方面來回答
  7. Bean的構造方法、@PostConstruct註解、InitializingBean、init-method的執行順序是怎樣的?
  8. 說說Netty中有哪些重要的對象,它們之間的關係是什麼?
  9. RPC與HTTP的區別是什麼,什麼場景適合選用RPC,什麼場景適合使用HTTP? 在使用方式方面,HTTP使用Client,RPC經過動態代理;從請求模型看,HTTP通常會通過DNS解析,4/7層代理等中間環節,而RPC是點對點直連;從服務治理能力來看,RPC提供豐富的服務治理功能,例如熔斷 、負載均衡,HTTP對跨語言處理比較方便
  10. RPC的交互流程是怎樣的?
  11. 請介紹一下Mybatis的緩存機制
  12. Mybatis如何配置動態SQL?有哪些動態SQL標籤?

課時8:緩存

8.1 知識點彙總

![1555411052725](Java面試 32個核心必考點徹底解析.assets/1555411052725.png)

8.2 Memcache

MC內存結構

![1555411889664](Java面試 32個核心必考點徹底解析.assets/1555411889664.png)

8.3 Redis

Redis知識點

![1555411944911](Java面試 32個核心必考點徹底解析.assets/1555411944911.png)

Redis數據結構

![1555412014624](Java面試 32個核心必考點徹底解析.assets/1555412014624.png)

8.4 緩存常見問題

![1555412069766](Java面試 32個核心必考點徹底解析.assets/1555412069766.png)

8.5 考察點和加分項

考察點

  1. 瞭解緩存的使用場景,不一樣類型緩存的使用方式
  2. 掌握MC和Redis的經常使用命令
  3. 瞭解MC的Redis在內存中的存儲結構
  4. 瞭解MC和Redis的數據失效方式和剔除策略
  5. 瞭解Redis的持久化、主從同步與cluster部署的原理

加分項

  1. 結合使用場景來介紹緩存的使用
  2. 有過度布式緩存設計和應用經驗
  3. 瞭解緩存使用中可能產生的問題
  4. 知道Redis的典型應用場景
  5. 知道Redis的新特性

8.6 真題

  1. Redis和Memcache有什麼區別?該如何選用
  2. 你用到過哪些Redis的數據結構?用在什麼場景下?
  3. Redis有哪些持久化方式,分別是什麼?
  4. Redis的過時機制是怎樣的?Redis有哪些淘汰策略
  5. 如何保證Redis的高併發和高可用?
  6. 如何使用Redis實現延時隊列?如何使用Redis實現分佈式鎖?

原文出處:https://www.cnblogs.com/koubeisi/p/10751035.html

相關文章
相關標籤/搜索