寫在前面:
之前寫過一篇Java面試知識點彙總,由於我不斷補充,現在知識點已經比較龐雜,很多人私信我,說那一篇全是知識點太過龐雜,問我有沒有整合的。正好春招和秋招在即,我花費了幾個月的時間,把知識點整合成不同的模塊並針對不同的知識點以及結合本人自己的面試經歷,整合出這篇java面試全攻略。希望對大家有所幫助!
一、面試那點事
在講述知識點之前,我需要先說明一下互聯網面試那點事。
互聯網面試基本流程是:筆試 + 2輪或3輪技術面(又叫業務面)+ HR面試
筆試和HR面試這個是需要自己平時的積累的:
- 筆試基本就是2個小時的編程,題目個數在4個左右,難度在LeetCode中等水平(不同公司難度也不一樣)。但是你筆試基本不要想着去AC,我參加了20+場筆試,很少有全部AC的情況,但是我筆試基本都過了,因爲筆試只是互聯網公司考覈的一個方面而不是全部,還會考覈你的學歷和簡歷,所以筆試即便答的很差勁,心態也不要爆炸,放平心態繼續準備其他的內容,甚至我有一次4道題目,只有一道題目得了一半的分,其他題目都是零分,但是還是給我過了筆試。但是這並不代表編程能力不重要,恰恰相反,在後面的業務面試中,所有的公司,我是說所有的!都會進行編程的考察,也就是手撕代碼環節!這個容不得半點差池,大部分情況保證跑通面試官給的用例基本就可以,但是少數會比較較真,我面試華爲的時候,面試官把我的代碼拷貝到他本地去跑用例。所以這個手撕代碼的環節是無可避免的。準備的話:劍指offer67題和LeetCode的hot100題這兩個是必刷的,而且一遍肯定是不夠的,要刷到自己很熟練爲止。
- HR面就基本是個人情況的瞭解,但是也存在問技術的問題,但是前面的業務技術面都過了,這個就問題不大,HR更多是考察你的性格、人品跟公司是否相符。也是需要慎重對待的。
業務技術面(Java相關)
本文重點!
所有語言都需要掌握的技術點:
- 常見算法和數據結構
- 操作系統
- 數據庫
- 計算機網絡
Java語言主要的技術點:
- Java基礎
- 集合框架
- 多線程
- JVM
- 項目 + 常見中間件
二、知識框架
複習的時候需要構建自己的知識框架,用時髦的詞就是思維導圖,這個不是自己去畫一個思維導圖然後就不管了,我覺得這是一個不斷複習不斷在腦海中構建導圖的過程,複習一個知識點的時候,把這個知識點相關的內容全部串聯起來,形成一個思維框架(俗稱舉一反三)。這樣你就神功大成了!
常見算法和數據結構
- 數組、鏈表、隊列、棧的各種操作(性能,場景)
- 各類排序算法以及複雜度分析(快排、歸併、堆),不同排序算法的穩定性
- 理解並可以分析時間和空間複雜度。
- 動態規劃、貪心。
- 回溯算法
- 二叉樹、前中後虛(圖考察的很少,只有筆試偶爾遇到)
- DFS、BFS算法
- 單調棧、單調隊列
手撕代碼環節最常見的考察就是一維數組、二維數組的操作,一維數組找特定子序列,二維數組特定找路徑,涉及的算法動態規劃、回溯、DFS、BFS等等。
PS:如果實在沒有好的解法,就考慮使用暴力法,因爲大部分面試官不會去專業的網站評測,所以就沒有超時這個隱患,但是面試官很有可能會詢問時空複雜度並進而詢問優化方案。
操作系統
- 進程通信 IPC(幾種方式),進程與線程定義與區別
- 進程調度算法、磁盤掃描算法
- 虛擬內存、頁面置換算法
- 內核態和用戶態的轉換的條件、中斷、系統調用
- 互斥與死鎖
- linux 常用命令(問的時候都會給具體某一個場景)
- Linux的IO模型BIO/NIO/AIO、 IO多路複用
- Linux 內核 select poll epoll、邊緣觸發和水平觸發
- 殭屍進程和孤兒進程
數據庫
- 索引(包括分類及優化方式,失效條件,底層結構B 樹、B + 樹的區別優缺點)
- 優化(explain,慢查詢,show profile)、數據庫的範式
- 輔助索引、主鍵索引、聚簇索引、非聚簇索引、索引回表、索引覆蓋、索引下推
- 聯合索引和最左匹配原則
- 引擎對比(InnoDB,MyISAM)
- 數據庫的鎖(行鎖,表鎖,頁級鎖,讀鎖,寫鎖,悲觀鎖,樂觀鎖)
- 隔離級別,依次解決的問題(髒讀、不可重複讀、幻讀)、隔離級別與加鎖的關係
- 事務的 ACID
- 分庫分表,主從複製,讀寫分離。
- sql 語法(join,union,子查詢,having,group by)主要考察sql語句的書寫
計算機網絡
- OSI7 層模型(TCP4 層)、每層的協議、
- 常見協議爲位置在OSI七層協議的位置(HTTP/TCP/UDP/DNS/IMAP/ARP/路由器/交換機)
- http/https 1.0、1.1、2.0、https加密過程(對稱加密和非對稱加密)
- get/post 以及http冪等性
- http 協議頭相關、http常見的狀態碼
- TCP 與 UDP 比較
- TCP三次握手、四次揮手、擁塞控制(過程、閾值)、流量控制與滑動窗口
- TCP的time_wait和close_wait
- url 到頁面的過程
- 網絡攻擊(CSRF、XSS、DDos)
Java語言
1.基礎
- 面向對象、四個特性、重載重寫、繼承、多態、反射
- 常見關鍵字 final、static、abstract、finalize、transient、native
- StringBuffer、StringBuilder 和 String、字符常量池
- 六大設計原則、常見的設計模式(代理、工廠、單例、裝飾者、觀察者)
- 異常、常見的異常類
- 序列化
- 深拷貝和淺拷貝、值傳遞和引用傳遞
- 抽象類和接口
- 基本類型的默認值和取值範圍以及字節數
2. 多線程
- synchronized關鍵字底層原理、鎖升級原理、輕量級鎖、重量級鎖
- Lock 鎖機制、線程通信、、ThreadLocal、Atom 包、AQS、CAS 原理
- volatile關鍵字、內存屏障、happen-before原則
- 同步隊列、等待隊列、阻塞隊列
- 線程池、線程池的執行流程、線程池的主要參數(coresize、阻塞隊列、maxsize、拒絕策略)、線程池的任務遞交方式和狀態變化。
- thread類的常見方法:sleep、join、yield;sleep和wait方法的區別
- 線程的五種狀態、run方法和start方法
- 守護線程和用戶線程
3.集合框架
- hashmap(這個基本是必考題)hashcode函數、equals函數、擴容機制、put和get操作、jdk1.7和jdk1.8的變化、hashmap的尾部遍歷、紅黑樹的引入
- hashmap的線程安全問題,synchronizedMap、hashtable、concurrentHashMap
- concurrentHashMap的jdk1.7和jdk1.8的變化,底層實現線程安全的方式
- 常見的集合框架哪些是線程安全的,哪些是線程不安全的
- arraylist和linkedlist、vector
- 集合的遍歷、迭代器
4.JVM
- JVM內存模型、堆、棧、PC計算器、永久代分別存儲的內容
- GC 垃圾回收,三種GC 算法,七種GC收集器
- CMS和G1的優缺點、執行流程
- 年老代和年輕代、分代垃圾回收算法
- 四種引用類型、GCroot的可達性分析法
- 對象創建的過程、對象的內存分配
- 類加載的過程、類加載器
- 雙親委派機制、tomcat的反雙親委派機制
- JVM 調優,常見的調優參數
- 內存泄漏和內存溢出
項目+中間件
面試的第一個環節就是自我介紹,最好提前準備好腹稿,介紹的基本內容就是你的教育經歷+工作經歷+簡單的性格介紹。而工作經歷中的項目將成爲接下來面試官詢問的重點,所以最好能準備一個拿得出手的項目。
如果在面試之前已經有工作經歷和項目經歷,就需要深挖你項目的亮點:
- 開發的時候使用的技術和中間件
- 遇到的問題、如何解決問題
- 是否有優化方案,如何優化你的項目
上面這三個問題基本上是最常見也是最基本的問題,準備項目的時候,一定要把上面這些問題準備好。如果是第一次找工作,最後也是提前編寫一個項目練練手,現在比較火爆的項目就是——秒殺系統。因爲這個項目基本會用到主流的中間件(spring、Redis、消息隊列MQ、kafka)。而且我在跟面試官交流的時候,面試官對這個項目也是認可的,前提你真的深入其中。
三、知識點系統展開
爲了更清晰的展示內容,我開了一個公衆號並弄了一個十分鐘系列板塊,並花了2個多月的時間,把我之前所有複習的知識點整理成了大約40篇文章,這不是簡單的問題+解答的形式,而是較爲系統的把這個知識點的相關內容展開。相信讀者讀了這些文章之後有一個較爲深刻的的認識。(目前還在不斷整理中…)
四、面試常見問題總結
這是我複習過程思考的過程+複習過程看的面經+知識點的反問。目的是儘可能廣的涵蓋知識點,這不是面經而是一個查漏補缺的目錄。
- 設計 超過 200個 問題
- 涵蓋 超過 300個 知識點
Java語言基礎
- == 和 equals 的區別?
- 拆箱和裝箱分別是什麼?分別應用在什麼場景?
- String str=“abc” 與 String str=new String (“abc”) 一樣嗎?爲什麼?
- String str=“abc” 和 String str=new String(“abc”); 產生幾個對象? String str = new String(“hello”)+new String(“123”);產生了幾個對象?
- 字符常量池的位置?字符常量池存儲的內容?
- 給定三個變量:i1、i2、i3。Integer i1 = 120;Integer i2 = 120;int i3= 120;i1 和 i2 一樣嗎?i1 和 i3 呢?爲什麼?如果把 120 換成 130 呢,i1,12,i3 的關係又如何,爲什麼?
- throw 和 throws 的區別?
- try-catch-finally 中哪個部分可以省略?
- try-catch-finally 中,如果 catch 中 return 了,finally 還會執行嗎?
- 常見的異常類有哪些?
- java 異常的執行流程?
- 爲什麼要使用克隆?如何實現對象克隆?
- 深拷貝和淺拷貝區別是什麼?
- 值傳遞和引用傳遞的區別是什麼?
- 什麼是 java 序列化?什麼情況下需要序列化?如何避免序列化對象中的屬性序列化?
- 什麼是反射?反射的應用場景?
- 代理模式有什麼用?應用場景是什麼?
- 動態代理的實現方式都有什麼?哪種實現效率高?
- 動態代理是什麼?與靜態代理的區別在於?
- 抽象類和接口的區別?普通類和抽象類有哪些區別?
- 抽象類必須要有抽象方法嗎?抽象類能使用 final 修飾嗎?
- 局部內部類和匿名內部類爲什麼只能訪問 final 的局部變量?
- 什麼是多態?
- BIO、NIO、AIO 有什麼區別?
- 同步、異步、阻塞、非阻塞?
- java 中 IO 流分爲幾種?
- final 在 java 中有什麼作用?抽象類能使用 final 修飾嗎?
- java 中的 Math.round (-1.5) 等於多少?
- 管道的類型?
- 什麼是半雙工?什麼是全雙工?
- 在多線程下選用什麼處理大規模字符串?
- Java 中的設計原則?
- 什麼是組合?什麼是聚合?
- 說一下你熟悉的設計模式?
- 簡單工廠和抽象工廠有什麼區別?
- 裝飾者模式和適配器模式以及代理模式的區別?
- 說出幾個在 JDK 庫中使用的設計模式?
- jdk1.8新增的變化?
JVM
- 說一下 jvm 的主要組成部分?及其作用?
- jvm 運行時數據區組成?
- 堆棧的區別?
- 運行時數據區哪些是線程共享,哪些是線程私有?
- Java 中成員變量、局部變量、靜態變量、常量分別存儲在那些內存區域中?
- 說一下類加載的執行過程?
- Java 中都有哪些加載器?
- 什麼是雙親委派模型?
- 反射中,Class.forName() 和ClassLoader.loadClass()區別
- 說一下對象創建的過程?
- 對象有哪幾部分構成?虛擬機如何訪問對象?
- java 中都有哪些引用類型?
- 怎麼判斷對象是否可以被回收?
- 內存泄露和內存溢出分別是什麼?什麼原因造成?如何避免?
- 給對象分配內存如何保證線程安全?
- 說一下 jvm 有哪些垃圾回收算法?
- 說一下 jvm 有哪些垃圾回收器?
- 詳細介紹一下 CMS 垃圾回收器?
- 新生代垃圾回收器和老生代垃圾回收器都有哪些?有什麼區別?
- 簡述分代垃圾回收器是怎麼工作的?
- G1 爲什麼能建立可預測的停頓時間模型?
- Minor Gc 和 Full GC 有什麼不同呢?
- 什麼對象會進入老年代?
- 如果對象的引用被置爲null,垃圾收集器是否會立即釋放對象佔用的內存?
- 常量池都包括哪些內容?常量池的位置?
容器類集合框架
- java 容器都有哪些?
- Collection 和 Collections 有什麼區別?
- List、Set、Map 之間的區別是什麼?
- 如何決定使用 HashMap 還是 TreeMap?
- ArrayList 和 LinkedList 的區別是什麼?
- ArrayList 和 Vector 的區別是什麼?
- 說一下 HashMap 的實現原理?
- java 如何判斷 HashMap 中的元素是否相等?添加的元素是自定義類的時候,需要注意什麼?
- HashMap 爲什麼引入紅黑樹?
- JDK1.8 的 HashMap 有哪些優化?
- 請寫出HashMap的添加操作和擴容操作的代碼?
- HashMap 和 Hashtable 有什麼區別?HashMap 和 HashSet 呢?
- final 關鍵字用於什麼場景?
- ConcurrentHashMap 如何實現線程同步?
- Map 遍歷的兩種方式?
- 哪些集合類是線程安全的?
- Iterator 怎麼使用?有什麼特點?Iterator 的 fail-fast 屬性是什麼?
- Iterator 和 ListIterator 有什麼區別?
- Arrays和Collections的常用方法
- Array 和 ArrayList 有何區別?
- 在 Queue 中 poll()和 remove()有什麼區別?
- 怎麼確保一個集合不能被修改?
多線程
- 什麼是鎖消除?什麼是鎖粗化?
- 樂觀鎖有哪幾種?主要思想是什麼?
- 多線程鎖的升級原理是什麼(鎖膨脹)?
- 什麼是死鎖?如何預防死鎖?死鎖和活鎖的區別是什麼?
- 並行和併發有什麼區別?同步、異步、阻塞、非阻塞有什麼區別?同步等同於阻塞嗎?
- 線程和進程的區別?線程有哪些狀態?
- 守護線程是什麼?
- 創建線程有哪幾種方式?線程的 run () 和 start () 有什麼區別?
- ThreadLocal 是什麼?有哪些使用場景?
- sleep和wait方法有什麼區別?notify () 和 notifyAll () 有什麼區別?
- 現在有 T1、T2、T3 三個線程,你怎樣保證 T2 在 T1 執行完後執行,T3 在 T2 執行完後執行?
- volatile 有什麼用?synchronized 和 volatile 的區別是什麼?
- synchronized 和 Lock 有什麼區別?
- Lock實現鎖的底層原理?
- 說一下 atomic 的原理?
- 樂觀鎖的實現方式?
- 說一下 synchronized 底層實現原理?
- 線程池都有哪些狀態?
- 線程池中 submit () 和 execute () 方法有什麼區別?
- 創建線程池有哪幾種方式?
- 創建線程池的各個參數代表的含義?
計算機網絡
- OSI 七層模型?HTTP 協議對應第幾層?IP 協議呢?
- 從一個 URL 到獲取頁面的過程?
- session 的實現原理?cookie的原理?
- session 和 cookie 的關係?禁用 cookie 後對 session 的影響?
- forward 和 redirect 的區別?
- 內網和外網 IP 地址的區別?ABC 三類 IP 地址的劃分
- 網關和子網掩碼的關係是什麼?
- MAC 地址和 IP 地址的關係是什麼?
- 什麼是 DNS 服務器?
- IP 如何映射到 MAC 地址的?
- TCP 是如何保證可靠傳輸數據的?
- TCP 和 UDP 的區別?
- TCP 三次握手和四次揮手的過程?
- TCP 爲什麼需要三次握手?只進行兩次會出現什麼問題?
- TCP第三次握手失敗的情況 TCP 是如何處理的?
- 爲什麼連接的時候是三次握手,關閉的時候卻是四次握手?
- http1.0 與 http1.1 的區別?什麼是 keep-alive 模式?
- 簡單說一下 http2.0?
- 什麼是冪等性?http 的方法是否都符合冪等性?若不符合,怎麼避免?
- https 與 http 的區別?
- https 加密的過程?
- https 是否存在安全問題?如何避免?
- get 方法和 post 方法的區別?
- 什麼 XSS 攻擊?如何預防?
- 什麼是 CSRF 攻擊?如何預防?
- 什麼是 DDoS 攻擊?如何預防
- 什麼是 SQL 注入攻擊?如何預防?
數據庫
- 什麼是超鍵?什麼是主鍵?二者有什麼關係?
- 數據庫的三範式是什麼?
- char 和 varchar 的區別是什麼?
- delete 和 truncate 有什麼區別?誰效率更好?
- 存儲過程和函數的區別?
- 視圖的操作會對基本表產生影響嗎?
- count(*)和 count(列名)誰的效率更高?
- 索引是什麼?
- 索引的分類?索引失效條件?
- 索引優化方式?
- 怎麼驗證 mysql 的索引是否滿足需求?
- 索引的底層結構是什麼?說說各種的特點和缺點?
- 什麼是事務?
- 事務的 ACID 特性?
- 事務併發會造成的問題?
- 事務的隔離級別?
- 說一下樂觀鎖和悲觀鎖?說一下 mysql 的行鎖和表鎖?
- 事務的隔離級別和加鎖的關係?
- 兩種常見的數據庫引擎?分別具有什麼特點?
- 一張自增表裏面總共有 7 條數據,刪除了最後 2 條數據,重啓 MySQL 數據庫,又插入了一條數據,此時 id 是幾?
- 什麼是主從複製?什麼是讀寫分離?
- 數據庫從哪幾方面進行調優?
- 索引優化方向?
- mysql 問題排查都有哪些手段?怎麼驗證 mysql 的索引是否滿足需求?
操作系統
- 什麼是殭屍進程?什麼是孤兒進程?有什麼危害?
- CPU 的上下文切換有幾種?系統中斷進行了幾次上下文切換?
- 進程的通信方式?效率最高的通信方式是什麼?
- 進程調度算法有幾種?應用最廣泛的是什麼?
- 進程和線程的區別?
- 虛擬內存的作用與特性?
- 虛擬內存的實現方式?分別有何種缺陷?
- 頁面置換算法?
- 什麼是中斷?產生中斷的方式?
- 什麼是系統調用?
- 什麼會導致用戶態陷入內核態?
- 陷阱和中斷的區別?
- 互斥和同步的關係?
- 死鎖產生的條件?
- 信號量的 PV 實現?
- 生產者消費者的代碼實現?
- 如何動態查看服務器日誌文件?
- 如何打包壓縮文件?
- 修改 /test 下的 aaa.txt 的權限爲屬主有全部權限,屬主所在的組有讀寫權限, 其他用戶只有讀的權限?
- 查找 text.txt 文件中的 abc 的位置?
- 在 /home 目錄下查找以.txt 結尾的文件名?
- 普通文件 IO 頁緩存需要複製幾次?具體過程是什麼?
- 常見的 IO 模型?
- IO 多路複用的 select、poll 和 epoll 函數的區別?
寫在最後!
這些問題的答案在前面整理的公衆號文章都是能找到的,當然肯定有想直接要答案的同學,個人建議:不要直接看答案,至少看一遍我總結的40篇系統文章
能看書是最好最完善的了,
其次是看一下系統總結的文章,
下下策是直接看問題+答案,因爲這種方式只是一個很淺的瞭解,面試官稍微變化一下可能就露餡了。我也總結了答案,形成了一個PDF,csdn上傳的資源下載是需要積分的,所以我放在公衆號上,大家可以免費獲取,直接在後臺回覆:題目整合 。就可以直接獲取了,也不用轉發,也不用發朋友圈,也不用花錢,完全免費分享給大家!
不要直接看答案!
不要直接看答案!
不要直接看答案!
【Java 面試那點事】
這裏致力於分享 Java 面試路上的各種知識,無論是技術還是經驗,你需要的這裏都有!
這裏可以讓你【快速瞭解 Java 相關知識】,並且【短時間在面試方面有跨越式提升】
面試路上,你不孤單!
【PDF截圖】
【回覆截圖】