金三銀四:螞蟻金服JAVA開發面試題及答案之一面(持續更新)

JAVA架構發表於2019-03-15
金三銀四:螞蟻金服JAVA開發面試題及答案之一面(持續更新)

一面

1、自我介紹、自己做的專案和技術領域

開放題

2、專案中的監控:那個監控指標常見的有哪些?

答:CPU、記憶體、IO 等等。建議下載個nmon工具,裡面有各個指標。

資料庫:Mysql(快取命中、索引、單條SQL效能、資料庫執行緒數、資料池連線數)

中介軟體:1.訊息2、負載均衡3、快取(包括執行緒數、連線數、日誌)。

網路: 吞吐量、吞吐率

應用: jvm記憶體、日誌、Full GC頻率

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

4、註冊中心你瞭解了哪些?

答:Consul 、Eureka、ZooKeeper

5、consul 的可靠性你瞭解嗎?

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

7、專案用 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思想的體現。

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

為Spring 生態系統的開發提供一種更簡潔的方式,提供了很多非功能性特性,例如:嵌入式 Server,Security,統計,健康檢查,外部配置等等,主要體現在以下幾點:

1.Spring Boot可以建立獨立的Spring應用程式;

2.內嵌瞭如Tomcat,Jetty和Undertow這樣的容器,也就是說可以直接跑起來,用不著再做部署工作了;

3.無需再像Spring那樣搞一堆繁瑣的xml檔案的配置;

4.可以自動配置Spring。SpringBoot將原有的XML配置改為Java配置,將bean注入改為使用註解注入的方式(@Autowire),並將多個xml、properties配置濃縮在一個appliaction.yml配置檔案中。

5.提供了一些現有的功能,如量度工具,表單資料驗證以及一些外部配置這樣的一些第三方功能;

6.整合常用依賴(開發庫,例如spring-webmvc、jackson-json、validation-api和tomcat等),提供的POM可以簡化Maven的配置。當我們引入核心依賴時,SpringBoot會自引入其他依賴。

9、Spring Cloud 有了解多少?

Spring Cloud是一系列框架的有序集合。它利用Spring Boot的開發便利性巧妙地簡化了分散式系統基礎設施的開發,如服務發現註冊、配置中心、訊息匯流排、負載均衡、斷路器、資料監控等,都可以用Spring Boot的開發風格做到一鍵啟動和部署。Spring Cloud並沒有重複製造輪子,它只是將目前各家公司開發的比較成熟、經得起實際考驗的服務框架組合起來,透過Spring Boot風格進行再封裝遮蔽掉了複雜的配置和實現原理,最終給開發者留出了一套簡單易懂、易部署和易維護的分散式系統開發工具包。

10、Spring Bean 的生命週期

一個Bean從建立到銷燬,如果是用BeanFactory來生成,管理Bean的話

Spring上下文中的Bean也類似,如下

1、例項化一個Bean--也就是我們常說的new;

2、按照Spring上下文對例項化的Bean進行配置--也就是IOC注入;

3、如果這個Bean已經實現了BeanNameAware介面,會呼叫它實現的setBeanName(String)方法,此處傳遞的就是Spring配置檔案中Bean的id值

4、如果這個Bean已經實現了BeanFactoryAware介面,會呼叫它實現的setBeanFactory(setBeanFactory(BeanFactory)傳遞的是Spring工廠自身(可以用這個方式來獲取其它Bean,只需在Spring配置檔案中配置一個普通的Bean就可以);

5、如果這個Bean已經實現了ApplicationContextAware介面,會呼叫setApplicationContext(ApplicationContext)方法,傳入Spring上下文(同樣這個方式也可以實現步驟4的內容,但比4更好,因為ApplicationContext是BeanFactory的子介面,有更多的實現方法);

6、如果這個Bean關聯了BeanPostProcessor介面,將會呼叫postProcessBeforeInitialization(Object obj, String s)方法,BeanPostProcessor經常被用作是Bean內容的更改,並且由於這個是在Bean初始化結束時呼叫那個的方法,也可以被應用於記憶體或快取技術;

7、如果Bean在Spring配置檔案中配置了init-method屬性會自動呼叫其配置的初始化方法。

8、如果這個Bean關聯了BeanPostProcessor介面,將會呼叫postProcessAfterInitialization(Object obj, String s)方法、;

注:以上工作完成以後就可以應用這個Bean了,那這個Bean是一個Singleton的,所以一般情況下我們呼叫同一個id的Bean會是在內容地址相同的例項,當然在Spring配置檔案中也可以配置非Singleton,這裡我們不做贅述。

9、當Bean不再需要時,會經過清理階段,如果Bean實現了DisposableBean這個介面,會呼叫那個其實現的destroy()方法;

10、最後,如果這個Bean的Spring配置中配置了destroy-method屬性,會自動呼叫其配置的銷燬方法。

另外我們這裡描述的是應用Spring上下文Bean的生命週期,如果應用Spring的工廠也就是BeanFactory的話去掉第5步就Ok了

11、HashMap 和 hashTable 區別?

區別:Hashtable是執行緒安全的,效率比較低

Hashtable既不支援Null key也不支援Null value。Hashtable的put()方法的註釋中有說明

Hashtable預設的初始大小為11,之後每次擴充,容量變為原來的2n+1。

HashMap預設的初始化大小為16。之後每次擴充,容量變為原來的2倍

Hashtable在計算元素的位置時需要進行一次除法運算,而除法運算是比較耗時的

HashMap為了提高計算效率,將雜湊表的大小固定為了2的冪,這樣在取模預算時,不需要做除法,只需要做位運算。位運算比除法的效率要高很多。

HashMap是繼承自AbstractMap類,而HashTable是繼承自Dictionary類。不過它們都實現了同時實現了map、Cloneable(可複製)、Serializable(可序列化)這三個介面

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

不需要,Ojbect類中有兩個方法equals、hashCode,這兩個方法都是用來比較兩個物件是否相等的,如果兩個物件相等(equal),那麼必須擁有相同 的雜湊碼(hash code)

即使兩個物件有相同的雜湊值(hash code),他們不一定相等

重寫equals()方法就必須重寫hashCode(),但重寫hashcode方法不一定要重寫equals方法

13、Hashmap 執行緒不安全的出現場景

用ConcurrentHashMap 執行緒安全

多執行緒處理時hashmap執行緒不安全

首先hashmap裡這個size沒有用volatile關鍵字修飾,代表這不是一個記憶體可見的變數,執行緒運算元據的時候一般是從主存複製一個變數副本進行操作,操作完成過後在把size的值寫回到主存size的

執行緒不安全問題應該屬於併發問題之一的,屬於相對高階的問題了。這個時候的問題已經不僅僅侷限於程式碼層面了,很多時候需要結合JVM一起分析了

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

定位出現問題的堆疊資訊排查具體問題

1、top命令:Linux命令。可以檢視實時的CPU使用情況。也可以檢視最近一段時間的CPU使用情況。

2、ps命令: Linux命令。強大的程式狀態監控命令。可以檢視程式以及程式中執行緒的當前CPU使用情況。屬於當前狀態的取樣資料。

3、jstack: Java提供的命令。可以檢視某個程式的當前執行緒棧執行情況。根據這個命令的輸出可以定位某個程式的所有執行緒的當前執行狀態、執行程式碼,以及是否死鎖等等。

4、pstack:Linux命令。可以檢視某個程式的當前執行緒棧執行情況

15、JDK 中有哪幾個執行緒池?順帶把執行緒池講了個遍

JUC提供了排程器物件Executors來建立執行緒池,可建立的執行緒池有四種

1、newFixedThreadPool建立一個指定工作執行緒數量的執行緒池。每當提交一個任務就建立一個工作執行緒,如果工作執行緒數量達到執行緒池初始的最大數,則將提交的任務存入到池佇列中。

2、newCachedThreadPool建立一個可快取的執行緒池。這種型別的執行緒池特點是:

1).工作執行緒的建立數量幾乎沒有限制(其實也有限制的,數目為Interger. MAX_VALUE), 這樣可靈活的往執行緒池中新增執行緒。

2).如果長時間沒有往執行緒池中提交任務,即如果工作執行緒空閒了指定的時間(預設為1分鐘),則該工作執行緒將自動終止。終止後,如果你又提交了新的任務,則執行緒池重新建立一個工作執行緒。

3、newSingleThreadExecutor建立一個單執行緒化的Executor,即只建立唯一的工作者執行緒來執行任務,如果這個執行緒異常結束,會有另一個取代它,保證順序執行(我覺得這點是它的特色)。單工作執行緒最大的特點是可保證順序地執行各個任務,並且在任意給定的時間不會有多個執行緒是活動的 。

4、newScheduleThreadPool建立一個定長的執行緒池,而且支援定時的以及週期性的任務執行,類似於Timer。(這種執行緒池原理暫還沒完全瞭解透徹)

15、SQL 最佳化的常見方法有哪些

查詢條件減少使用函式,避免全表掃描

減少不必要的表連線

有些資料操作的業務邏輯可以放到應用層進行實現

可以使用with as

儘量避免使用遊標,因為遊標的效率較差

不要把SQL語句寫得太複雜

不能迴圈執行查詢

用 exists 代替 in

表關聯關係不要太糾結

查詢多用索引列取查,用charindex或者like[0-9]來代替%%

inner關聯的表可以先查出來,再去關聯leftjoin的表

可以進行表關聯資料拆分,即先查出核心資料,再透過核心資料查其他資料,這樣會快得多

參考SQL執行順序進行最佳化

表關聯時取別名,也能提高效率

使用檢視,給檢視建立索引進行最佳化

使用資料倉儲的形式,建立單獨的表儲存資料,根據時間戳定期更新資料。將多表關聯的資料集中抽取存入一張表中,查詢時單表查詢,提高了查詢效率

對查詢進行最佳化,應儘量避免全表掃描,首先應考慮在 where 及 order by 涉及的列上建立索引

應儘量避免在 where 子句中對欄位進行 null 值判斷,否則將導致引擎放棄使用索引而進行全表掃描,如:

select id from t where num is null

可以在num上設定預設值0,確保表中num列沒有null值,然後這樣查詢:

select id from t where num=0

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

17、SQL 索引的順序,欄位的順序

18、檢視 SQL 是不是使用了索引?(有什麼工具)

在select語句前加上EXPLAIN即可

19、TCP 和 UDP 的區別?TCP 資料傳輸過程中怎麼做到可靠的?

UDP(User Data Protocol,使用者資料包協議)是與TCP相對應的協議。它是屬於TCP/IP協議族中的一種

1)為了保證資料包的可靠傳遞,傳送方必須把已傳送的資料包保留在緩衝區;

(2)併為每個已傳送的資料包啟動一個超時定時器;

(3)如在定時器超時之前收到了對方發來的應答資訊(可能是對本包的應答,也可以是對本包後續包的應答),則釋放該資料包占用的緩衝區;

(4)否則,重傳該資料包,直到收到應答或重傳次數超過規定的最大次數為止。

(5)接收方收到資料包後,先進行CRC校驗,如果正確則把資料交給上層協議,然後給傳送方傳送一個累計應答包,表明該資料已收到,如果接收方正好也有資料要發給傳送方,應答包也可方在資料包中捎帶過去。

20、說下你知道的排序演算法吧

常見的內部排序演算法有:插入排序、希爾排序、選擇排序、氣泡排序、歸併排序、快速排序、堆排序、基數排序等

21、查詢一個陣列的中位數?

透過二分查詢法來找中位數

基本思想是:假設ar1[i]是合併後的中位數,那麼ar1[i]大於ar1[]中前i-1個數,且大於ar2[]中前j=n-i-1個數。透過ar1[i]和ar2[j]、ar2[j+1]兩個數的比較,在ar1[i]的左邊或者ar1[i]右邊繼續進行二分查詢。對於兩個陣列 ar1[] 和ar2[], 先在 ar1[] 中做二分查詢。如果在ar1[]中沒找到中位數, 繼續在ar2[]中查詢。

演算法流程:

1) 得到陣列ar1[]最中間的數,假設下標為i.

2) 計算對應在陣列ar2[]的下標j,j = n-i-1

3) 如果 ar1[i] >= ar2[j] and ar1[i] <= ar2[j+1],那麼 ar1[i] 和 ar2[j] 就是兩個中間元素,返回ar2[j] 和 ar1[i] 的平均值

4) 如果 ar1[i] 大於 ar2[j] 和 ar2[j+1] 那麼在ar1[i]的左部分做二分查詢(i.e., arr[left ... i-1])

5) 如果 ar1[i] 小於 ar2[j] 和 ar2[j+1] 那麼在ar1[i]的右部分做二分查詢(i.e., arr[i+1....right])

6) 如果到達陣列ar1[]的邊界(left or right),則在陣列ar2[]中做二分查詢

時間複雜度:O(logn)。

歡迎工作一到五年的Java工程師朋友們加入Java高階架構:867581223

群內提供免費的Java架構學習資料(裡面有高可用、高併發、高效能及分散式、Jvm效能調優、Spring原始碼,

MyBatis,Netty,Redis,Kafka,Mysql,Zookeeper,Tomcat,Docker,Dubbo,Nginx等多個知識點的架構資料)

合理利用自己每一分每一秒的時間來學習提升自己,不要再用"沒有時間“來掩飾自己思想上的懶惰!趁年輕,使勁拼,給未來的自己一個交代!


金三銀四:螞蟻金服JAVA開發面試題及答案之一面(持續更新)


來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/69912582/viewspace-2638520/,如需轉載,請註明出處,否則將追究法律責任。

相關文章