大家好,我是小林。0eo28資訊網——每日最新資訊28at.com
華為面試流程總共是 3 輪技術面+1 輪 hr 面,在約面之前,還得先進行機試,基本都是算法題,達到150分就算機試通過,然后就進行后面的技術面試。0eo28資訊網——每日最新資訊28at.com
圖片0eo28資訊網——每日最新資訊28at.com
華為的面試難度相比互聯網公司會簡單一點,不會問太深的技術原理,問的題目也不會很多,大概都是 10 -20 個問題,相比互聯網大廠一場面試動不動就問 30 個問題,確實壓力相對小一點。0eo28資訊網——每日最新資訊28at.com
今天給大家分享一位同學華為二面的面經,面試者的技術棧是Java,主要問了Spring、Java集合、并發、網絡、mysql 方面的問題,并且還有手撕算法的過程。0eo28資訊網——每日最新資訊28at.com
八股
Spring中的事務的隔離級別有哪些?
Sping 中的事務隔離級別有 5 種,它們分別是:0eo28資訊網——每日最新資訊28at.com
- DEFAULT:Spring 中默認的事務隔離級別,以連接的數據庫的事務隔離級別為準;
- READ_UNCOMMITTED:讀未提交,也叫未提交讀,該隔離級別的事務可以看到其他事務中未提交的數據。該隔離級別因為可以讀取到其他事務中未提交的數據,而未提交的數據可能會發生回滾,因此我們把該級別讀取到的數據稱之為臟數據,把這個問題稱之為臟讀;
- READ_COMMITTED:讀已提交,也叫提交讀,該隔離級別的事務能讀取到已經提交事務的數據,因此它不會有臟讀問題。但由于在事務的執行中可以讀取到其他事務提交的結果,所以在不同時間的相同 SQL 查詢中,可能會得到不同的結果,這種現象叫做不可重復讀;
- REPEATABLE_READ:可重復讀,它能確保同一事務多次查詢的結果一致。但也會有新的問題,比如此級別的事務正在執行時,另一個事務成功的插入了某條數據,但因為它每次查詢的結果都是一樣的,所以會導致查詢不到這條數據,自己重復插入時又失敗(因為唯一約束的原因)。明明在事務中查詢不到這條信息,但自己就是插入不進去,這就叫幻讀 (Phantom Read);
- SERIALIZABLE:串行化,最高的事務隔離級別,它會強制事務排序,使之不會發生沖突,從而解決了臟讀、不可重復讀和幻讀問題,但因為執行效率低,所以真正使用的場景并不多。
所以,相比于 MySQL 的事務隔離級別,Spring 中多了一種 DEFAULT 的事務隔離級別。針對不同的隔離級別,并發事務時可能發生的現象也會不同。
也就是說:0eo28資訊網——每日最新資訊28at.com
- 在「讀未提交」隔離級別下,可能發生臟讀、不可重復讀和幻讀現象;
- 在「讀提交」隔離級別下,可能發生不可重復讀和幻讀現象,但是不可能發生臟讀現象;
- 在「可重復讀」隔離級別下,可能發生幻讀現象,但是不可能臟讀和不可重復讀現象;
- 在「串行化」隔離級別下,臟讀、不可重復讀和幻讀現象都不可能會發生。
Spring事務的傳播行為有哪些?
在Spring中對于事務的傳播行為定義了七種類型分別是:REQUIRED、SUPPORTS、MANDATORY、REQUIRES_NEW、NOT_SUPPORTED、NEVER、NESTED。0eo28資訊網——每日最新資訊28at.com
支持當前事務的:REQUIRED、SUPPORTS、MANDATORY;不支持當前事務的:REQUIRES_NEW、NOT_SUPPORTED、NEVER,以及嵌套事務 NESTED,其中 REQUIRED 是默認的事務傳播級別。0eo28資訊網——每日最新資訊28at.com
事務傳播行為類型0eo28資訊網——每日最新資訊28at.com | 說明0eo28資訊網——每日最新資訊28at.com |
PROPAGATION_REQUIRED0eo28資訊網——每日最新資訊28at.com | 如果當前沒有事務,就新建一個事務,如果已經存在一個事務中,加入到這個事務中。這是最常見的選擇。0eo28資訊網——每日最新資訊28at.com |
PROPAGATION_SUPPORTS0eo28資訊網——每日最新資訊28at.com | 支持當前事務,如果當前沒有事務,就以非事務方式執行。0eo28資訊網——每日最新資訊28at.com |
PROPAGATION_MANDATORY0eo28資訊網——每日最新資訊28at.com | 使用當前的事務,如果當前沒有事務,就拋出異常。0eo28資訊網——每日最新資訊28at.com |
PROPAGATION_REQUIRES_NEW0eo28資訊網——每日最新資訊28at.com | 新建事務,如果當前存在事務,把當前事務掛起。0eo28資訊網——每日最新資訊28at.com |
PROPAGATION_NOT_SUPPORTED0eo28資訊網——每日最新資訊28at.com | 以非事務方式執行操作,如果當前存在事務,就把當前事務掛起。0eo28資訊網——每日最新資訊28at.com |
PROPAGATION_NEVER0eo28資訊網——每日最新資訊28at.com | 以非事務方式執行,如果當前存在事務,則拋出異常。0eo28資訊網——每日最新資訊28at.com |
PROPAGATION_NESTED0eo28資訊網——每日最新資訊28at.com | 如果當前存在事務,則在嵌套事務內執行。如果當前沒有事務,則執行與PROPAGATION_REQUIRED類似的操作。0eo28資訊網——每日最新資訊28at.com |
多態解決了什么問題?
多態是指子類可以替換父類,在實際的代碼運行過程中,調用子類的方法實現。多態這種特性也需要編程語言提供特殊的語法機制來實現,比如繼承、接口類。0eo28資訊網——每日最新資訊28at.com
多態可以提高代碼的擴展性和復用性,是很多設計模式、設計原則、編程技巧的代碼實現基礎。比如策略模式、基于接口而非實現編程、依賴倒置原則、里式替換原則、利用多態去掉冗長的 if-else 語句等等0eo28資訊網——每日最新資訊28at.com
HashMap是線程安全的嗎?
hashmap不是線程安全的,hashmap在多線程會存在下面的問題:0eo28資訊網——每日最新資訊28at.com
- JDK 1.7 HashMap 采用數組 + 鏈表的數據結構,多線程背景下,在數組擴容的時候,存在 Entry 鏈死循環和數據丟失問題。
- JDK 1.8 HashMap 采用數組 + 鏈表 + 紅黑二叉樹的數據結構,優化了 1.7 中數組擴容的方案,解決了 Entry 鏈死循環和數據丟失問題。但是多線程背景下,put 方法存在數據覆蓋的問題。
如果要保證線程安全,可以通過這些方法來保證:0eo28資訊網——每日最新資訊28at.com
- 多線程環境可以使用Collections.synchronizedMap同步加鎖的方式,還可以使用HashTable,但是同步的方式顯然性能不達標,而ConurrentHashMap更適合高并發場景使用。
- ConcurrentHashmap在JDK1.7和1.8的版本改動比較大,1.7使用Segment+HashEntry分段鎖的方式實現,1.8則拋棄了Segment,改為使用CAS+synchronized+Node實現,同樣也加入了紅黑樹,避免鏈表過長導致性能的問題。
Java中的線程安全的集合是什么?
在 java.util 包中的線程安全的類主要 2 個,其他都是非線程安全的。0eo28資訊網——每日最新資訊28at.com
- Vector:線程安全的動態數組,其內部方法基本都經過synchronized修飾,如果不需要線程安全,并不建議選擇,畢竟同步是有額外開銷的。Vector 內部是使用對象數組來保存數據,可以根據需要自動的增加容量,當數組已滿時,會創建新的數組,并拷貝原有數組數據。
- Hashtable:線程安全的哈希表,HashTable 的加鎖方法是給每個方法加上 synchronized 關鍵字,這樣鎖住的是整個 Table 對象,不支持 null 鍵和值,由于同步導致的性能開銷,所以已經很少被推薦使用,如果要保證線程安全的哈希表,可以用ConcurrentHashMap。
java.util.concurrent 包提供的都是線程安全的集合:0eo28資訊網——每日最新資訊28at.com
ConcurrentHashMap:它與 HashTable 的主要區別是二者加鎖粒度的不同,在JDK1.7,ConcurrentHashMap加的是分段鎖,也就是Segment鎖,每個Segment 含有整個 table 的一部分,這樣不同分段之間的并發操作就互不影響。在JDK 1.8 ,它取消了Segment字段,直接在table元素上加鎖,實現對每一行進行加鎖,進一步減小了并發沖突的概率。對于put操作,如果Key對應的數組元素為null,則通過CAS操作(Compare and Swap)將其設置為當前值。如果Key對應的數組元素(也即鏈表表頭或者樹的根元素)不為null,則對該元素使用 synchronized 關鍵字申請鎖,然后進行操作。如果該 put 操作使得當前鏈表長度超過一定閾值,則將該鏈表轉換為紅黑樹,從而提高尋址效率。0eo28資訊網——每日最新資訊28at.com
ConcurrentSkipListMap:實現了一個基于SkipList(跳表)算法的可排序的并發集合,SkipList是一種可以在對數預期時間內完成搜索、插入、刪除等操作的數據結構,通過維護多個指向其他元素的“跳躍”鏈接來實現高效查找。0eo28資訊網——每日最新資訊28at.com
ConcurrentSkipListSet:是線程安全的有序的集合。底層是使用ConcurrentSkipListMap實現。0eo28資訊網——每日最新資訊28at.com
CopyOnWriteArraySet:是線程安全的Set實現,它是線程安全的無序的集合,可以將它理解成線程安全的HashSet。有意思的是,CopyOnWriteArraySet和HashSet雖然都繼承于共同的父類AbstractSet;但是,HashSet是通過“散列表”實現的,而CopyOnWriteArraySet則是通過“動態數組(CopyOnWriteArrayList)”實現的,并不是散列表。0eo28資訊網——每日最新資訊28at.com
CopyOnWriteArrayList:它是 ArrayList 的線程安全的變體,其中所有寫操作(add,set等)都通過對底層數組進行全新復制來實現,允許存儲 null 元素。即當對象進行寫操作時,使用了Lock鎖做同步處理,內部拷貝了原數組,并在新數組上進行添加操作,最后將新數組替換掉舊數組;若進行的讀操作,則直接返回結果,操作過程中不需要進行同步。0eo28資訊網——每日最新資訊28at.com
ConcurrentLinkedQueue:是一個適用于高并發場景下的隊列,它通過無鎖的方式(CAS),實現了高并發狀態下的高性能。通常,ConcurrentLinkedQueue 的性能要好于 BlockingQueue 。0eo28資訊網——每日最新資訊28at.com
BlockingQueue:與 ConcurrentLinkedQueue 的使用場景不同,BlockingQueue 的主要功能并不是在于提升高并發時的隊列性能,而在于簡化多線程間的數據共享。BlockingQueue 提供一種讀寫阻塞等待的機制,即如果消費者速度較快,則 BlockingQueue 則可能被清空,此時消費線程再試圖從 BlockingQueue 讀取數據時就會被阻塞。反之,如果生產線程較快,則 BlockingQueue 可能會被裝滿,此時,生產線程再試圖向 BlockingQueue 隊列裝入數據時,便會被阻塞等待。0eo28資訊網——每日最新資訊28at.com
LinkedBlockingDeque:是一個線程安全的雙端隊列實現。它的內部使用鏈表結構,每一個節點都維護了一個前驅節點和一個后驅節點。LinkedBlockingDeque 沒有進行讀寫鎖的分離,因此同一時間只能有一個線程對其進行操作0eo28資訊網——每日最新資訊28at.com
ConcurrentLinkedDeque:ConcurrentLinkedDeque是一種基于鏈接節點的無限并發鏈表。可以安全地并發執行插入、刪除和訪問操作。當許多線程同時訪問一個公共集合時,ConcurrentLinkedDeque是一個合適的選擇。0eo28資訊網——每日最新資訊28at.com
ConcurrentHashMap用了悲觀鎖還是樂觀鎖?
悲觀鎖和樂觀鎖都有用到。0eo28資訊網——每日最新資訊28at.com
添加元素時首先會判斷容器是否為空:0eo28資訊網——每日最新資訊28at.com
- 如果為空則使用 volatile 加 CAS (樂觀鎖) 來初始化。
- 如果容器不為空,則根據存儲的元素計算該位置是否為空。
如果根據存儲的元素計算結果為空,則利用 CAS(樂觀鎖) 設置該節點;0eo28資訊網——每日最新資訊28at.com
如果根據存儲的元素計算結果不為空,則使用 synchronized(悲觀鎖) ,然后,遍歷桶中的數據,并替換或新增節點到桶中,最后再判斷是否需要轉為紅黑樹,這樣就能保證并發訪問時的線程安全了。0eo28資訊網——每日最新資訊28at.com
樂觀鎖是怎樣實現的?
樂觀鎖假設多個事務之間很少發生沖突,因此在讀取數據時不會加鎖,而是在更新數據時檢查數據的版本(如使用版本號或時間戳),如果版本匹配則執行更新操作,否則認為發生了沖突。0eo28資訊網——每日最新資訊28at.com
樂觀鎖適用于讀多寫少的場景,可以減少鎖的競爭,提高并發性能。例如,數據庫中的樂觀鎖機制可以用于處理并發更新同一行數據的情況。0eo28資訊網——每日最新資訊28at.com
樂觀鎖實現方式可以通過 CAS 來實現。0eo28資訊網——每日最新資訊28at.com
CAS叫做CompareAndSwap,比較并交換,主要是通過處理器的指令來保證操作的原子性,它包含三個操作數:0eo28資訊網——每日最新資訊28at.com
- 變量內存地址,V表示
- 舊的預期值,A表示
- 準備設置的新值,B表示
當執行CAS指令時,只有當V等于A時,才會用B去更新V的值,否則就不會執行更新操作。0eo28資訊網——每日最新資訊28at.com
Http1.0和2.0的區別是什么?
- 協議版本:Http/1.0 是較早的版本,采用文本格式進行通信,雖然支持長連接,但是默認是使用短連接。從 http/1.1版本開始,默認是用了長連接,Http/2.0 是較新的版本,引入了二進制格式,以及多路復用等新特性。
- 性能:Http/1.0 每次請求只能響應一個資源,多個資源需要多次請求,存在隊頭阻塞問題。Http/2.0 支持多路復用,可以在單個連接上同時傳輸多個請求和響應,提高性能。
- 頭部壓縮:Http/1.0 每次請求和響應都需要攜帶完整的頭部信息,存在較大的開銷。Http/2.0 引入了頭部壓縮機制,減少了重復頭部信息的傳輸,提高了效率。
- 服務器推送:Http/1.0 需要等待客戶端請求后才能發送響應,無法主動推送資源。Http/2.0 支持服務器推送,服務器可以在客戶端請求之前將相關資源推送給客戶端,減少等待時間。
MySQL中的bin log的作用是什么?
binlog 是 MySQL 的 Server 層實現的日志,用于備份恢復、主從復制。0eo28資訊網——每日最新資訊28at.com
binlog 有 3 種格式類型,分別是 STATEMENT(默認格式)、ROW、 MIXED,區別如下:0eo28資訊網——每日最新資訊28at.com
- STATEMENT:每一條修改數據的 SQL 都會被記錄到 binlog 中(相當于記錄了邏輯操作,所以針對這種格式, binlog 可以稱為邏輯日志),主從復制中 slave 端再根據 SQL 語句重現。但 STATEMENT 有動態函數的問題,比如你用了 uuid 或者 now 這些函數,你在主庫上執行的結果并不是你在從庫執行的結果,這種隨時在變的函數會導致復制的數據不一致;
- ROW:記錄行數據最終被修改成什么樣了(這種格式的日志,就不能稱為邏輯日志了),不會出現 STATEMENT 下動態函數的問題。但 ROW 的缺點是每行數據的變化結果都會被記錄,比如執行批量 update 語句,更新多少行數據就會產生多少條記錄,使 binlog 文件過大,而在 STATEMENT 格式下只會記錄一個 update 語句而已;
- MIXED:包含了 STATEMENT 和 ROW 模式,它會根據不同的情況自動使用 ROW 模式和 STATEMENT 模式;
算法
- 一個二叉樹,給一個target,找出大于這個樹中的節點的最大深度。
本文鏈接:http://www.tebozhan.com/showinfo-26-87673-0.html華為進二面了,開沖了!
聲明:本網頁內容旨在傳播知識,若有侵權等問題請及時與本網聯系,我們將在第一時間刪除處理。郵件:2376512515@qq.com
上一篇: 魯大師 4 月電動兩輪車榜:RideyFUN Air 智駕系統上線,九號 F2z 110 智能化再升級
下一篇: Python編碼的七個常見問題與解決方案