馬上到今年的金三銀四了,又是跳槽的好季節,準備跳槽的同學都摩拳擦掌準備大面好幾場,今天爲大家準備了互聯網面試必備的1到5年Java面試者都需要掌握的面試題,分別JVM,併發編程,MySQL,Tomcat,網絡與IO及Spring系列等等,可以說掌握這些薪資漲10K還是可以的!
今天分享給大家的都是目前主流企業使用最高頻的面試題庫,也都是 Java 版本升級之後,重新整理歸納的最新答案,會讓面試者少走很多不必要的彎路。同時每個專題都做到了詳盡的面試解析文檔,以確保每個階段的讀者都能看得懂。
每個知識點都有左側導航書籤頁,看的時候十分方便,由於內容較多,這裏就截取一部分圖吧。需要的讀者朋友們可以幫忙三連支持一下,點擊傳送門(這裏)即可入手~
一、Java基礎
- 什麼是 Java 程序的主類?應用程序和小程序的主類有何不同?
- 構造器 Constructor 是否可被 override?
- String StringBuffer 和 StringBuilder 的區別是什麼?String 爲什麼是不可變的?
- 對象的相等與指向他們的引用相等,兩者有什麼不同?
- 重載和重寫的區別?
- 在一個靜態方法內調用一個非靜態成員爲什麼是非法的?
- 簡述線程,程序、進程的基本概念。以及他們之間關係是什麼
- 什麼是方法的返回值?返回值在類的方法裏的作用是什麼?
- 一個類的構造方法的作用是什麼 若一個類沒有聲明構造方法,該程序能正確執行嗎 ?爲什麼?
- Java 面向對象編程三大特性: 封裝 繼承 多態
- Java 序列化中如果有些字段不想進行序列化 怎麼辦?
- 在調用子類構造方法之前會先調用父類沒有參數的構造方法,其目的是?
- 線程有哪些基本狀態?
- 創建一個對象用什麼運算符?對象實體與對象引用有何不同?
- 成員變量與局部變量的區別有哪些?
每個知識點都有左側導航書籤頁,看的時候十分方便,由於內容較多,這裏就截取一部分圖吧。需要的讀者朋友們可以幫忙三連支持一下,點擊傳送門(這裏)即可入手~
二、Java中級
- Spring的AOP和IOC是什麼?使用場景有哪些?Spring事務,事務的屬性,數據庫隔離級別
- Spring和SpringMVC,MyBatis以及SpringBoot的註解分別有哪些?
- SpringCould組件有哪些,它們的作用是什麼?微服務的CAP是什麼?BASE是什麼?
- HashMap底層實現原理,紅黑樹,B+樹,B樹的結構原理,CAS(比較與交換)實現原理
- Redis支持的數據類型以及使用場景,持久化,哨兵機制,緩存擊穿,緩存穿透
- 線程是什麼,有幾種實現方式,它們之間的區別是什麼,線程池實現原理,JUC併發包
- 安全性問題(數據篡改(拿到別人的URL,篡改數據(金額)發送給系統))
- 索引使用的限制條件,sql優化有哪些,數據同步問題(緩存,數據庫數據同步)
- 分佈式事務
- 堆溢出,棧溢出的出現場景以及解決方案
- 悲觀鎖,樂觀鎖,讀寫鎖,行鎖,表鎖,自旋鎖,死鎖,分佈式鎖,線程同步鎖,公平鎖,非公平鎖分別是什麼?
- 初始化Bean對象有幾個步驟,它的生命週期
- JVM內存模型,算法,垃圾回收器,調優,類加載機制(雙親委派),創建一個對象,這個對象在內存中是怎麼分配的?
- Dubbo的運行原理,與SpringCould相比它爲什麼效率要高一些,Zookeeper底層原理
- 說出幾種MQ之間的區別,以及爲什麼使用這種MQ,消息重複發送(冪等性),消息發送失敗,消息掉包,長時間收不到消息,發送的消息太大造成接收不成功
三、Java高級
- 爲什麼使用消息隊列?消息隊列有什麼優點和缺點?Kafka、ActiveMQ、RabbitMQ、RocketMQ 都有什麼優點和缺點?
- 如何保證消息不被重複消費?或者說,如何保證消息消費的冪等性?
- 如何解決消息隊列的延時以及過期失效問題?消息隊列滿了以後該怎麼處理?有幾百萬消息持續積壓幾小時,說說怎麼解決?
- redis 集羣模式的工作原理能說一下麼?在集羣模式下,redis 的 key 是如何尋址的?分佈式尋址都有哪些算法?瞭解一致性 hash 算法嗎?
- 瞭解什麼是 redis 的雪崩、穿透和擊穿?redis 崩潰之後會怎麼樣?系統該如何應對這種情況?如何處理 redis 的穿透?
- 爲什麼要分庫分表(設計高併發系統的時候,數據庫層面該如何設計)?用過哪些分庫分表中間件?不同的分庫分表中間件都有什麼優點和缺點?你們具體是如何對數據庫如何進行垂直拆分或水平拆分的?
- 有沒有做 MySQL 讀寫分離?如何實現 MySQL 的讀寫分離?MySQL 主從複製原理的是啥?如何解決MySQL 主從同步的延時問題?
- 說一下的 dubbo 的工作原理?註冊中心掛了可以繼續通信嗎?說說一次 rpc 請求的流程?
- 如何基於 dubbo 進行服務治理、服務降級、失敗重試以及超時重試?
- 集羣部署時的分佈式 session 如何實現?
- 服務註冊和發現是什麼意思?Spring Cloud 如何實現?
- 一般實現分佈式鎖都有哪些方式?使用 redis 如何設計分
- 布式鎖?使用 zk 來設計分佈式鎖可以嗎?這兩種分佈式鎖的實現方式哪種效率比較高?
- dubbo 的 spi 思想是什麼?
- 如何設計可以動態擴容縮容的分庫分表方案?
四、分佈式
- ActiveMQ 中的消息重發時間間隔和重發次數嗎?
- Kafka 創建 Topic 時如何將分區放置到不同的 Broker 中
- Kafka 判斷一個節點是否還活着有哪兩個條件?
- Kafka 消息是採用 Pull 模式,還是 Push 模式?
- memcached 和服務器的 local cache(比如 PHP 的 APC、mmap 文件等)相比,有什麼優缺點?
- 我需要把 memcached 中的 item 批量導出導入,怎麼辦?
- memcached 的多線程是什麼?如何使用它們?
- MongoDB 在 A:{B,C}上建立索引,查詢 A:{B,C}和 A:{C,B}都會使用索引嗎?
- MongoDB 支持存儲過程嗎?如果支持的話,怎麼用?
- 如何理解 MongoDB 中的 GridFS 機制,MongoDB 爲何使用 GridFS 來存儲文件?
- 在 Nginx 中,如何使用未定義的服務器名稱來阻止處理請求?
- RabbitMQ 上的一個 queue 中存放的 message 是否有數量限制?
- 若 cluster 中擁有某個 queue 的 owner node 失效了,且該 queue 被聲明具有durable 屬性,是否能夠成功從其他 node 上重新聲明該 queue ?
- 爲什麼說保證 message 被可靠持久化的條件是 queue 和 exchange 具有durable 屬性,同時 message 具有 persistent 屬性纔行?
- 爲什麼用緩存,用過哪些緩存,redis和memcache的區別?
五、Spring架構
- Spring Boot、Spring MVC 和 Spring 有什麼區別?
- BeanFactory 和 ApplicationContext 有什麼區別?
- 什麼是基於Java的Spring註解配置? 給一些註解的例子.
- 請解釋 Spring Bean 的生命週期?
- Spring 框架中的單例 Beans 是線程安全的麼?
- SpringMvc 的控制器是不是單例模式,如果是,有什麼問題,怎麼解決?
- SpringMVC 怎麼樣設定重定向和轉發的?
- 當一個方法向 AJAX 返回特殊對象,比如 Object,List 等,需要做什麼處理?
- SpringMvc 用什麼對象從後臺向前臺傳遞數據的?
- 服務註冊和發現是什麼意思?Spring Cloud 如何實現?
- 使用 Spring Cloud 有什麼優勢?
- 什麼是 Hystrix 斷路器?我們需要它嗎?
- 什麼是 Spring Cloud Bus?我們需要它嗎?
- 如何實現 Spring Boot 應用程序的安全性?
- Spring Boot 配置的默認 H2 數據庫的名字是上面?爲什麼默認的數據庫名字是 testdb?
六、線程問題
- stop() 和 suspend() 方法爲何不推薦使用?
- 同步和異步有何異同,在什麼情況下分別使用它們?
- 線程間通信,wait和notify
- 什麼是線程餓死,什麼是活鎖?
- atomicinteger和volatile等線程安全操作的關鍵字的理解和使用
- volatile 變量是什麼?volatile 變量和 atomic 變量有什麼不同?
- 當一個線程進入一個對象的一個 synchronized 方法後,其它線程是否可進入此對象的其它方法?
- 簡述 synchronized 和 java.util.concurrent.locks.Lock 的異同?
- 多線程之間通信的同步問題,synchronized鎖的是對象,衍伸出和synchronized相關很多的具體問題,例如同一個類不同方法都有synchronized鎖,一個對象是否可以同時訪問。或者一個類的static構造方法加上synchronized之後的鎖的影響。
- volatile 類型變量提供什麼保證?能使得一個非原子操作變成原子操作嗎?
- 瞭解可重入鎖的含義,以及ReentrantLock 和synchronized的區別
- Java創建線程之後,直接調用start()方法和run()的區別
- 同步的數據結構,例如concurrentHashMap的源碼理解以及內部實現原理,爲什麼它是同步的且效率高
- 常用的線程池模式以及不同線程池的使用場景
- newFixedThreadPool此種線程池如果線程數達到最大值後會怎麼辦,底層原理。
七、網絡方面
- 爲什麼要三次握手
- 二次握手有什麼問題
- 三次握手有哪些缺陷
- TCP是如何控制流量的
- 發送方發送頻率過高造成丟包,TCP是如何解決的
- HTTPs爲什麼要用對稱加密+非對稱加密,相對於只使用非對稱加密有什麼好處
- 講一下OSI網絡架構
- HTTP在哪一層
- HTTP報文結構
- HTTP首部字段
- HTTPs加密在哪一層實現
- http是無狀態通信,http的請求方式有哪些,可以自己定義新的請求方式麼。
- socket通信,以及長連接,分包,連接異常斷開的處理。
- socket通信模型的使用,AIO和NIO。
- socket框架netty的使用,以及NIO的實現原理,爲什麼是異步非阻塞
八、MySQL數據庫
- 務四大特性(ACID)原子性、一致性、隔離性、持久性?
- 查詢語句不同元素(where、jion、limit、group by、having等等)執行先後順序?
- MySQL常見的三種存儲引擎(InnoDB、MyISAM、MEMORY)的區別?
- MySQL的MyISAM與InnoDB兩種存儲引擎在,事務、鎖級別,各自的適用場景?
- mysql 高併發環境解決方案?
- 事務的併發?事務隔離級別,每個級別會引發什麼問題,MySQL默認是哪個級別?
- MySQL B+Tree索引和Hash索引的區別?
- 有哪些鎖(樂觀鎖悲觀鎖),select 時怎麼加排它鎖?
- sql查詢語句確定創建哪種類型的索引?如何優化查詢?
- 聚集索引和非聚集索引區別?
- mysql都有什麼鎖,死鎖判定原理和具體場景,死鎖怎麼解決?
- 非關係型數據庫和關係型數據庫區別,優勢比較?
- MySQL慢查詢怎麼解決?
- 數據庫的讀寫分離、主從複製,主從複製分析的 7 個問題?
- 數據庫崩潰時事務的恢復機制(REDO日誌和UNDO日誌)?
九、Redis緩存
- redis事務相關命令有哪些?
- 爲什麼要用 redis /爲什麼要用緩存(高性能、高併發)
- 爲什麼要用 redis 而不用 map/guava 做緩存?
- redis 和 memcached 的區別
- 請介紹一下Redis的數據類型SortedSet(zset)以及底層實現機制?
- redis 常見數據結構以及使用場景分析(String、Hash、List、Set、Sorted Set)
- redis 設置過期時間
- redis 內存淘汰機制(MySQL裏有2000w數據,Redis中只存20w的數據,如何保證Redis中的數據都是熱點數據?)
- redis 持久化機制(怎麼保證 redis 掛掉之後再重啓數據可以進行恢復)
- redis 事務
- Redis 常見異常及解決方案(緩存穿透、緩存雪崩、緩存預熱、緩存降級)
- 分佈式環境下常見的應用場景(分佈式鎖、分佈式自增 ID)
- Redis 集羣模式(主從模式、哨兵模式、Cluster 集羣模式)
- 如何解決 Redis 的併發競爭 Key 問題
- 如何保證緩存與數據庫雙寫時的數據一致性?
十、JVM相關
- 如何判斷一個對象是否存活?(或者 GC 對象的判定方法)
- java 中垃圾收集的方法有哪些?
- 簡述 java 垃圾回收機制?
- GC 的兩種判定方法?
- Minor GC 與 Full GC 分別在什麼時候發生?
- JVM 內存分哪幾個區,每個區的作用是什麼?
- GC 收集器有哪些?CMS 收集器與 G1 收集器的特點
- GC 的三種收集方法:標記清除、標記整理、複製算法的原理與特點,分別用在什麼地方,如果讓你優化收集方法,有什麼思路?
- 類加載器雙親委派模型機制?
- java 類加載過程?
- 簡述 java 類加載機制?
- 什麼是類加載器,類加載器有哪些?
- 簡述 java 內存分配與回收策略以及 Minor GC 和Major GC
- HotSpot 虛擬機對象探祕
- HotSpot 垃圾收集器
十一、調優方面
- 垃圾回收器的基本原理是什麼?垃圾回收器可以馬上回收內存嗎?有什麼辦法主動通知虛擬機進行垃圾回收?
- Java 中會存在內存泄漏嗎,請簡單描述。
- 如果對象的引用被置爲 null,垃圾收集器是否會立即釋放對象佔用的內存?
- finalize() 方法什麼時候被調用?析構函數 (finalization) 的目的是什麼?
- 串行(serial)收集器和吞吐量(throughput)收集器的區別是什麼?
- 什麼是分佈式垃圾回收(DGC)?它是如何工作的?
- 你怎樣給 tomcat 去調優?
- Tomcat 的優化經驗
- 在 Java 中,對象什麼時候可以被垃圾回收?
- System.gc() 和 Runtime.gc() 會做什麼事情?
- Java 中會存在內存泄漏嗎,請簡單描述
- GC 是什麼? 爲什麼要有 GC?
- JVM 的永久代中會發生垃圾回收麼?
- tomcat 有哪幾種 Connector 運行模式(優化)?
- 內存調優
十二、設計模式
- 21種設計模式知識要點
- 請列舉出在 JDK 中幾個常用的設計模式?
- 什麼是設計模式?你是否在你的代碼裏面使用過任何設計模式?
- 在 Java 中,什麼叫觀察者設計模式(observer design pattern)?
- 使用工廠模式最主要的好處是什麼?在哪裏使用?
- 在 Java 中,什麼時候用重載,什麼時候用重寫?
- 在 Java 中,爲什麼不允許從靜態方法中訪問非靜態變量?
- 設計一個 ATM 機,請說出你的設計思路?
- 舉一個用 Java 實現的裝飾模式(decorator design pattern)?它是作用於對象層次還是類層次
- 舉例說明什麼情況下會更傾向於使用抽象類而不是接口?
十三、算法&數據結構
- 如何僅用遞歸函數和棧操作逆序一個棧?
- 將單向鏈表按某值劃分成左邊小、中間相等、右邊大的形式
- 分別用遞歸和非遞歸方式實現二叉樹先序、中序和後序遍歷
- 斐波拉契系列問題的遞歸和動態規劃
- 判斷字符數組中是否有的字符都只出現過一次
- 在有序但含有空的數組中查找字符串
- 只用2GB內存在20億個整數中找到出現次數最多的數
- 未排序數組中累加和小於或等於給定值的最長子數組長度
- 從5隨機到7隨機及其擴展
- 最大值減去最小值小於或等於num的子數組數量
- 環形單鏈表的約瑟夫問題
- 將單鏈表的每K個節點之間逆序
- 在二叉樹中找到累加和爲指定值的最長路徑長度
- 判斷一棵二叉樹是否爲搜索二叉樹和完全二叉樹
- 最長公共子序列問題
十四、併發
- 什麼是可重入性 , 爲什麼說Synchronized是可重入鎖?
- 爲什麼說Synchronized是一個悲觀鎖?樂觀鎖的實現原理又是什麼?什麼是CAS,它有 什麼特性?
- 樂觀鎖一定就是好的嗎?
- JVM對Java的原生鎖做了哪些優化?
- ReentrantLock 是如何實現可重入性的?
- 跟 Synchronized 相 比 ,可重入鎖ReentrantLock其實現原理有什麼不同?
- 如何讓Java的線程彼此同步?你瞭解過哪些同步器?請分別介紹下 。
- CyclicBarrier 和 CountDownLatch 看起來很相似,請對比下呢?
- 線程池中的線程是怎麼創建的?是一開始就隨着線程池的啓動創建好的嗎?
- 既然提到可以通過配置不同參數創建出不同的線程池,那麼Java中默認實現好的線程池又 有哪些呢?請比較它們的異同
- 請談談volatile有什麼特點,爲什麼它能保證變量對所有線程的可見性?
- 什麼是Java的內存模型,Java中各個線程是怎麼彼此看到對方的變量的?
- 既然volatile能夠保證線程間的變量可見性,是不是就意味着基於volatile變量的運算就是並 發安全的 ?
- 很多人都說要慎用ThreadLocal,談談你的理解,使用ThreadLocal需要注意些什麼?
- 請談談AQS框架是怎麼回事兒?
十五、操作系統/Linux
- 死鎖產生的原因
- 進程、線程區別,什麼時候用線程
- 如何實現一個線程池,Java中線程池如何進行配置
- linux中有哪些常見的指令,進行介紹
- select、poll、epoll有沒有了解過,講解一下
- 線程切換,引申到Java阻塞➡️運行
- 如何分層複製/home目錄到另一個目錄?
- 什麼是安裝Linux所需的最小分區數量,以及如何查看系統啓動信息?
- 如何暫停一個正在運行的進程,把其放在後臺(不運行)?
- 什麼是頁面錯誤,它是怎麼發生的?
最後
對於這些問題我都整理了答案,記錄在這個Java學習筆記裏,這份筆記包括了Spring,JVM,java基礎,Java集合,Java併發編程,微服務,網絡,Kafka,分佈式,Redis,大廠面試解決方案,分佈式事務,設計模式,算法,數據結構,MySQL等
詳細內容有很多,爲了不影響閱讀,可看整理的《Java架構進階筆記》,每個知識點都有左側導航書籤頁,看的時候十分方便,由於內容較多,這裏就截取一部分圖吧。需要的讀者朋友們可以幫忙三連支持一下,點擊傳送門(這裏)即可入手~