史上最全Java面试266题:算法+缓存+TCP+JVM+搜索+分布式+数据库
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個是不重復的,怎么找出來。寫一個字符串(如: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面试266题:算法+缓存+TCP+JVM+搜索+分布式+数据库的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Spark内存管理(3)—— 统一内存管
- 下一篇: 十大经典数据挖掘算法:EM