Java 高級工程師面試題總結及參考答案


一、面試題基礎總結

1、 JVM 結構原理、GC 工作機制詳解
答:具體參照:JVM 結構、GC 工作機制詳解 ,說到 GC,記住兩點:1、GC 是負責回收所有無任何引用對象的內存空間。 注意:垃圾回收回收的是無任何引用的對象占據的內存空間而不是對象本身,2、GC 回收機制的兩種算法,a、引用計數法 b、可達性分析算法( 這里的可達性,大家可以看基礎 2 Java 對象的什么周期),至於更詳細的 GC 算法介紹,大家可以參考:Java GC 機制算法
2、Java 對象的生命周期
答:創建階段 、 應用階段 、不可見階段 、不可達階段 、收集階段 、終結階段、 對象空間重新分配階段等等,具體參照:Java 對象的生命周期
3、Map 或者 HashMap 的存儲原理
答:HashMap 是由數組 + 鏈表的一個結構組成,具體參照:HashMap 的實現原理
4、當數據表中 A、B 字段做了組合索引,那么單獨使用 A 或單獨使用 B 會有索引效果嗎?(使用 like 查詢如何有索引效果)
答:看 A、B 兩字段做組合索引的時候,誰在前面,誰在后面,如果 A 在前,那么單獨使用 A 會有索引效果,單獨使用 B 則沒有,反之亦然。同理,使用 like 模糊查詢時,如果只是使用前面 %,那么有索引效果,如果使用雙 % 號匹配,那么則無索引效果
5、數據庫存儲日期格式時,如何考慮時區轉換問題?
答:使用 TimeStamp , 原因參照:Java 編程中遇到的時區轉換問題
6、Java Object 類中有哪些方法?
答:Object 有哪些方法
7、HTTP 協議,GET 和 POST 的區別
答:淺談 HTTP 中 GET 和 POST 的區別

二、線程、設計模式、緩存方面

1、SimpleDataFormat 是非線程安全的,如何更好的使用而避免風險呢
答:關於 SimpleDateFormat 安全的時間格式化線程安全問題
2、如何看待設計模式,並簡單說說你對觀察者模式的理解
答:1、設計模式有神馬用 2、觀察者模式類圖及實現
3、集群環境中,session 如何實現共享
答:
1、Java 集群之 session 共享
2、session 多服務器共享方案,還有一種方案就是使用一個固定的服務器專門保持 session,其他服務器共享
4、分布式、集群環境中,緩存如何刷新,如何保持同步?
答:
A、緩存如何刷新? 1、定時刷新 2、主動刷新覆蓋 ,每個緩存框架都有自帶的刷新機制,或者說緩存失效機制,就拿 Redis 和 Ehcache 舉例, 他們都有自帶的過期機制,另外主動刷新覆蓋時,只需獲取對應的 key 進行數據的覆蓋即可
B、緩存如何保持同步? 這個 Redis 有自帶的集群同步機制,即復制功能,具體參考:基於 Redis 分布式緩存實現 ,Ehcache 也有分布式緩存同步的配置,只需要配置不同服務器地址即可,參照:Ehcache 分布式緩存同步
5、一條 SQL 執行過長的時間,你如何優化,從哪些方面?
答:
1、查看 SQL 是否涉及多表的聯表或者子查詢,如果有,看是否能進行業務拆分,相關字段冗余或者合並成臨時表(業務和算法的優化)
2、涉及鏈表的查詢,是否能進行分表查詢,單表查詢之后的結果進行字段整合
3、如果以上兩種都不能操作,非要鏈表查詢,那么考慮對相對應的查詢條件做索引。加快查詢速度
4、針對數量大的表進行歷史表分離(如交易流水表)
5、數據庫主從分離,讀寫分離,降低讀寫針對同一表同時的壓力,至於主從同步,MySQL 有自帶的 binlog 實現 主從同步
6、explain 分析 SQL 語句,查看執行計划,分析索引是否用上,分析掃描行數等等
7、查看 MySQL 執行日志,看看是否有其他方面的問題
個人理解:從根本上來說,查詢慢是占用 MySQL 內存比較多,那么可以從這方面去酌手考慮

三、三大框架方面問題

1、Spring 事務的隔離性,並說說每個隔離性的區別
解答:Spring 事務詳解
2、Spring 事務的傳播行為,並說說每個傳播行為的區別
解答:Spring 事務詳解
3、hibernate 跟 Mybatis/ ibatis 的區別,為什么選擇?
解答:Hibernate 與 MyBatis 的比較
4、Struts 跟 Spring mvc 的優缺點,讓你選會如何選
解答:Spring MVC 與 Struts 的區別
5、簡單說說 Spring 事務機制
解答:Spring 事務機制
6、Spring 4.0 新特性
解答:Spring4 新特性

四、負載均衡、集群相關

1、weblogic 負載均衡的原理和集群的配置
解答:a、WEBLOGIC 負載均衡原理 b、負載均衡和集群的配置(參考)
2、Nginx+Tomcat+Redis 實現負載均衡、資源分離、session 共享
解答:配置參考
3、nginx 配置文件詳解——nginx.conf
解答:Nginx 配置文件詳細說明

五、項目優化相關

1、Web 如何項目優化
解答:這個我整理過一次,Web 項目性能優化(整理)
2、單例模式有幾種? 如何優化?
解答:單例模式的 7 中用法
3、簡單說說線程池的原理和實現
解答:線程原理及實現

六、並發和安全方面

1、項目並發如何處理?(我們是 Web 項目)
解答:高並發量網站解決方案,另外,還有數據庫樂觀鎖,數據庫讀寫分離、使用消息隊列、多用存儲過程等等
2、簡單說說功能權限存在的水平權限漏洞和垂直權限漏洞的場景和解決辦法(因為我們目前權限級別就是功能權限)
解答:
A、水平權限漏洞,如下圖

假設機構有 用戶 A 和用戶 B 兩個用戶,其中 A 有 1、2 和 3 權限 , 用戶 B 有 2 和 3 的權限,這時候假設用戶 B 知道 1,並給自己添加 1 的權限,這時候就是水平權限漏洞。
目前解決辦法:1、限制入口,讓用戶 B 無法編輯自己的權限 2、對用戶 B 無法進行向上擴展。最根本的解決辦法是深入到數據權限
解答:水平權限漏洞和解決辦法

B、垂直權限漏洞
解答:垂直權限漏洞案例和解決方案
3、平台上的圖片如何防盜鏈
解答:http 下載防盜鏈原理:http 協議的字段 referer 記錄來實現
4、如何區分上傳的圖片是不是木馬?
解答:1、看上傳的圖片后綴 2、如何后綴是篡改的,那么每個文件有個魔術數字 文件上傳-魔術數字
5、消息隊列的原理和實現
解答:1、消息隊列原理 2、深入淺出 消息隊列 ActiveMQ

七、數據庫方面

1、MySQL 查詢字段區不區分大小寫?
解答:不區分,哪怕值也不區分(我當時還反問了,區不區分大小的應用含義有哪些,面試官沒說得出來)
2、簡單說說數據庫集群和負載均衡、分布式(我不懂這塊)
解答:數據庫負載均衡和集群參考 ,參考 2
3、存儲過程的結構和優點
解答:大概結構
存儲過程的優缺點
4、觸發器的原理和作用
解答:參考

八、Java 底層基礎題

1、SpringMVC 的原理以及返回數據如何渲染到 jsp/html 上?
答:Spring MVC 的核心就是 DispatcherServlet , 一個請求經過 DispatcherServlet ,轉發給 HandlerMapping ,然后經反射,對應 Controller 及其里面方法的@RequestMapping 地址,最后經 ModelAndView 和 ViewResoler 返回給對應視圖 。 具體可參考:Spring MVC 的工作原理
2、一個類對象屬性發生改變時,如何讓調用者知道?
答:Java event 時間監聽 ,即在 set 方法改變屬性時,觸發 ,這種模式也可以理解為觀察者模式,具體查看:觀察者模式簡單案例和說明
3、重寫 equals 為何要重寫 hashCode?
答:判斷兩個對象是否相等,比較的就是其 hashCode, 如果你重載了 equals,比如說是基於對象的內容實現的,而保留 hashCode 的實現不變,那么很可能某兩個對象明明是“相等”,而 hashCode 卻不一樣。 hashcode 不一樣,就無法認定兩個對象相等了
4、談談你對 JVM 的理解?
答: Java 語言的一個非常重要的特點就是與平台的無關性。而使用 Java 虛擬機是實現這一特點的關鍵。Java 編譯器只要面向 JVM,生成 JVM 能理解的代碼或字節碼文件。Java 源文件經編譯成字節碼程序,通過 JVM 將每一條指令翻譯成不同平台機器碼,通過特定平台運行。
JVM 執行程序的過程 :I.加載。class 文件 ,II.管理並分配內存 ,III.執行垃圾收集

JRE(Java 運行時環境)由 JVM 構造的 Java 程序的運行環境

具體詳情:JVM 原理和調優
5、MySQL 的事物隔離級別?
答:MySQL 的事物隔離級別 其實跟 Spring 的事物隔離級別一樣,都是 1、Read Uncommitted(讀取未提交內容), 2、Read Committed(讀取提交內容),3、Repeatable Read(可重讀),4、Serializable(可串行化) 具體參照:MySQL 事物隔離級別
6、Spring 的原理
答:Spring 的核心是 IoC 和 AOP ,IoC 是依賴注入和控制反轉, 其注入方式可分為 set 注入、構造器注入、接口注入等等。IoC 就是一個容器,負責實例化、定位、配置應用程序中的對象及建立這些對象間的依賴。簡單理解就是:Java 每個業務邏輯處理至少需要兩個或者以上的對象協作進行工作,但是每個對象在使用它的合作對象的時候,都需要頻繁的 new 對象來實現,你就會發現,對象間的耦合度高了。而 IoC 的思想是:Spring 容器來管理這些,對象只需要處理本身業務關系就好了。至於什么是控制反轉,就是獲得依賴對象的方式反轉了。
AOP 呢,面向切面編程,最直接的體現就是 Spring 事物管理。至於 Spring 事物的相關資料,就不細說了,參考:Spring 注解式事物管理
7、談談你對 NIO 的理解
答:IO 是面向流,NIO 是面向緩沖 ,這里不細講了,具體參照:Java NIO 和 IO 的區別
8、ArrayList 和 LinkedList、Vector 的區別?
答:總得來說可以理解為:.
1.ArrayList 是實現了基於動態數組的數據結構,LinkedList 基於鏈表的數據結構。
2.對於隨機訪問 get 和 set,ArrayList 覺得優於 LinkedList,因為 LinkedList 要移動指針。
3.對於新增和刪除操作 add 和 remove,LinedList 比較占優勢,因為 ArrayList 要移動數據
Vector 和 ArrayList 類似,但屬於強同步類,即線程安全的,具體比較參照:比較 ArrayList、LinkedList、Vector
9、隨便說說幾個單例模式,並選擇一種線程安全的
答:單例的類別:懶漢、餓漢、枚舉、靜態內部類、雙重校驗鎖 等等 , 選擇線程安全我選最后一種,雙重校驗鎖。 具體實現方式參照:Java:單例模式的七種寫法
10、談談紅黑樹
答:算法和數據結構一直是我薄弱之處,這方面說自己補吧,成效不大,這里我就推薦一個:紅黑樹
11、舉例說說幾個排序,並說明其排序原理
答:這里我就不細說了,大家自己看看 Java 實現幾種常見的排序算法
12、MySQL 索引的原理
答:索引的作用大家都知道,就是加快查詢速度,但是原理,我說不上來,這里直接看吧:MySQL 索引工作原理
13、序列化的原理和作用
答:Serialization(序列化)是一種將對象以一連串的字節描述的過程;反序列化 deserialization 是一種將這些字節重建成一個對象的過程,主要用於 HTTP 或者 WebService 接口傳輸過程中對象參數的傳播,具體可參看:Java 序列化機制和原理

九、並發及項目調優

1、說說線程安全的幾種實現方式?
答:什么是線程安全? 我的理解是這樣的,一個對象被多個線程同時訪問,還能保持其內部屬性的順序性及同步性,則認定為線程安全。實現線程安全的三種方式:被 volatile、synchronized 等關鍵字修飾,或者使用 java.util.concurrent 下面的類庫。 至於前兩者的關系,參考:synchronized 和 volatile 的用法區別
2、方法內部,如何實現更好的異步?
答:我們知道異步其實就是讓另一個線程去跑,那么如何創建線程? 第一種直接 new Thread ,第二種 new 一個實現 Runnable 接口的實現類。 第三種,通過線程池來管理創建等 ,這里說到更好的實現異步,那就是說我們在方法內部避免頻繁的 new 線程,就可以考慮線程池了。 那么線程池如何創建? 這里可以 new 一個線程池,但是需要考慮單例,或者在程序初始啟東時,就創建一個線程池,讓他跑着,然后在具體方法的時候,通過線程池來創建線程,實現異步
3、項目中為何要用緩存?如何理解 nginx + Tomcat + Redis 集群緩存?
答 1:最直接的表現就是減輕數據庫的壓力。避免因為數據讀取頻繁或過大而影響數據庫性能,降低程序宕機的可能性
答 2:nginx 常用做靜態內容服務和代理服務器,直面外來請求轉發給后面的應用服務。nginx 本身也能做緩存,比如靜態頁面的緩存什么的。而 Tomcat 是應用服務器,處理 Java Web 程序功能等等 。你也可以這么理解,假設把用戶的請求當做是一條河流,那么 nginx 就相當於一個水利工程,Tomcat 相當於一條條分流的支流,而 Redis 相當於支流旁邊的一個個水庫。 當你洪水來了,nginx 根據你每條支流的承受力度分發不同的水流量,在確保程序正常運行的情況下,分發給每條支流(tomcat)不同的水流量。而 Redis 相當於一個個支流的水庫,存儲水源,降低壓力,讓后面的水量平穩。
4、日常項目中,如果你接手,你准備從哪些方面調優?
答:這個呢首先是了解哪些需要優化,需要優化肯定是項目性能遭遇瓶頸或者猜測即將遭遇了,我們才會去考慮優化。那么怎么優化?
a、擴容 ,擴容的理解,就是擴充服務器並行處理的能力,簡單來說就是加服務器,增加處理請求的能力,例如增加 nginx 、Tomcat 等應用服務器的個數,或者物理服務器的個數,還有加大服務器帶寬等等,這里考慮的是硬件方面
b、調優 ,調優,包括系統調優和代碼調優 。 系統調優就是說加快處理速度,比如我們所提到的 CDN、ehcache、Redis 等緩存技術,消息隊列等等,加快服務間的響應速度,增加系統吞吐量,避免並發,至於代碼調優,這些就需要多積累了,比如重構、工廠等, 數據庫調優的話這個我不是很懂,只知道索引和存儲過程,具體參考:MySQL 數據庫調優 21 個最佳實踐 ,其他數據庫調優方面就各位自己找找吧
5、談談你對分布式的理解
答:個人理解:分布式就是把一個系統/業務 拆分成多個子系統/子業務 去協同處理,這個過程就叫分布式,具體的演變方式參考:Java 分布式應用技術架構介紹
6、Redis 實現消息隊列
答:Redis 實現消息隊列 、參考 2
7、另總結多線程相關面試題 50 道
8、分享一個調優工具和方案:如何利用 JConsole 觀察分析 Java 程序的運行,進行排錯調優

十、手寫代碼題(包含 SQL 題)

1、假設商戶表 A(id , city ) ,交易流水表 B (aid, amount , time) 這里的 time 代表交易時間, 請用 SQL 寫出查詢每個城市每個月的銷售業績(答案可在評論里回復)
2、假設有一個數組 A ,int[] A = { 1 , 3 , -1 ,0 , 2 , 1 , -4 , 2 , 0 ,1 ... N}; 原來是需要查出大於 0 的數組,但是由於傳參錯誤或者其他原因,導致查出 0 和負數了,現在要求在不使用新數組和新集合的情況下(即只使用這個 A 數組,因數組數據比較大,且只能用一次循環) 實現正數放到數組的前面,小於等於 0 的數放到數組的末尾(答案可在評論里回復)

十一、設計方案相關

面試還會問到一些關於設計方案相關的問題,比如
1、你的接口服務數據被人截包了,你如何防止數據惡意提交?
答:我們可以在接口傳輸參數里面設置一個業務編號,這個編號用來區分是否重復提交。這樣即使數據被抓包了,對方也無法區分每個字段你的含義,這時,這個業務編號的作用就來了
2、假設服務器經常宕機,你從哪些方面去排查問題?
答:這個就留個各位看官補充了,可評論回復


來源:黑客派
協議:CC BY-SA 4.0 https://creativecommons.org/licenses/by-sa/4.0/


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM