在過 2 個月即將進入金九銀十了,然而面對今年的大環境而言,跳槽成功的難度比往年高了很多,很明顯的感受就是:對于今年的 java 開發朋友跳槽面試,無論一面還是二面,都開始考驗一個 Java 程序員的技術功底和基礎。對源碼解讀和核心原理理解也是成了加分項,特別是對 Java 的一些核心基礎知識點掌握的不夠或者沒有體系方向的朋友面試也成了一個苦惱的事情。
今天在這分享目前國內公司 Java 面試常問的問題包括?JVM、常用的算法和數據結構,redis?緩存,分布式,Spring,微服務,多線程面試題庫,Tcp 面試題庫,架構設計與分布式面試題庫,消息隊列面試題庫,緩存面試題庫等。正所謂知己知彼,只有體系知識鞏固,面對不斷更新的技術才能快速掌握,同時在面試、工作中也更能脫穎而出!
JAVA 基礎
- JAVA 中的幾種基本數據類型是什么,各自占用多少字節。
- String 類能被繼承嗎,為什么。
- String,Stringbuffer,StringBuilder 的區別。
- ArrayList 和 LinkedList 有什么區別。
- 講講類的實例化順序,比如父類靜態數據,構造函數,字段,子類靜態數據,構造函數,字段,當 new 的時候,他們的執行順序。
- 用過哪些 Map 類,都有什么區別,HashMap 是線程安全的嗎,并發下使用的 Map 是什么,他們內部原理分別是什么,比如存儲方式,hashcode,擴容,默認容量等。
- JAVA8 的 ConcurrentHashMap 為什么放棄了分段鎖,有什么問題嗎,如果你來設計,你如何設計。
- 有沒有有順序的 Map 實現類,如果有,他們是怎么保證有序的。
- 抽象類和接口的區別,類可以繼承多個類么,接口可以繼承多個接口么,類可以實現多個接口么。
- 繼承和聚合的區別在哪。
- IO 模型有哪些,講講你理解的?nio?,他和 bio,aio 的區別是啥,談談?reactor 模型。
- 反射的原理,反射創建類實例的三種方式是什么。
- 反射中,Class.forName 和 ClassLoader 區別 。
- 描述動態代理的幾種實現方式,分別說出相應的優缺點。
- 動態代理與 cglib 實現的區別。
- 為什么 CGlib 方式可以對接口實現代理。
- final 的用途。
- 寫出三種單例模式實現 。
- 如何在父類中為子類自動完成所有的 hashcode 和 equals 實現?這么做有何優劣。
- 請結合 OO 設計理念,談談訪問修飾符 public、private、protected、default 在應用設計中的作用。
- 深拷貝和淺拷貝區別。
- 數組和鏈表數據結構描述,各自的時間復雜度。
- error 和 exception 的區別,CheckedException,RuntimeException 的區別。
- 請列出 5 個運行時異常。
- 在自己的代碼中,如果創建一個 java.lang.String 類,這個類是否可以被類加載器加載?為什么。
- 說一說你對 java.lang.Object 對象中 hashCode 和 equals 方法的理解。在什么場景下需
- 要重新實現這兩個方法。
- 在 jdk1.5 中,引入了泛型,泛型的存在是用來解決什么問題。
- 這樣的 a.hashcode() 有什么用,與 a.equals(b)有什么關系。
- 有沒有可能 2 個不相等的對象有相同的 hashcode。
- Java 中的 HashSet 內部是如何工作的。
- 什么是序列化,怎么序列化,為什么序列化,反序列化會遇到什么問題,如何解決。
- java8 的新特性。
JVM 知識
- 什么情況下會發生棧內存溢出。
- JVM 的內存結構,Eden 和 Survivor 比例。
- JVM 內存為什么要分成新生代,老年代,持久代。新生代中為什么要分為 Eden 和 Survivor。
- JVM 中一次完整的 GC 流程是怎樣的,對象如何晉升到老年代,說說你知道的幾種主要的 JVM 參
- 數。
- 你知道哪幾種垃圾收集器,各自的優缺點,重點講下 cms 和 G1,包括原理,流程,優缺點。
- 垃圾回收算法的實現原理。
- 當出現了內存溢出,你怎么排錯。
- JVM 內存模型的相關知識了解多少,比如重排序,內存屏障,happen-before,主內存,工作
- 內存等。
- 簡單說說你了解的類加載器,可以打破雙親委派么,怎么打破。
- 講講 JAVA 的反射機制。
- 你們線上應用的 JVM 參數有哪些。
- g1 和 cms 區別,吞吐量優先和響應優先的垃圾收集器選擇。
- 怎么打出線程棧信息。
- 請解釋如下 jvm 參數的含義:
- -server -Xms512m -Xmx512m -Xss1024K
- -XX:PermSize=256m -XX:MaxPermSize=512m -
- XX:MaxTenuringThreshold=20XX:CMSInitiatingOccupancyFraction=80 -
- XX:+UseCMSInitiatingOccupancyOnly。
開源框架知識
- 簡單講講 tomcat 結構,以及其類加載器流程,線程模型等。
- tomcat 如何調優,涉及哪些參數 。
- 講講 Spring 加載流程。
- Spring AOP 的實現原理。
- 講講 Spring 事務的傳播屬性。
- Spring 如何管理事務的。
- Spring 怎么配置事務(具體說出一些關鍵的 xml 元素)。
- 說說你對 Spring 的理解,非單例注入的原理?它的生命周期?循環注入的原理,aop 的實現原
- 理,說說 aop 中的幾個術語,它們是怎么相互工作的。
- Springmvc 中 DispatcherServlet 初始化過程。
- netty 的線程模型,netty 如何基于 reactor 模型上實現的。
- 為什么選擇 netty。
- 什么是 TCP 粘包,拆包。解決方式是什么。
- netty 的 fashwheeltimer 的用法,實現原理,是否出現過調用不夠準時,怎么解決。
- netty 的心跳處理在弱網下怎么辦。
- netty 的通訊協議是什么樣的。
- springmvc 用到的注解,作用是什么,原理。
- springboot 啟動機制。
- 點擊這里有一套答案版的 Spring 試題。
操作系統
- Linux 系統下你關注過哪些內核參數,說說你知道的。
- Linux 下 IO 模型有幾種,各自的含義是什么。
- epoll 和 poll 有什么區別。
- 平時用到哪些 Linux 命令。
- 用一行命令查看文件的最后五行。
- 用一行命令輸出正在運行的 java 進程。
- 介紹下你理解的操作系統中線程切換過程。
- 進程和線程的區別。
- top 命令之后有哪些內容,有什么作用。
- 線上 CPU 爆高,請問你如何找到問題所在。
多線程
- 多線程的幾種實現方式,什么是線程安全。
- volatile 的原理,作用,能代替鎖么。
- 畫一個線程的生命周期狀態圖。
- sleep 和 wait 的區別。
- sleep 和 sleep(0)的區別。
- Lock 與 Synchronized 的區別 。
- synchronized 的原理是什么,一般用在什么地方(比如加在靜態方法和非靜態方法的區別,靜
- 態方法和非靜態方法同時執行的時候會有影響嗎),解釋以下名詞:重排序,自旋鎖,偏向鎖,輕
- 量級鎖,可重入鎖,公平鎖,非公平鎖,樂觀鎖,悲觀鎖。
- 用過哪些原子類,他們的原理是什么。
- JUC 下研究過哪些并發工具,講講原理。
- 用過線程池嗎,如果用過,請說明原理,并說說 newCache 和 newFixed 有什么區別,構造函
- 數的各個參數的含義是什么,比如 coreSize,maxsize 等。
- 線程池的關閉方式有幾種,各自的區別是什么。
- 假如有一個第三方接口,有很多個線程去調用獲取數據,現在規定每秒鐘最多有 10 個線程同
- 時調用它,如何做到。
- spring 的 controller 是單例還是多例,怎么保證并發的安全。
- 用三個線程按順序循環打印 abc 三個字母,比如 abcabcabc。
- ThreadLocal 用過么,用途是什么,原理是什么,用的時候要注意什么。
- 如果讓你實現一個并發安全的鏈表,你會怎么做。
- 有哪些無鎖數據結構,他們實現的原理是什么。
- 講講 java 同步機制的 wait 和 notify。
- CAS 機制是什么,如何解決 ABA 問題。
- 多線程如果線程掛住了怎么辦。
- countdowlatch 和 cyclicbarrier 的內部原理和用法,以及相互之間的差別(比如
- countdownlatch 的 await 方法和是怎么實現的)。
- 對 AbstractQueuedSynchronizer 了解多少,講講加鎖和解鎖的流程,獨占鎖和公平所
- 加鎖有什么不同。
- 使用 synchronized 修飾靜態方法和非靜態方法有什么區別。
- 簡述 ConcurrentLinkedQueue 和 LinkedBlockingQueue 的用處和不同之處。
- 導致線程死鎖的原因?怎么解除線程死鎖。
- 非常多個線程(可能是不同機器),相互之間需要等待協調,才能完成某種工作,問怎么設計這種協調方案。
- 用過讀寫鎖嗎,原理是什么,一般在什么場景下用。
- 開啟多個線程,如果保證順序執行,有哪幾種實現方式,或者如何保證多個線程都執行完
- 再拿到結果。
- 延遲隊列的實現方式,delayQueue 和時間輪算法的異同。
- 點擊這里有一套答案版的多線程試題。
TCP 與 HTTP
- http1.0 和 http1.1 有什么區別。
- TCP 三次握手和四次揮手的流程,為什么斷開連接要 4 次,如果握手只有兩次,會出現什么。
- TIME_WAIT 和 CLOSE_WAIT 的區別。
- 說說你知道的幾種 HTTP 響應碼,比如 200, 302, 404。
- 當你用瀏覽器打開一個鏈接(如:http://www.javastack.cn)的時候,計算機做了哪些工作步驟。
- TCP/IP 如何保證可靠性,說說 TCP 頭的結構。
- 如何避免瀏覽器緩存。
- 如何理解 HTTP 協議的無狀態性。
- 簡述 Http 請求 get 和 post 的區別以及數據包格式。
- HTTP 有哪些 method
- 簡述 HTTP 請求的報文格式。
- HTTP 的長連接是什么意思。
- HTTPS 的加密方式是什么,講講整個加密解密流程。
- Http 和 https 的三次握手有什么區別。
- 什么是分塊傳送。
- Session 和 cookie 的區別。
- 點擊這里有一套答案版的試題。
架構設計與分布式
- 用 java 自己實現一個 LRU。
- 分布式集群下如何做到唯一序列號。
- 設計一個秒殺系統,30 分鐘沒付款就自動關閉交易。
- 如何使用 redis 和 zookeeper 實現分布式鎖?有什么區別優缺點,會有什么問題,分別適用什么
- 場景。(延伸:如果知道 redlock,講講他的算法實現,爭議在哪里)
- 如果有人惡意創建非法連接,怎么解決。
- 分布式事務的原理,優缺點,如何使用分布式事務,2pc 3pc 的區別,解決了哪些問題,還有
- 哪些問題沒解決,如何解決,你自己項目里涉及到分布式事務是怎么處理的。
- 什么是一致性 hash。
- 什么是 restful,講講你理解的 restful。
- 如何設計一個良好的 API。
- 如何設計建立和保持 100w 的長連接。
- 解釋什么是 MESI 協議(緩存一致性)。
- 說說你知道的幾種 HASH 算法,簡單的也可以。
- 什么是?paxos 算法, 什么是?zab 協議。
- 一個在線文檔系統,文檔可以被編輯,如何防止多人同時對同
- 一份文檔進行編輯更新。
- 線上系統突然變得異常緩慢,你如何查找問題。
- 說說你平時用到的設計模式。
- Dubbo 的原理,有看過源碼么,數據怎么流轉的,怎么實現集群,負載均衡,服務注冊
- 和發現,重試轉發,快速失敗的策略是怎樣的 。
- 一次 RPC 請求的流程是什么。
- 自己實現過 rpc 么,原理可以簡單講講。Rpc 要解決什么問題。
- 異步模式的用途和意義。
- 編程中自己都怎么考慮一些設計原則的,比如開閉原則,以及在工作中的應用。
- 設計一個社交網站中的“私信”功能,要求高并發、可擴展等等。 畫一下架構圖。
- MVC 模式,即常見的 MVC 框架。
- 聊下曾經參與設計的服務器架構并畫圖,談談遇到的問題,怎么解決的。
- 應用服務器怎么監控性能,各種方式的區別。
- 如何設計一套高并發支付方案,架構如何設計。
- 如何實現負載均衡,有哪些算法可以實現。
- Zookeeper 的用途,選舉的原理是什么。
- Zookeeper watch 機制原理。
- Mybatis 的底層實現原理。
- 請思考一個方案,實現分布式環境下的 countDownLatch。
- 后臺系統怎么防止請求重復提交。
- 描述一個服務從發布到被消費的詳細過程。
- 講講你理解的服務治理。
- 如何做到接口的冪等性。
- 如何做限流策略,令牌桶和漏斗算法的使用場景。
- 什么叫數據一致性,你怎么理解數據一致性。
- 分布式服務調用方,不依賴服務提供方的話,怎么處理服務方掛掉后,大量無效資源請求
- 的浪費,如果只是服務提供方吞吐不高的時候該怎么做,如果服務掛了,那么一會重啟,該怎
- 么做到最小的資源浪費,流量半開的實現機制是什么。
- dubbo?的泛化調用怎么實現的,如果是你,你會怎么做。
- 遠程調用會有超時現象,如果做到優雅的控制,JDK 自帶的超時機制有哪些,怎么實現的。
算法
- 10 億個數字里里面找最小的 10 個。
- 有 1 億個數字,其中有 2 個是重復的,快速找到它,時間和空間要最優。
- 2 億個隨機生成的無序整數,找出中間大小的值。
- 給一個不知道長度的(可能很大)輸入字符串,設計一種方案,將重復的字符排重。
- 遍歷二叉樹。
- 有 3n+1 個數字,其中 3n 個中是重復的,只有 1 個是不重復的,怎么找出來。
- 寫一個字符串(如:http://www.javastack.cn)反轉函數。
- 常用的排序算法,快排,歸并、冒泡。 快排的最優時間復雜度,最差復雜度。冒泡排序的
- 優化方案。
- 二分查找的時間復雜度,優勢。
- 一個已經構建好的 TreeSet,怎么完成倒排序。
- 什么是 B+樹,B-樹,列出實際的使用場景。
- 一個單向鏈表,刪除倒數第 N 個數據。
- 200 個有序的數組,每個數組里面 100 個元素,找出 top20 的元素。
- 單向鏈表,查找中間的那個元素。
數據庫知識
- 數據庫隔離級別有哪些,各自的含義是什么,MYSQL 默認的隔離級別是是什么。
- 什么是幻讀。
- MYSQL 有哪些存儲引擎,各自優缺點。
- 高并發下,如何做到安全的修改同一行數據。
- 樂觀鎖和悲觀鎖是什么,INNODB 的標準行級鎖有哪 2 種,解釋其含義。
- SQL 優化的一般步驟是什么,怎么看執行計劃,如何理解其中各個字段的含義。
- 數據庫會死鎖嗎,舉一個死鎖的例子,mysql 怎么解決死鎖。
- MYsql 的索引原理,索引的類型有哪些,如何創建合理的索引,索引如何優化。
- 聚集索引和非聚集索引的區別。
- select for update 是什么含義,會鎖表還是鎖行或是其他。
- 為什么要用 Btree 實現,它是怎么分裂的,什么時候分裂,為什么是平衡的。
- 數據庫的 ACID 是什么。
- 某個表有近千萬數據,CRUD 比較慢,如何優化。
- Mysql 怎么優化 table scan 的。
- 如何寫 sql 能夠有效的使用到復合索引。
- mysql 中 in 和 exists 區別。
- 數據庫自增主鍵可能的問題。
- MVCC 的含義,如何實現的。
- 你做過的項目里遇到分庫分表了嗎,怎么做的,有用到中間件么,比如 sharding jdbc 等,他
- 們的原理知道么。
- MYSQL 的主從延遲怎么解決。
消息隊列
- 消息隊列的使用場景。
- 消息的重發,補充策略。
- 如何保證消息的有序性。
- 用過哪些 MQ,和其他 mq 比較有什么優缺點,MQ 的連接是線程安全的嗎,你們公司的 MQ 服務
- 架構怎樣的。
- MQ 系統的數據如何保證不丟失。
- rabbitmq 如何實現集群高可用。
- kafka 吞吐量高的原因。
- kafka 和其他消息隊列的區別,kafka 主從同步怎么實現。
- 利用 mq 怎么實現最終一致性。
- 使用 kafka 有沒有遇到什么問題,怎么解決的。
- MQ 有可能發生重復消費,如何避免,如何做到冪等。
- MQ 的消息延遲了怎么處理,消息可以設置過期時間么,過期了你們一般怎么處理。
緩存
- 常見的緩存策略有哪些,如何做到緩存(比如 redis)與 DB 里的數據一致性,你們項目中用到了
- 什么緩存系統,如何設計的。
- 如何防止緩存擊穿和雪崩。
- 緩存數據過期后的更新如何設計。
- redis 的 list 結構相關的操作。
- Redis 的數據結構都有哪些。
- Redis 的使用要注意什么,講講持久化方式,內存設置,集群的應用和優劣勢,淘汰策略等。
- redis2 和 redis3 的區別,redis3 內部通訊機制。
- 當前 redis 集群有哪些玩法,各自優缺點,場景。
- Memcache 的原理,哪些數據適合放在緩存中。
- redis 和 memcached 的內存管理的區別。
- Redis 的并發競爭問題如何解決,了解 Redis 事務的 CAS 操作嗎。
- Redis 的選舉算法和流程是怎樣的。
- redis 的持久化的機制,aof 和 rdb 的區別。
- redis 的集群怎么同步的數據的。
- 知道哪些 redis 的優化操作。
- Reids 的主從復制機制原理。
- Redis 的線程模型是什么。
- 請思考一個方案,設計一個可以控制緩存總體大小的自動適應的本地緩存。
- 如何看待緩存的使用(本地緩存,集中式緩存),簡述本地緩存和集中式緩存和優缺點。
- 本地緩存在并發使用時的注意事項。
搜索
- elasticsearch 了解多少,說說你們公司 es 的集群架構,索引數據大小,分片有多少,以及一些
- 調優手段 。elasticsearch 的倒排索引是什么。
- elasticsearch 索引數據多了怎么辦,如何調優,部署。
- elasticsearch 是如何實現 master 選舉的。
- 詳細描述一下 Elasticsearch 索引文檔的過程。
- 詳細描述一下 Elasticsearch 搜索的過程。
- Elasticsearch 在部署時,對 Linux 的設置有哪些優化方法?
- lucence 內部結構是什么。
以上是總結出的最全 Java 面試題目,以下是最新總結出的 BAT 面試 java 必考題目和答案。
每個專題問題解析都整理在 MD 文件里了,文末有或曲方式!
總結
一線互聯網公司都比較注重實際的項目中解決問題的能力,另外面試點主要圍繞 JVM、多線程相關、基礎知識的底層原理、處理高并發的能力。這里也不扯什么面試技巧了,輕松發揮就好,祝大家金九銀十季能有個高薪滿意的工作!
整理不易,覺得有幫助的朋友可以幫忙點贊分享支持一下~
你的支持,我的動力;祝各位前程似錦,offer 不斷!!!
Ps:由于篇幅限制,筆記無法全部為大家展示出來,就以截圖主要內容的形式讓大家參考啦,需要完整的朋友可以【領取/點擊】