二面螞蟻金服(交叉面),已拿offer,Java崗定級阿里P6

記一次螞蟻金服Java程序員面試經歷(均爲交叉面)

一面

自我介紹

項目中的監控:那個監控指標常見的有哪些?

微服務涉及到的技術以及需要注意的問題有哪些?

註冊中心你瞭解了哪些?

consul 的可靠性你瞭解嗎?

consul 的機制你有沒有具體深入過?有沒有和其他的註冊中心對比過?

項目用 Spring 比較多,有沒有了解 Spring 的原理?AOP 和 IOC 的原理

Spring Boot除了自動配置,相比傳統的 Spring 有什麼其他的區別?

Spring Cloud 有了解多少?

Spring Bean 的生命週期

HashMap 和 hashTable 區別?

Object 的 hashcode 方法重寫了,equals 方法要不要改?

Hashmap 線程不安全的出現場景

線上服務 CPU 很高該怎麼做?有哪些措施可以找到問題

JDK 中有哪幾個線程池?順帶把線程池講了個遍

應儘量避免在 where 子句中使用!=或<>操作符,否則將引擎放棄使用索引而進行全表掃描

SQL 索引的順序,字段的順序

查看 SQL 是不是使用了索引?(有什麼工具)

TCP 和 UDP 的區別?TCP 數據傳輸過程中怎麼做到可靠的?

說下你知道的排序算法吧

查找一個數組的中位數?

二面

你有什麼問題想問我的嗎?(常規問詢)

自我介紹、工作經歷、技術棧

項目中你學到了什麼技術?

微服務劃分的粒度?

微服務的高可用怎麼保證的?

負載均衡與反向代理,隔離,限流,降級,超時與重試,回滾,壓力測試與應急預案

常用的負載均衡,該怎麼用,你能說下嗎?

(技術問)

http重定向

DNS負載均衡

反向代理負載均衡

IP負載均衡(LVS-NAT)

直接路由(LVS-DR)

IP隧道(LVS-TUN)

網關能夠爲後端服務帶來哪些好處?

Spring Bean 的生命週期

xml 中配置的 init、destroy 方法怎麼可以做到調用具體的方法?反射的機制

Object 類中的方法

對象比較是否相同

hashmap put 方法存放的時候怎麼判斷是否是重複的

Object toString 方法常用的地方,爲什麼要重寫該方法

Set 和 List 區別?

ArrayList 和 LinkedList 區別

如果存取相同的數據,ArrayList 和 LinkedList 誰佔用空間更大?

Set 存的順序是有序的嗎?

常見 Set 的實現有哪些?

TreeSet 對存入對數據有什麼要求呢?

HashSet 的底層實現呢?

TreeSet 底層源碼有看過嗎?

HashSet 是不是線程安全的?爲什麼不是線程安全的?

Java 中有哪些線程安全的 Map?

HashTable 你瞭解過嗎?

如何保證線程安全問題?

synchronized、lock

volatile 的原子性問題?爲什麼 i++ 這種不支持原子性?從計算機原理的設計來講下不能保證原子性的原因happens before 原理

cas 操作

lock 和 synchronized 的區別?

公平鎖和非公平鎖

Java 讀寫鎖

讀寫鎖設計主要解決什麼問題?

你項目除了寫 Java 代碼,還有前端代碼,那你知道前端有哪些框架嗎?

MySQL 分頁查詢語句

MySQL 事務特性和隔離級別

二、事務的併發問題

不可重複讀會出現在什麼場景?

sql having 的使用場景

前端瀏覽器地址的一個 http 請求到後端整個流程是怎麼樣?

http 默認端口,https 默認端口

DNS 你知道是幹嘛的嗎?

你們開發用的 ide 是啥?你能說下 idea 的常用幾個快捷鍵吧?

代碼版本管理你們用的是啥?

git rebase 和 merge 有什麼區別?

你們公司加班多嗎?(題外話)

舉例回答:

項目用 Spring 比較多,有沒有了解 Spring 的原理?AOP 和 IOC 的原理

答:(1). IoC(Inversion of Control)是指容器控制程序對象之間的關係,而不是傳統實現中,由程序代碼直接操控。控制權由應用代碼中轉到了外部容器,控制權的轉移是所謂反轉。 對於Spring而言,就是由Spring來控制對象的生命週期和對象之間的關係;IoC還有另外一個名字——“依賴注入(Dependency Injection)”。從名字上理解,所謂依賴注入,即組件之間的依賴關係由容器在運行期決定,即由容器動態地將某種依賴關係注入到組件之中。

(2). 在Spring的工作方式中,所有的類都會在spring容器中登記,告訴spring這是個什麼東西,你需要什麼東西,然後spring會在系統運行到適當的時候,把你要的東西主動給你,同時也把你交給其他需要你的東西。所有的類的創建、銷燬都由 spring來控制,也就是說控制對象生存週期的不再是引用它的對象,而是spring。對於某個具體的對象而言,以前是它控制其他對象,現在是所有對象都被spring控制,所以這叫控制反轉。

(3). 在系統運行中,動態的向某個對象提供它所需要的其他對象。

(4). 依賴注入的思想是通過反射機制實現的,在實例化一個類時,它通過反射調用類中set方法將事先保存在HashMap中的類屬性注入到類中。 總而言之,在傳統的對象創建方式中,通常由調用者來創建被調用者的實例,而在Spring中創建被調用者的工作由Spring來完成,然後注入調用者,即所謂的依賴注入or控制反轉。 注入方式有兩種:依賴注入和設置注入; IoC的優點:降低了組件之間的耦合,降低了業務對象之間替換的複雜性,使之能夠靈活的管理對象。

AOP(Aspect Oriented Programming)

(1). AOP面向方面編程基於IoC,是對OOP的有益補充;

(2). AOP利用一種稱爲“橫切”的技術,剖解開封裝的對象內部,並將那些影響了 多個類的公共行爲封裝到一個可重用模塊,並將其名爲“Aspect”,即方面。所謂“方面”,簡單地說,就是將那些與業務無關,卻爲業務模塊所共同調用的 邏輯或責任封裝起來,比如日誌記錄,便於減少系統的重複代碼,降低模塊間的耦合度,並有利於未來的可操作性和可維護性。

(3). AOP代表的是一個橫向的關 系,將“對象”比作一個空心的圓柱體,其中封裝的是對象的屬性和行爲;則面向方面編程的方法,就是將這個圓柱體以切面形式剖開,選擇性的提供業務邏輯。而 剖開的切面,也就是所謂的“方面”了。然後它又以巧奪天功的妙手將這些剖開的切面復原,不留痕跡,但完成了效果。

(4). 實現AOP的技術,主要分爲兩大類:一是採用動態代理技術,利用截取消息的方式,對該消息進行裝飾,以取代原有對象行爲的執行;二是採用靜態織入的方式,引入特定的語法創建“方面”,從而使得編譯器可以在編譯期間織入有關“方面”的代碼。

(5). Spring實現AOP:JDK動態代理和CGLIB代理 JDK動態代理:其代理對象必須是某個接口的實現,它是通過在運行期間創建一個接口的實現類來完成對目標對象的代理;其核心的兩個類是InvocationHandler和Proxy。 CGLIB代理:實現原理類似於JDK動態代理,只是它在運行期間生成的代理對象是針對目標類擴展的子類。CGLIB是高效的代碼生成包,底層是依靠ASM(開源的java字節碼編輯類庫)操作字節碼實現的,性能比JDK強;需要引入包asm.jar和cglib.jar。 使用AspectJ注入式切面和@AspectJ註解驅動的切面實際上底層也是通過動態代理實現的。

(6). AOP使用場景:

Authentication 權限檢查

Caching 緩存

Context passing 內容傳遞

Error handling 錯誤處理

Lazy loading延遲加載

Debugging 調試

logging, tracing, profiling and monitoring日誌記錄,跟蹤,優化,校準

Performance optimization性能優化,效率檢查

Persistence 持久化

Resource pooling資源池

Synchronization同步

Transactions 事務管理

另外Filter的實現和struts2的攔截器的實現都是AOP思想的體現。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章