面試BAT,我建議1-3年的Java程式設計師仔細看看這篇文章
此文的目的是為了督促自己去不斷學習,讓自己有更明確的方向去提升自己。以技能樹為基礎,以面試要點為大綱,我覺得比抓住什麼看什麼要更有目的,更能堅持下去。世界瞬息萬變,我們要時刻準備著、時刻提高著自己,才能使自己更具有競爭力。
一、Java技能樹
1、基本語法
這包括static、final、transient等關鍵字的作用,foreach迴圈的原理等等。比如面試的時候面試官問你static關鍵字有哪些作用,如果你答出static修飾變數、修飾方法面試官會認為你合格,答出靜態塊,會認為你不錯,答出靜態內部類會認為你很好,答出靜態導包會對你很滿意,因為能看出你非常熱衷研究技術。
2、集合
集合要掌握的是ArrayList、LinkedList、Hashtable、HashMap、ConcurrentHashMap、HashSet的實現原理,當然能掌握CopyOnWrite容器和Queue是再好不過的了。
還需要了解ConcurrentHashMap的鎖分段技術,ConcurrentHashMap的讀是否要加鎖,為什麼,ConcurrentHashMap的迭代器是強一致性的迭代器還是弱一致性的迭代器
3、設計模式
知道常用設計模式的優缺點。
能畫出常用設計模式的UML圖。
多執行緒.png
4、多執行緒
Thread和Runnable的區別和聯絡、多次start一個執行緒會怎麼樣、執行緒有哪些狀態。
假如有Thread1、Thread2、ThreaD3、Thread4四條執行緒分別統計C、D、E、F四個盤的大小,所有執行緒都統計完畢交給Thread5執行緒去做彙總,應當如何實現?
常用的執行緒池有幾種?這幾種執行緒池之間有什麼區別和聯絡?執行緒池的實現原理是怎麼樣的?
synchronized和ReentrantLock的區別、synchronized鎖普通方法和鎖靜態方法、死鎖的原理及排查方法等等。
原始碼分析.png
5、JDK原始碼
要想拿高工資,JDK原始碼不可不讀,總結一下比較重要的原始碼:
- List、Map、Set實現類的原始碼;
- ReentrantLock、AQS的原始碼;
- AtomicInteger的實現原理,主要能說清楚CAS機制並且AtomicInteger是如何利用CAS機制實現的;
- 執行緒池的實現原理;
- Object類中的方法以及每個方法的作用。
6、資料庫
union和union all的區別、left join、幾種索引及其區別,資料庫效能的優化。
7、資料結構和演算法分析
陣列、連結串列是基礎,棧和佇列深入一些但也不難,樹挺重要的,比較重要的樹AVL樹、紅黑樹,可以不瞭解它們的具體實現,但是要知道什麼是二叉查詢樹、什麼是平衡樹,AVL樹和紅黑樹的區別。
效能優化.png
8、Java虛擬機器
- Java虛擬機器的記憶體佈局
- GC演算法及幾種垃圾收集器、
- 類載入機制,也就是雙親委派模型
- Java記憶體模型
- happens-before規則
- volatile關鍵字使用規則
9、Web方面的一些問題
- 分散式Session的幾種實現方式
- Session和Cookie的區別和聯絡以及Session的實現原理。
- get/post的區別、forward/重定向的區別、HTTPS的實現原理
- 一致性Hash演算法
二、Java面試題
1 Java 基礎
1.1 Java 基礎語法
- 面向物件的特徵
- java 中四種修飾符的限制範圍
- 過載和重寫的區別
- 抽象類和介面有什麼區別
- Java 基本資料型別
- int 和 Integer 有什麼區別
- 說說&和&&的區別
- final, finally, finalize 的區別
- Object 類中的方法
- equals 與 == 的區別
1.2 Java 常用集合
- List 和 Set 區別
- List 和 Map 區別
- Arraylist 與 LinkedList 區別
- ArrayList 與 Vector 區別
- ArrayList在迴圈過程中刪除,會不會出問題
- HashMap 和 Hashtable 的區別
- HashSet 和 HashMap 區別
- HashMap 的原始碼,實現原理
- HaspMap 擴容是怎樣的,為什麼都是2的N次冪的大小
- HashMap,HashTable,ConcurrentHashMap 的區別
1.3 Java IO 和 NIO
- 什麼是位元(Bit),什麼是位元組(Byte),什麼是字元(Char),它們長度是多少,各有什麼區別
- java 中有幾種型別的流
- 字元流和位元組流有什麼區別
- 什麼是 java 序列化,如何實現 java 序列化?
- IO 和 NIO 區別
- ByteBuffer 與 StringBuffer 有什麼區別
- 記憶體對映快取區是什麼
- 直接緩衝區與非直接緩衝器有什麼區別
- 原生的 NIO 在 JDK 1.7 版本存在 epoll bug
2 多執行緒
2.1 執行緒的基本概念
- 執行緒和程序的區別
- 建立執行緒的方式有哪幾種
- Callable 和 Future 的瞭解
- 執行緒的生命週期
- ThreadLocal 原理分析
- sleep 和 wait 的區別
- notify 和 notifyAll 的區別
- sleep() 、join()、yield()有什麼區別
2.2 執行緒池
- 為什麼使用執行緒池
- 執行緒池的幾種實現方式
- 執行緒池的實現原理
- 執行緒池的停止方法
2.3 鎖
- synchronized 關鍵字的用法,優缺點
- synchronized 與 lock 的區別
- volitile 關鍵字的作用,原理
- CAS 概念及理解
- 悲觀鎖和樂觀鎖
- 可重入鎖的用處及實現原理
3 資料庫
- 資料庫鎖、行鎖
- 事物的性質
- MySQL 索引使用的注意事項
- 資料庫索引的原理
- MySQL 資料庫的常用儲存引擎
4 演算法
- 排序演算法
- B+樹
- 紅黑樹
5 框架
- BeanFactory 和 ApplicationContext 有什麼區別
- Spring Bean 的生命週期
- Spring 的單例實現原理
- Spring IOC 如何實現
- 說說 Spring AOP
- Spring AOP 實現原理
- 動態代理(cglib 與 JDK)
- Spring 框架中用到了哪些設計模式
- MVC 設計思想
- Spring MVC 執行流程
- SpringMVC 的Controller 是如何處理引數的
6 網路
- 計算機網路的模型
- TCP,UDP 區別
- 三次握手,四次揮手,為什麼要四次揮手
- 長連線和短連線
- 連線池適合長連線還是短連線
- https 原理
PS:這是本人之前面試過程中遇到的較多的以及不太懂的問題、本人覺得比較重要的。也參考了一些網上別人的面試問題,歡迎大家補充。
看完之後覺得有收穫的同學,也可以關注一下我的公眾號:《JAVA架構進階之路》;
不定期的乾貨技術分享,帶你重新領