首頁歷史 > 正文

知識清單-設計模式和Java集合類

2022-02-11由 測試開發加油棧 發表于 歷史

一、設計模式分為3個大類共23種

建立型:工廠方法模式、抽象工廠模式、單例模式、建造者模式、原型模式

結構型:介面卡模式、裝飾器模式、代理模式、外觀模式、橋接模式、組合模式、享元模式

行為型:策略模式、模板方法模式、觀察者模式、迭代子模式、責任鏈模式、命令模式、備忘錄模式、狀態模式、訪問者模式、中介者模式、直譯器模式。

二、常見的設計模式有:單例模式、工廠模式、代理模式、構造者模式、責任鏈模式、介面卡模式、觀察者模式。

單例模式:實現方式有三種,1、靜態初始化方式,也叫餓漢式,實現的思路是在類初始化時完成單例例項的建立,因此不會產生併發問題,在這種方式下不管是否使用到這個單例,都會建立這個單例。

2、雙重檢查,懶漢式,只有在真正用到這個單例例項的時候才會去建立,如果沒有使用就不會建立。這個方式必然會面對多個執行緒同時使用例項時的併發問題。為了解決併發訪問問題,透過synchronized或者lock進行雙重檢查,保證只有一個執行緒能夠建立例項。注意記憶體可見性引起的併發問題,必須使用volatile關鍵字修飾單例變數。

3、單例登錄檔方式,Spring中Bean的單例模式就是透過單例登錄檔方式實現的。

三、設計模式的實際應用

1、工廠模式,工廠模式是建立不同型別例項時常用的方式,例如Spring中的各種Bean是有不同Bean工廠類進行建立的。

2、代理模式,主要再不適合或者不能直接引用另一個物件的場景,可以透過代理模式對被代理物件的訪問進行控制,Java的代理模式分為靜態代理和動態代理。靜態代理指在編譯時就已經建立好了代理類,例如在原始碼中編寫的類;動態代理指在JVM執行過程中動態建立的代理類,使用動態代理的方法有JDK動態代理,CGLIB、Javassist等。在RPC中使用的是JDK動態代理,透過反射把遠端代理請求進行封裝,使服務看上去就像在使用本地的方法。

3、責任鏈模式,責任鏈模式類似工廠的流水線,鏈上每一個節點完成對物件的某一種處理。例如Netty框架在處理訊息時使用的Pipeline就是一種責任鏈模式。

4、介面卡模式,類似於常見的轉接頭,把兩種不匹配的物件來進行適配,也可以起到對兩個不同的物件進行解耦的作用。例如,常見的日誌框架SLF4J,如果使用了SLF4J就可以跟Log4j或者Logback等具體的日誌實現框架進行解耦。透過不同介面卡將SLF4J與Log4j等實現框架進行適配,完成日誌功能的使用。

5、觀察者模式,觀察者模式也被稱作釋出訂閱模式,適用於一個物件的某個行為需要觸發一系列的場景,例如gRPC中的Stream流式請求的處理就是透過觀察者模式實現的。

四、Java的集合類,主要了解HashMap、TreeMap是如何實現的。

HashMap和ConcurrentHashMap

HashMap,在1。7以前就是陣列加連結串列實現的,陣列中的每一項是一個連結串列。透過計算存入物件的HashCode,來計算物件在陣列中要存入的位置,然後用連結串列解決雜湊衝突,連結串列中發節點儲存的鍵值對。

需要了解HashMap的容量都是2的冪次方,是因為可以透過按位與操作來計算餘數,比求模要快。還要了解HashMap是非執行緒安全的,在多執行緒put的情況下,有可能在容量超過填充因子時進行rehash,因為HashMap為了避免尾部遍歷,在連結串列插入元素時使用頭插法,多執行緒的場景下有可能會產生死迴圈。

ConcurrentHashMap

HashMap是非執行緒安全的,那麼執行緒安全的是ConcurrentHashMap。ConcurrentHashMap採用分段鎖的思想來降低併發場景下鎖的發生頻率,1。7中使用的是Segment進行分段加鎖,降低併發鎖定;1。8中使用CAS自旋鎖的樂觀鎖來提高效能,但是在併發度高時效能會比較一般。還有1。8中的ConcurrentHashMap引入紅黑樹來解決Hash衝突時連結串列順序查詢的問題。紅黑樹的啟用條件與連結串列的長度和Map的總容量有關,預設連結串列大於8,並且容量大於64時轉為紅黑樹。

五、動態代理與反射是Java語言的特色,主要看動態代理與反射的使用場景,例如在ORM框架中會大量使用代理類。而RPC呼叫時會使用到反射機制呼叫實現類。

Java基礎資料型別,主要包括各種資料型別佔用多大的記憶體空間、資料型別的自動轉型與強制轉型、基礎資料型別與wrapper資料型別的自動裝箱與拆箱。

Java物件的引用,分為強引用、軟引用、弱引用、虛引用。主要看這些引用在GC時的處理策略不同,強引用不會被GC回收;軟引用記憶體空間不足時會被GC回收;弱引用則在每次GC時被回收;虛引用必須和引用佇列聯合使用,主要用於跟蹤一個物件被垃圾回收的過程。

Java的異常處理機制就是try-catch-finally機制,主要是異常時try-catch的處理流程,Error和Exception的區別。

Java的註解機制和SPI擴充套件機制

頂部