1. 程式人生 > >2018Java面試題彙總

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要移動資料。
     知道這些還不夠,最好看一遍原始碼。瞭解一下存在這些區別的原因。以第三點為例,為什麼新增刪除 ArrayList佔優勢呢?看了原始碼就會了解到。 ArrayList 底層結構是陣列,首先陣列是不可變的,新增要檢查陣列大小是否滿足,不滿足需要擴容,擴容就需要新建陣列,然後將原陣列copy到新陣列,再製空原陣列,在新陣列新增。刪除時,ArrayList會將後面部分的元素依次往上挪一個位置(就是copy)。其他方法不再描述,具體需要先熟悉一下原始碼。
有時候會問到怎麼保證ArrayList 執行緒安全。用Collections.synchronizedList()或改用 Vector。原理是方法前加入了synchronize關鍵字實現加鎖。

四、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流程:

  1. 使用者傳送請求至前端控制器DispatcherServlet。
  2. DispatcherServlet收到請求呼叫HandlerMapping處理器對映器。
  3. 處理器對映器找到具體的處理器(可以根據xml配置、註解進行查詢),生成處理器物件及處理器攔截器(如果有則生成)一併返回給DispatcherServlet。
  4. DispatcherServlet呼叫HandlerAdapter處理器介面卡。
  5. HandlerAdapter經過適配呼叫具體的處理器(Controller,也叫後端控制器)。
  6. Controller執行完成返回ModelAndView。
  7. HandlerAdapter將controller執行結果ModelAndView返回給DispatcherServlet。
  8. DispatcherServlet將ModelAndView傳給ViewReslover檢視解析器。
  9. ViewReslover解析後返回具體View。
  10. DispatcherServlet根據View進行渲染檢視(即將模型資料填充至檢視中)。
  11. 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調優