2018Java面試題彙總
以下面試題是針對最近熱門Java面試題彙總,僅供參考!
一、自我介紹,以及介紹最近一個專案
簡單介紹一下自己,姓名,籍貫,畢業以來工作多少年,在哪些公司工作過。一語帶過即可。然後介紹一下最近做的一個專案,包含整體架構設計,涉及前後端框架,快取,中介軟體以及資料庫等。
二、String特性。StringBuffer 和 StringBuilder 區別
String a = "str"; String b = new String("str");問 a == b , a.equals(b) 的值是true還是false?這裡涉及到 == 與 equals 的區別:
==:比較引用型別比較的是地址值是否相同
equals:比較引用型別預設也是比較地址值是否相同,而String類重寫了equals()方法,比較的是內容是否相同。
String a = "str"; ,"str" 存到方法區的字串常量池。而String b = new String("str");,new String() 存到堆中,在指向常量池的"str"。用 == 時,a指向的是字串常量池地址,而b指向的是 new String() 堆中存放地址。所以必然false。而String 的equals 是比較內容。所以是 true。 關於String要知道它是被final修飾的不可變類。頻繁修改最好用 StringBuffer 或 StringBuilder。二者的區別,StringBuilder效率高,執行緒不安全。StringBuffer執行緒安全
三、ArrayList 和 LinkedList 原理、區別以及底層資料結構
區別:
- ArrayList是實現了基於動態陣列的資料結構,LinkedList基於連結串列的資料結構。
- 對於隨機訪問get和set,ArrayList覺得優於LinkedList,因為LinkedList要移動指標。
- 對於新增和刪除操作add和remove,LinedList比較佔優勢,因為ArrayList要移動資料。
四、HashMap、HashTable、ConcurrentHashMap 原理、原始碼、資料結構,執行緒是否安全
HashMap是陣列加連結串列結構。通過key的hashcode 找到陣列角標。再遍歷連結串列。
HashTable和HashMap區別,屬於執行緒安全,key value 不能為 null。
ConcurrentHashMap也是執行緒安全,結構可理解成 分裂陣列+HashTable。效率比HashTable高,因為HashTable是整個Map加鎖,ConcurrentHashMap是把鎖加到 各個分裂陣列上。
五、Lock 和 synchronize 實現原理與區別。簡述樂觀鎖悲觀鎖。分散式鎖實現方式
synchronized是託管給JVM執行的,而lock是java寫的控制鎖的程式碼。synchronized在鎖定時如果方法塊丟擲異常,JVM 會自動將鎖釋放掉,不會因為出了異常沒有釋放鎖造成執行緒死鎖。但是 Lock 的話就享受不到 JVM 帶來自動的功能,出現異常時必須在 finally 將鎖釋放掉,否則將會引起死鎖。在資源競爭不是很激烈的情況下,偶爾會有同步的情形下,synchronized是很合適的。原因在於,編譯程式通常會盡可能的進行優化synchronize。
分散式鎖實現方式:基於資料庫實現,基於快取(Redis,memcached,tair)實現,基於Zookeeper實現。
六、SpringMVC流程。常用註解。Spring的IOC和AOP
SpringMVC流程:
- 使用者傳送請求至前端控制器DispatcherServlet。
- DispatcherServlet收到請求呼叫HandlerMapping處理器對映器。
- 處理器對映器找到具體的處理器(可以根據xml配置、註解進行查詢),生成處理器物件及處理器攔截器(如果有則生成)一併返回給DispatcherServlet。
- DispatcherServlet呼叫HandlerAdapter處理器介面卡。
- HandlerAdapter經過適配呼叫具體的處理器(Controller,也叫後端控制器)。
- Controller執行完成返回ModelAndView。
- HandlerAdapter將controller執行結果ModelAndView返回給DispatcherServlet。
- DispatcherServlet將ModelAndView傳給ViewReslover檢視解析器。
- ViewReslover解析後返回具體View。
- DispatcherServlet根據View進行渲染檢視(即將模型資料填充至檢視中)。
- DispatcherServlet響應使用者。
七、微服務架構Spring Boot ,Spring Cloud
1.微服務的優勢
2.Spring Cloud 五大神獸:(要知道實現原理,Eureka 是重點)
- 服務發現——Netflix Eureka
- 客服端負載均衡——Netflix Ribbon
- 斷路器——Netflix Hystrix
- 服務閘道器——Netflix Zuul
- 分散式配置——Spring Cloud Config
八、多執行緒與高併發
多執行緒要了解執行緒常用方法。執行緒池的實現方式。如何避免死鎖。生命週期。併發包常用類原理和應用場景:計數器CountdownLatch,柵欄CyclicBarrier,訊號量semaphore,交換。
九、事務相關
專案中事務處理方案。
4種事務特性:- 原子性 (atomicity):強調事務的不可分割.
- 一致性 (consistency):事務的執行的前後資料的完整性保持一致.
- 隔離性 (isolation):一個事務執行的過程中,不應該受到其他事務的干擾
- 永續性(durability) :事務一旦結束,資料就持久到資料庫
5種隔離級別:
- DEFAULT 這是一個PlatfromTransactionManager預設的隔離級別,使用資料庫預設的事務隔離級別
- 未提交讀(read uncommited) :髒讀,不可重複讀,虛讀都有可能發生
- 已提交讀 (read commited):避免髒讀。但是不可重複讀和虛讀有可能發生
- 可重複讀 (repeatable read) :避免髒讀和不可重複讀.但是虛讀有可能發生
- 序列化的 (serializable) :避免以上所有讀問題
7種傳播行為:
保證同一個事務中
- PROPAGATION_REQUIRED 支援當前事務,如果不存在 就新建一個(預設)
- PROPAGATION_SUPPORTS 支援當前事務,如果不存在,就不使用事務
- PROPAGATION_MANDATORY 支援當前事務,如果不存在,丟擲異常
- PROPAGATION_REQUIRES_NEW 如果有事務存在,掛起當前事務,建立一個新的事務
- PROPAGATION_NOT_SUPPORTED 以非事務方式執行,如果有事務存在,掛起當前事務
- PROPAGATION_NEVER 以非事務方式執行,如果有事務存在,丟擲異常
- PROPAGATION_NESTED 如果當前事務存在,則巢狀事務執行
分散式事務處理方案(XA,TCC等,也可以瞭解一下阿里最近推出的 GTS) 推薦部落格:https://blog.csdn.net/mine_song/article/details/64118963
十、常用那些設計模式,說出原理,已經框架中用到哪些。單例的幾種寫法
23種設計模式至少要了解Spring框架用到的一些設計模式。bean單例 beanfactory工廠 AOP動態代理等。
單例有餓漢式,懶漢式,靜態內部類等方式。這些方式並非真正安全,可以用反射拿到,用列舉可以避免。
十一、常用中介軟體RabbitMQ,kafka等,原理、區別、優缺點
中介軟體的應用場景。
RabbitMQ是一個AMQP實現,傳統的messaging queue系統實現,基於Erlang。老牌MQ產品了。AMQP協議更多用在企業系統內,對資料一致性、穩定性和可靠性要求很高的場景,對效能和吞吐量還在其次。
Kafka是linkedin開源的MQ系統,主要特點是基於Pull的模式來處理訊息消費,追求高吞吐量,一開始的目的就是用於日誌收集和傳輸,0.8開始支援複製,不支援事務,適合產生大量資料的網際網路服務的資料收集業務。
十二、快取:Redis原理,資料結構,叢集幾種方式。和memcache區別
十三、HTTP協議,RPC協議,Socket協議
十四、Nginx實現負載均衡的幾種方式
輪詢,隨機,雜湊,加權輪詢,加權隨機,最小連線數等。
十五、java1.8新特性
十六、關於jvm調優