面試十家互聯網公司後的一點小總結
- 2019 年 10 月 7 日
- 筆記
作者:程式設計師共成長
文章來源:程式設計師共成長
前幾天無意中翻到了17年6月份找Java工作的一些面試記錄總結。面試了中金融、阿里巴巴事業部、58到家、小贏金融等公司,於是打算匯總一下,希望幫助到有需要的人。
那時候實際工作經驗兩年剛過,簡歷上我寫了三年經驗。回憶了一下那段時間的面試經歷,總結了面試的內容大致來說有以下幾點。
spring相關以及核心東西、aop/ioc的應用和原理、演算法相關、數據結構、資料庫相關(存儲、原理、事務)、多執行緒(執行緒間通訊、鎖、並發等)、Java常用包、類的原理、中間件(Redis、zookeeper、MQ、Nginx、Dubbo等等)、負載均衡/集群..
這裡就不詳細說面試中的每個問題了,因為上面是面試了很多家之後進行了一個大概的匯總。簡單的說一下幾個當時回答的不是很滿意的問題吧
1、HashMap的數據結構
我們知道數據存儲的數據結構有數組(順序存儲)和鏈表(鏈式存儲)
數組存儲區間是連續的,佔用記憶體嚴重,通過下標查找時時間複雜度為O(1),如果通過值查詢元素此時需要遍歷整個數組,所以時間複雜度為O(n), 如果對目標元素插入或刪除,都會導致後面元素的Index發生改變,所以時間複雜度也是O(n)。總結來看數組的特點為:定址容易,插入和刪除比較困難。
相反鏈表存儲區間離散,佔用記憶體比較寬鬆。通過節點之間的引用對數據進行處理,特點是:定址難,插入和刪除簡單。
這樣看來兩種數據結構基本算是兩個極端。而HashMap就比較牛逼了,他是由數組+鏈表結構實現的。順序存儲就是按照順序去分配記憶體空間,鏈式存儲在記憶體中離散存放。每一個元素對象都存儲著下一個元素對象的記憶體地址。部分源碼如下所示
static class Node<K,V> implements Map.Entry<K,V> { final int hash; // hash值,不可變 final K key; //key-value V value; //key-value Node<K,V> next; //下一個節點 Node(int hash, K key, V value, Node<K,V> next) { this.hash = hash; this.key = key; this.value = value; this.next = next; }
2、HashMap和ConcurrentHashMap的區別
其實這個第一個問題是連著問的,我們知道HashMap是執行緒不安全的,並發環境下進行put、get操作時會導致cpu利用率接近100%。那HashTable是執行緒安全的是否適用於並發和環境呢?HashTable的get/put操作都是synchronize的。那就意味著多個執行緒訪問的時候,只能有一個執行緒去操作對象,其他執行緒只能阻塞。這樣就會導致性能很差。
這個時候就引入了ConcurrentHashMap分段鎖的概念。它會對數據進行分段加鎖,每一段數據一個鎖,多執行緒訪問對象中的不同段數據就不會發生競爭鎖導致的阻塞現象了。

3、Mysql索引的數據結構是什麼?
Mysql的索引的數據結構是樹,常用的InnoDB引擎採用的數據結構是B+Tree
4、Mysql中插入一條數據底層做了什麼?
存儲引擎把事務寫進日誌緩衝(log buffer),再有日誌緩衝把事務刷新到事務日誌中。然後引擎再把事務寫進緩衝池(Buffer pool)。以上步驟執行完畢整個事務就算提交完畢了。
5、MQ
MQ是一種跨系統傳遞數據的服務,過程為非同步操作。操作過程為生產者創建消息,然後再發布到代理伺服器。消息包含兩部分:有效載荷(payload)和標籤(label)。有效載荷就是你要傳輸的數據,可以使任意類型,一般都是json。而標籤則是決定誰將獲取到這份消息。MQ會根據標籤將消息發送給相對應的接收方。這種通訊方式是『發後既忘』的單項模式,不需要知道接收者是誰。比如在線交易系統為了保證數據最終一致性,在支付系統處理完成後會把字元的結果放到MQ中,通過訂單系統修改支付狀態。
MQ有兩種模式:
1、點對點模式。顧名思義每個人消息只能有一個消費者,此過程需要接收者確認消息接收和處理成功。
2、發布-訂閱模式
一條消息可能會有多個消費者,消費者需要和生產者之間建立一個訂閱關係。消費者必須保持持續的運行狀態去接受消息。除非消費者建立了持久的訂閱
應用程式和MQ連接成功後,會創建一條TCP連接,一旦TCP連接打開,通過了認證。應用程式就可以創建一條AMQP信道。信道是建立在TCP連接中的虛擬連接。每條信道都會有一個唯一ID,不管是消費消息還是生產消息都是通過信道完成的。
為什麼不直接通過TCP連接發送命令呢?對於作業系統來說建立和消費TCP的開銷是非常大的。高峰時期飛秒成千上萬條MQ資訊,不僅造成了連接巨大的浪費,而且作業系統一定時間內創建的tcp連接又是有限的。其實我們可以把整個過程想像成一個一束光纖電纜就可以了。

6、SpringBoot
SpringBoot常用的starter有哪些?
spring-boot-starter:核心啟動器
sprint-boot-starter-web:使用Spring MVC構建Web(包括RESTful)應用程式的入門者。使用Tomcat作為默認嵌入式容器
spring-boot-starter-data-jpa:資料庫支援
spring-boot-starter-data-elasticsearch:springboot支援elasticsearch
mybatis-spring-boot-starter:集成mybatis
spring-boot-starter-data-redis:redis的支援
spring-boot-starter-logging:日誌模組
SpringBoot有哪些常用註解:
@RestController:用於標註控制層組件(如struts中的action),等同於@Controller + @ResponseBody。
@Configuration:指出該類是 Bean 配置的資訊源,相當於XML中的<beans></beans>,一般加在主類上。
@RequestMapping:RequestMapping是一個用來處理請求地址映射的註解,可用於類或方法上
@EnableAutoConfiguration:讓 Spring Boot 根據應用所聲明的依賴來對 Spring 框架進行自動配置,一般加在主類上。
@ComponentScan:組件掃描。個人理解相當於<context:component-scan>,如果掃描到有@Component @Controller @Service等這些註解的類,則把這些類註冊為bean
等等就不一一舉例了
運行SpringBoot的方式:
1、打包放到容器中啟動
2、Main方法啟動
3、Maven、Gradle插件啟動
還有問到了配置文件.properties和.yml的有些書寫格式、以及啟動原理、載入順序等..
7、總結
面試過程中,面試官主要圍繞著簡歷中項目經驗用到的技術去考察面試者。此次面試發現了很多不足,以後工作中對於常用的東西不光要知其然,更要知其所以然。對於有些比較基礎的東西,當面試官問到底層原理的時候,回答起來就不是很流暢。其次有的面試官還會問某些場景某些問題的解決方案。如果大家有面試了,可以提前在招聘網站看看這個公司的技術棧,提前做點準備,有些基礎的東西往往是最容易忽略的點。