阿里釘釘4面經驗分享(校招)

釘釘一面

一、SpringBoot的優勢?html

1)建立獨立的Spring應用程序。SpringBoot能夠jar包的形式進行獨立的運行,使用:java -jar xx.jar就能夠成功運行項目,或者在項目的主程序中運行main函數。前端

2)springboot項目不須要單獨下載Tomcat等傳統服務器,內嵌容器,使得咱們能夠執行運行項目的主程序main函數,並讓項目的快速運行,另外,也下降對運行環境的基本要求,環境變量中有JDK便可。java

3)Spring Boot提供了一系列的starter pom用來簡化咱們的Maven依賴,經過這些starter項目就能以Java Application的形式運行Spring Boot項目,而無需其餘服務器配置。mysql

4)Spring Boot提供Spring框架的最大自動化配置,大量使用自動配置,使得開發者對Spring的配置儘可能減小。Spring Boot更多的是採用 Java Config 的方式,對 Spring 進行配置。linux

可參考:https://www.cnblogs.com/echol...web

二、ThreadLocal原理,應用場景面試

ThreadLocal主要用來存儲當前線程上下文的變量信息,它能夠保障存儲進去的數據,只能被當前線程讀取到,而且線程之間不會相互影響。ThreadLocal爲變量在每一個線程中都建立了一個副本,那麼每一個線程能夠訪問本身內部的副本變量。redis

ThreadLocal有哪些典型的應用場景:算法

1)數據庫事務。經過AOP的方式,對執行數據庫事務的函數進行攔截。函數開始前,獲取connection開啓事務並存儲在ThreadLocal中,任何用到connection的地方,從ThreadLocal中獲取,函數執行完畢後,提交事務釋放connection。spring

2)web項目中,用戶的登陸信息一般保存在session中。作一個攔截器,把用戶信息放在ThreadLocal中,在任何用到用戶信息的時候,只須要從TreadLocal中讀取就能夠了。

ThreadLocal 內部維護了一個ThreadLocalMap 的靜態內部類。ThreadLocalMap 中使用的 key 爲 ThreadLocal 的弱引用,弱引用的特色是,若是這個對象只存在弱引用,那麼在下一次垃圾回收的時候必然會被清理掉。

三、AtmoicInteger的原理,CAS原理

cas:將指定內存地址的內容與所給的某個值相比,若是相等,則將其內容替換爲指令中提供的新值,若是不相等,則更新失敗。AtomicInteger的本質:自旋鎖+CAS原子操做。AtomicInteger中用的就是Unsafe的CAS操做。
四、ReentrantLock,synchronized的區別

1)Synchronize是基於jvm的,ReentrantLok是基於JDK的。
2)ReentrantLock多了幾條特性。等待鎖的線程可終止,可實現公平。
3)ReentrantLock可實現選擇性通知。synchronized中wait notify,notifyAll時是喚醒全部wait的線程。而ReentrantLock中Condition可建立多個,siginalAll時喚醒的是那個Condition實例wait的全部線程。

五、ConcurrentHashmap的底層數據結構,put操做

ConcurrentHashMap的數據結構(數組+鏈表+紅黑樹),桶中的結構多是鏈表,也多是紅黑樹,紅黑樹是爲了提升查找效率。

說明:put函數底層調用了putVal進行數據的插入,對於putVal函數的流程大致以下。

① 判斷存儲的key、value是否爲空,若爲空,則拋出異常,不然,進入步驟②

② 計算key的hash值,隨後進入無限循環,該無限循環能夠確保成功插入數據,若table表爲空或者長度爲0,則初始化table表,不然,進入步驟③

③ 根據key的hash值取出table表中的結點元素,若取出的結點爲空(該桶爲空),則使用CAS將key、value、hash值生成的結點放入桶中。不然,進入步驟④

④ 若該結點的的hash值爲MOVED,則對該桶中的結點進行轉移,不然,進入步驟⑤

⑤ 對桶中的第一個結點(即table表中的結點)進行加鎖,對該桶進行遍歷,桶中的結點的hash值與key值與給定的hash值和key值相等,則根據標識選擇是否進行更新操做(用給定的value值替換該結點的value值),若遍歷完桶仍沒有找到hash值與key值和指定的hash值與key值相等的結點,則直接新生一個結點並賦值爲以前最後一個結點的下一個結點。進入步驟⑥

⑥ 若binCount值達到紅黑樹轉化的閾值,則將桶中的結構轉化爲紅黑樹存儲,最後,增長binCount的值。

將ConcurrentHashMap容器的數據分段存儲,每一段數據分配一個Segment(鎖),當線程佔用其中一個Segment時,其餘線程可正常訪問其餘段數據。

六、final 和 finally的區別

1.當用final修飾類的時,代表該類不能被其餘類所繼承。

2.final修飾方法,把方法鎖定,以防止繼承類對其進行更改。

3.final成員變量表示常量,只能被賦值一次,賦值後其值再也不改變。當final修飾一個基本數據類型時,表示該基本數據類型的值一旦在初始化後便不能發生變化;若是final修飾一個引用類型時,則在對其初始化以後便不能再讓其指向其餘對象了,但該引用所指向的對象的內容是能夠發生變化的。

finally做爲異常處理的一部分,它只能用在try/catch語句中,而且附帶一個語句塊,表示這段語句最終必定會被執行(無論有沒有拋出異常),常常被用在須要釋放資源的狀況下。

七、JVM GC,何時執行minorGC,fullGC

Minor GC觸發條件:當Eden區滿時,觸發Minor GC。
Full GC觸發條件:

(1)調用System.gc時,系統建議執行Full GC,可是沒必要然執行

(2)老年代空間不足

若是建立一個大對象,Eden區域當中放不下這個大對象,會直接保存在老年代當中,若是老年代空間也不足,就會觸發Full GC。爲了不這種狀況,最好就是不要建立太大的對象。

(3)由Eden區、From Space區向To Space區複製時,對象大小大於To Space可用內存,則把該對象轉存到老年代,且老年代的可用內存小於該對象大小。

八、CMS的過程,優缺點,使用場景

1)初始標記(CMS initial mark)只是標記一下GC Roots可以直接關聯的對象,速度很快,仍然須要暫停全部的工做線程。

2)併發標記(CMS concurrent mark)和用戶線程一塊兒。進行GC Roots跟蹤過程,和用戶線程一塊兒工做,不須要暫停工做線程。主要標記過程,標記所有對象

3)從新標記(CMS remark)。爲了修正併發標記期間,因用戶程序繼續運行而致使標記產生變更的那一部分對象的標記記錄,仍然須要暫停全部的工做線程。

4)併發清除(CMS concurrent sweep)和用戶線程一塊兒。清除GC Roots不可達對象,和用戶線程一塊兒工做,不須要暫停工做線程。基於標記結果,直接清理對象

因爲耗時最長的併發標記和併發清除過程當中,垃圾收集線程能夠和用戶如今一塊兒併發工做,因此整體上看來CMS收集器的內存回收和用戶線程是一塊兒併發的執行。

優勢:併發收集停頓低。

缺點:併發執行,cpu資源壓力大。

因爲併發進行,CMS在收集與應用線程會同時增長對堆內存的佔用,也就是說,CMS必需要在老年代堆內
存用盡以前完成垃圾回收,不然CMS回收失敗時,將出發擔保機制,串行老年代收集器將會以STW的方式
進行一次GC,從而形成較大停頓時間。

採用的標記清除算法致使大量的碎片。標記清除算法沒法整理空間碎片,老年代空間會隨着應用時長被逐步耗盡,最後將不得不經過擔保機制堆
堆內存進行壓縮。

九、AOP是什麼,實現原理

面向切面編程。AOP技術利用一種稱爲「橫切」的技術,解剖封裝的對象內部,並將那些影響了多個類的公共行爲封裝到一個可重用模塊,這樣就能減小系統的重複代碼。經常使用在權限認證、日誌、事務處理。

實現原理是動態代理。InvocationHandler。Itask taskProxy= (Itask) Proxy.newProxyInstance(Itask.class.getClassLoader(),new Class[]{Itask.class},invocationHandler);

十、索引,數據庫鎖

彙集索引就是以主鍵建立的索引。非彙集索引就是以非主鍵建立的索引。彙集索引在葉子節點存儲的是表中的數據。非彙集索引在葉子節點存儲的是主鍵和索引列。

使用非彙集索引查詢出數據時,拿到葉子上的主鍵再去查到想要查找的數據。

1)最左前綴匹配原則。MySQL會一直向右匹配直到遇到範圍查詢(>,<,BETWEEN,LIKE)就中止匹配。

2)儘可能選擇區分度高的列做爲索引,區分度的公式是 COUNT(DISTINCT col) / COUNT(*)。

表示字段不重複的比率,比率越大咱們掃描的記錄數就越少。

3)索引列不能參與計算,儘可能保持列「乾淨」。好比,FROM_UNIXTIME(create_time) = '2016-06-06' 就不能使用索引,緣由很簡單,B+樹中存儲的都是數據表中的字段值,可是進行檢索時,須要把全部元素都應用函數才能比較,顯然這樣的代價太大。因此語句要寫成 :create_time = UNIX_TIMESTAMP('2016-06-06')。

4)儘量的擴展索引,不要新創建索引。好比表中已經有了a的索引,如今要加(a,b)的索引,那麼只須要修改原來的索引便可。

5)單個多列組合索引和多個單列索引的檢索查詢效果不一樣,由於在執行SQL時,MySQL只能使用一個索引,會從多個單列索引中選擇一個限制最爲嚴格的索引。

可參考:https://www.cnblogs.com/yelon...

InnoDB只有經過索引條件檢索數據才使用行級鎖,不然,InnoDB將使用表鎖。也就是說,InnoDB的行鎖是基於索引的!
在表讀鎖和表寫鎖的環境下:讀讀不阻塞,讀寫阻塞,寫寫阻塞!

InnoDB實現瞭如下兩種類型的行鎖。

共享鎖(S鎖):容許一個事務去讀一行,阻止其餘事務得到相同數據集的排他鎖。

也叫作讀鎖:讀鎖是共享的,多個客戶能夠同時讀取同一個資源,但不容許其餘客戶修改。

排他鎖(X鎖):容許得到排他鎖的事務更新數據,阻止其餘事務取得相同數據集的共享讀鎖和排他寫鎖。

也叫作寫鎖:寫鎖是排他的,寫鎖會阻塞其餘的寫鎖和讀鎖。

十一、Mysql隔離級別

1)髒讀:A,B兩事務,A事務會讀取到B事務未提交的數據,而後B由於某些緣由回滾數據,因此A就讀取了B沒有提交的數據,也稱髒數據。

2)不可重複讀:在A事務中對同一數據兩次查詢不一致,可能緣由是在A事務提交以前B事務對該數據進行了操做

3)幻讀:相似於不可重複讀,都是在一個事務週期內讀的數據不一致,區別在於幻讀是側重於插入操做帶來的影響,而不可重複讀是編輯或者刪除帶來的影響

  • 未提交讀(read-uncommitted)

在一個事務中,能夠讀取到其餘事務未提交的數據變化,這種讀取其餘會話還沒提交的事務,叫作髒讀現象,在生產環境中切勿使用。

  • 已提交讀(read-committed)

在一個事務中,能夠讀取到其餘事務已經提交的數據變化,這種讀取也就叫作不可重複讀,由於兩次一樣的查詢可能會獲得不同的結果。

  • 可重複讀(repetable-read)

MySQL默認隔離級別,在一個事務中,直到事務結束前,均可以反覆讀取到事務剛開始時看到的數據,並一直不會發生變化,避免了髒讀、不可重複讀現象,可是它仍是沒法解決幻讀問題。

  • 可串行化(serializable)

這是最高的隔離級別,它強制事務串行執行,避免了前面說的幻讀現象,簡單來講,它會在讀取的每一行數據上都加鎖,因此可能會致使大量的超時和鎖爭用問題。

十二、瞭解的加密算法

常見的加密算法可分爲三大類:對稱加密,非對稱加密和hash算法。

對稱加密:使用同一個密鑰來加密和解密數據。DES,AES。

非對稱加密:使用RSA通常須要產生公鑰和私鑰,當採用公鑰加密時,使用私鑰解密;採用私鑰加密時,使用公鑰解密。RSA加密是對明文的E次方後除以N後求餘數的過程。

hash算法:MD5。

1三、OOM怎麼解決

1)java.lang.StackOverflowError
棧空間溢出 ,遞歸調用卡死

2)java.lang.OutOfMemoryError:Java heap space
堆內存溢出 , 對象過大

3)java.lang.OutOfMemoryError:GC overhead limit exceeded
GC回收時間過長

過長的定義是超過98%的時間用來作GC而且回收了而不倒2%的堆內存
連續屢次GC,都回收了不到2%的極端狀況下才會拋出

若是不拋出,那就是GC清理的一點內存很快會被再次填滿,迫使GC再次執行,這樣就惡性循環,
cpu使用率一直是100%,二GC卻沒有任何成果。

4)java.lang.OutOfMemoryError:Direct buffer memory

5)java.lang.OutOfMemoryError:unable to create new native thread

1四、Java、Go、C++的優缺點

1五、判斷鏈表是否對稱

掃描鏈表的全部節點並一一進棧,而後再掃描鏈表,和棧頂元素做比較,若是都相同,返回true,不然返回false

1六、20億個數求中位數

可參考:https://www.zhihu.com/tardis/...

釘釘二面 3.31

1,描述二叉樹,二叉樹的應用

2,隊列,棧。在你項目中的應用

3,除了redis的五種基本數據類型,還用到了哪些數據結構。

4,秒殺項目,怎麼解決超賣問題

5,悲觀鎖、樂觀鎖的實現

6,數據庫行鎖的原理,mysql怎麼實現的

7,悲觀鎖、樂觀鎖的優缺點

8,聚簇索引

9,數據庫的垂直切分

10,爲何用redis,redis數據丟失了怎麼辦?

11,ngnix說一下

12,負載均衡說一下?加權輪訓的權值表明什麼?服務器的併發能力有哪些影響因素?

13,系統怎麼部署的?

14,怎麼提升系統的併發能力?

15,linux的基本命令,怎麼查看日誌的

16,SpringBoot帶來的好處

17,Spring IOC的原理,Spring怎麼管理bean的?

釘釘三面 4.3

1,怎麼提高系統的併發能力(從索引優化、讀寫分離、分庫分表說到redis主從集羣、分佈式鎖、mq解耦異步削峯、ngnix、限流)面試官補充說還要考慮網路傳輸、前端優化等等。

2,分庫分表是什麼?爲何須要分庫分表?

3,什麼是讀擴散,寫擴散?

4,說java裏面3個壞的寫法和三個好的寫法

5,線程池有什麼好處,節約的時間主要來自哪?

6,內存泄漏

7,本身遇到過最困難的事情,差點要放棄

8,投遞過哪些公司?(網易、小米。)對這倆公司的見解?若是阿里加班嚴重你會咋辦?對加班的見解。

9,畢設作的怎麼樣了?

10,你筆試成績不是很好,本身有哪些優點?

釘釘交叉面 4.11,30分鐘

一、編程題,給一個字符串「 Abcd, 0。0dc ba「判斷是不是迴文子串(空格、逗號、句號能夠忽略不算)。

二、介紹一下https經過什麼加密,https經過什麼驗證請求方不是假的。

三、從OSI模型考慮,說一下輸入www.taobao.com 會發生什麼

四、介紹一下Java怎麼進行內存管理的(jvm內存區域,gc算法,minor full gc執行的時機,垃圾回收器)

五、動態代理的原理,應用場景

六、線程和進程的區別

七、編程題,給定一個字符串S1,每次只能把一個字符移動到最後一位,問最少移動多少次能變成S2。口頭描述思路。

阿里HR面 4.11,60分鐘

介紹項目、作的最厲害的事、最委屈的事、遇到的挫折、大學的學習和生活、研究生的學習和生活、家庭狀況。
主要是看是否樂觀、皮實。

原文連接:
https://www.nowcoder.com/disc...
文源網絡,僅供學習之用,若有侵權,聯繫刪除。

我將優質的技術文章和經驗總結都聚集在了個人公衆號【Java圈子】裏。

爲方便你們學習,我還整理了一套學習資料,涵蓋Java虛擬機、spring框架、Java線程、數據結構、設計模式等等,免費提供給熱愛Java的同窗~

file

相關文章
相關標籤/搜索