面試題: 已看1

如下面試題是針對最近熱門Java面試題彙總,僅供參考!前端

 

1、自我介紹,以及介紹最近一個項目java

簡單介紹一下本身,姓名,籍貫,畢業以來工做多少年,在哪些公司工做過。一語帶過便可。而後介紹一下最近作的一個項目,包含總體架構設計,涉及先後端框架,緩存,中間件以及數據庫等。面試

 

2、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線程安全。緩存

 

3、ArrayList 和 LinkedList 原理、區別以及底層數據結構安全

     區別:

  • ArrayList是實現了基於動態數組的數據結構,LinkedList基於鏈表的數據結構。 
  • 對於隨機訪問get和set,ArrayList以爲優於LinkedList,由於LinkedList要移動指針。 
  • 對於新增和刪除操做add和remove,LinedList比較佔優點,由於ArrayList要移動數據。 
     知道這些還不夠,最好看一遍源碼。瞭解一下存在這些區別的緣由。以第三點爲例,爲何新增刪除 ArrayList佔優點呢?看了源碼就會了解到。  ArrayList 底層結構是數組,首先數組是不可變的,新增要檢查數組大小是否知足,不知足須要擴容,擴容就須要新建數組,而後將原數組copy到新數組,再製空原數組,在新數組新增。刪除時,ArrayList會將後面部分的元素依次往上挪一個位置(就是copy)。其餘方法再也不描述,具體須要先熟悉一下源碼。有時候會問到怎麼保證ArrayList 線程安全。用Collections.synchronizedList()或改用 Vector。原理是方法前加入了synchronize關鍵字實現加鎖。
 

 

4、HashMap、HashTable、ConcurrentHashMap 原理、源碼、數據結構,線程是否安全數據結構

    HashMap是數組加鏈表結構。經過key的hashcode 找到數組角標。再遍歷鏈表。

    HashTable和HashMap區別,屬於線程安全,key value 不能爲 null。

   ConcurrentHashMap也是線程安全,結構可理解成 分裂數組+HashTable。效率比HashTable高,由於HashTable是整個Map加鎖,ConcurrentHashMap是把鎖加到 各個分裂數組上。

 

5、Lock 和 synchronize 實現原理與區別。簡述樂觀鎖悲觀鎖。分佈式鎖實現方式

    synchronized是託管給JVM執行的,而lock是java寫的控制鎖的代碼。synchronized在鎖定時如果方法塊拋出異常,JVM 會自動將鎖釋放掉,不會由於出了異常沒有釋放鎖形成線程死鎖。可是 Lock 的話就享受不到 JVM 帶來自動的功能,出現異常時必須在 finally 將鎖釋放掉,不然將會引發死鎖。在資源競爭不是很激烈的狀況下,偶爾會有同步的情形下,synchronized是很合適的。緣由在於,編譯程序一般會盡量的進行優化synchronize。 

    分佈式鎖實現方式:基於數據庫實現,基於緩存(Redis,memcached,tair)實現,基於Zookeeper實現。

 

6、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響應用戶。

 

7、微服務架構Spring Boot ,Spring Cloud

1.微服務的優點

2.Spring Cloud 五大神獸:(要知道實現原理,Eureka 是重點)

  • 服務發現——Netflix Eureka
  • 客服端負載均衡——Netflix Ribbon
  • 斷路器——Netflix Hystrix
  • 服務網關——Netflix Zuul
  • 分佈式配置——Spring Cloud Config

 

8、多線程與高併發

    多線程要了解線程經常使用方法。線程池的實現方式。如何避免死鎖。生命週期。併發包經常使用類原理和應用場景:計數器CountdownLatch,柵欄CyclicBarrier,信號量semaphore,交換。

 

9、事務相關

項目中事務處理方案。

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

 

10、經常使用那些設計模式,說出原理,已經框架中用到哪些。單例的幾種寫法

    23種設計模式至少要了解Spring框架用到的一些設計模式。bean單例 beanfactory工廠 AOP動態代理等。

    單例有餓漢式,懶漢式,靜態內部類等方式。這些方式並不是真正安全,能夠用反射拿到,用枚舉能夠避免。

 

11、經常使用中間件RabbitMQ,kafka等,原理、區別、優缺點

中間件的應用場景。

RabbitMQ是一個AMQP實現,傳統的messaging queue系統實現,基於Erlang。老牌MQ產品了。AMQP協議更多用在企業系統內,對數據一致性、穩定性和可靠性要求很高的場景,對性能和吞吐量還在其次。

Kafka是linkedin開源的MQ系統,主要特色是基於Pull的模式來處理消息消費,追求高吞吐量,一開始的目的就是用於日誌收集和傳輸,0.8開始支持複製,不支持事務,適合產生大量數據的互聯網服務的數據收集業務。

 

12、緩存:Redis原理,數據結構,集羣幾種方式。和memcache區別

 

十3、HTTP協議,RPC協議,Socket協議

 

十4、Nginx實現負載均衡的幾種方式

    輪詢,隨機,哈希,加權輪詢,加權隨機,最小鏈接數等。

 

十5、java1.8新特性

 

十6、關於jvm調優

相關文章
相關標籤/搜索