1. 程式人生 > >Java相關知識點整理《二》

Java相關知識點整理《二》

10、AtomicInteger類。

AtomicInteger是一個提供原子操作的Integer類,通過執行緒安全的方式操作加減,十分適合高併發情況下的使用,AtomicInteger是在使用非阻塞演算法實現併發控制。

11、Java常用集合。

Collection和Map,是集合框架的根介面。

Set:介面:實現類有HashSet和LinkedHashSet。Set的子介面SortedSet介面——>實現類:TreeSet。

List:介面:實現類有LinkedList、Vector、ArrayList。

Vector:可實現自動增長的物件陣列,重量級、執行緒安全、使用少。

ArrayList:底層是Object陣列,所以ArrayList具有陣列的查詢速度快的優點以及增刪速度慢的缺點。

LinkedList:採用雙向迴圈連結串列實現,方便增刪,不利於查詢。

HashSet通過equals和HashCode來判斷兩個元素是否相等,具體規則是:如果兩個元素通過equals比較為true,並且兩個元素的HashCode相等,則兩個元素重複。

Map集合比較:

HashMap的存入順序和輸出順序無關。

LinkedHashMap保留了鍵值對的存入順序。

TreeMap則是對Map中的元素進行排序。

HashMap和HashTable的比較:

(a)、都是Java集合類,都可以用來存放Java物件。

(b)、HashTable 是Java1.1就有的,HashMap是Java1.2引進的Map介面的一個實現。

(c)、HashTable是同步的,這個類中的一些方法會保證HashTable中的物件是執行緒安全的;HashMap是非同步的,HashMap中的物件不是執行緒安全的。

(d)、HashMap的key或value可放入空值(null)而HashTable不可以。

總結:

如果要求執行緒安全,使用Vector、HashTable。

如果不要求執行緒安全,使用ArrayList、LinkedList、HashMap。

如果要求鍵值對,則使用HashMap、HashTable。

如果資料量很大,又要求執行緒安全考慮Vector。

12、服務端的幾種IO模型。

12.1.阻塞式模型。

指系統呼叫(一般是IO介面)不返回呼叫結果並讓當前執行緒一直阻塞,只有當該系統呼叫獲得結果或者超時出錯才返回。

12.2.多執行緒的服務模型(非同步IO)。

目的是讓每個連線都有獨立的執行緒(或程序),這樣任何一個連線的阻塞都不會影響其他的連線。

12.3.非阻塞式模型。

非阻塞IO通過程序反覆呼叫IO函式,與阻塞不同的是,呼叫IO函式後,核心會立刻返回一個錯誤的介面,該程序會不斷去呼叫查詢結果的函式recv(),直到收到正確的結果,在這個過程中程序是阻塞的。

12.4.IO複用模型。

關鍵來自select/epoll這個Function,對一個IO埠,兩次呼叫,兩次返回。好處在於單個process可以同時處理多個網路連線的IO。

12.5.訊號驅動IO。

首先允許套接字進行訊號驅動IO,並安裝一個訊號處理函式,程序繼續執行並不阻塞。當資料準備好時,程序會收到一個SIGIO訊號,可以在訊號處理函式中呼叫IO操作函式處理資料。

13、NIO相關知識。

傳統IO<=>BIO—>阻塞式IO

NIO—>非阻塞式IO

AIO—>非同步IO

NIO關鍵點:

(a)、 緩衝區Buffer。

一個Buffer物件是固定數量的資料的容器。其作用是一個儲存器,或者分段運輸區,在這裡資料可被儲存並在之後用於檢索。

(b)、通道Channel。

通道是一種途徑,可以用最小的總開銷來訪問作業系統本身的IO服務。通道可以是單向的或者雙向的。

(c)、選擇器Selector。

用於分發不同的請求到不同的Channel,這樣才能確保Channel不處於阻塞狀態就可以收發訊息。

(d)、圖示。

14、SpringMVC工作原理解析。

14.1.SpringMVC處理流程。

(a)、使用者傳送請求至前端控制器DispatcherServlet。

(b)、DispatcherServlet收到請求呼叫handlerMapping處理器對映器。

(c)、處理器對映器找到具體的處理器(可以根據xml配置、註解進行查詢)、生成處理器物件及處理器攔截器(如果有則生辰)一併返回給DispatcherServlet。

(d)、DispatcherServlet呼叫HandlerAdapter處理器介面卡。

(e)、HandlerAdapter經過適配呼叫具體的處理器(Controller,也叫後端控制器)。

(f)、Controller執行完後返回ModeAndView。

(g)、HandlerAdapter將Controller執行結果ModelAndView返回DispatcherServlet。

(h)、DispatcherServlet將ModeAndView傳給ViewResolver檢視解析器。

(i)、ViewReslver解析返回具體的View。

(j)、DispatcherServlet根據View渲染檢視並響應使用者。

14.2.HandlerMapping簡述。

專案啟動時通過HandlerMap將Controller的url對映為一個Map,使用者請求訪問時,用當前url與map中的資料做比對,並返回對應的Handler。

14.3.HandlerAdapter簡述。

SpringMVC通過HandlerAdapter來實際呼叫處理函式。

15、MyBatis的實現。

15.1.MyBatis的初始化。

MyBatis的初始化其實過程其實就是解析配置檔案和初始化Configuration的過程。首先建立SQLSessionFactory建立者物件,然後由它進行建立SessionFactory,這裡用到的是建造者模式,建造者模式最簡單的理解就是不手動new物件,而是由其他類來進行物件的建立。然後由SQLSessionFactory來建立SqlSession物件。

15.2.MyBatis的SQL查詢流程。

SQL查詢引數設定:首先獲取資料庫connection連線,然後準備statement,然後設定SQL查詢中的引數值。開啟一個connection連線,在使用完後不會close,而是儲存下來,當下次需要開啟時直接返回。

SQL查詢結果集的封裝:ResultSetWrapper是ResultSet的封裝類,呼叫getFirstResultSet方法獲取第一個ResultSet,同時獲取資料庫的metaData資料,包括資料表列名、列的型別、類序號等,這些資訊都儲存在ResultSetWrapper類中了,然後呼叫HandleResultSet方法來進行結果集的封裝。

15.3.MyBatis快取。

一級快取是SqlSession級別的快取,每個SqlSession物件都有一個雜湊表用於快取資料,不同SqlSession物件之間快取不共享。同一個SqlSession物件執行兩遍相同的Sql查詢,在第一次查詢完畢後會將查詢結果快取起來,第二遍查詢直接返回結果即可,MyBatis預設是開啟一級快取的。

二級快取是Mapper級別的快取,二級快取是跨SqlSession的,多個SqlSession物件可以共享同一個二級快取。MyBatis預設是不開啟二級快取的,可以配置開啟二級快取(CacheEnabled)。

16、資料庫索引型別。

(a)、普通索引。

(b)、唯一索引。

(c)、主鍵索引。

(d)、聚集索引。

該索引中鍵值的邏輯順序決定表中相應的物理順序。

(e)、非聚集索引。

該索引中索引的邏輯順序與磁碟上行的物理儲存順序不同。

17、MySQL三種資料引擎比較。

17.1.InnoDB。

支援事務處理,支援外來鍵,支援崩潰修復能力和併發控制。如果對事務的完整性要求比較高(比如銀行),要求實現併發控制(比如售票),那麼選擇InnoDB有很大的優勢。如果需要頻繁的更新、刪除操作的資料庫,也可以選擇InnoDB,因為支援事務的提交(Commit)和回滾(RollBack)。

17.2.MyISAM。

插入資料快,空間和記憶體使用比較低。如果表主要用於插入新記錄和讀出記錄。那麼選擇MyISAM能實現處理的高效率。如果應用的完整性、併發性要求比較低,也可以使用。

17.3.MEMORY。

所有的資料都在記憶體中,資料處理速度快,但是安全性不夠高。如果需要很快的讀寫速度,對資料的安全性要求比較低,可以選擇MEMORY。它對錶的大小有要求,不能建立太大的表。所以,這類資料庫只使用在相對較小的資料庫表。

18、Redis相關知識。

18.1.使用場景。

(a)、配合關係型資料庫做告訴快取。

快取高頻次訪問的資料,降低資料庫IO。

分散式架構做Session共享。

(b)、可以持久化特定資料。

利用ZSet型別可以儲存排行榜。

利用list的自然時間排序儲存最新n個數據。

18.2.使用Redis的好處。

(a)速度快,因為資料儲存在記憶體中,類似於HashMap,HashMap的優勢就是查詢和操作的時間複雜度都是O(1)。

(b)支援豐富的資料型別,支援String、list、set、sorted set(ZSet)、Hash。

(c)支援事務,操作都是原子性。所謂的原子性就是對資料的更改要麼全部執行,要麼全部不執行。

(d)豐富的特性:可用於快取、訊息佇列、按key設定過期時間,過期後自動刪除。

18.3.Redis快取擊穿問題處理。

快取擊穿表示惡意使用者模擬請求很多快取中不存在的資料,由於快取中都沒有,導致這些請求短時間內直接落在了資料庫上,致使資料庫異常。

(a)使用互斥鎖排隊。

根據key獲取對應的value值為空時,鎖上,從資料庫中load資料後再釋放鎖(分散式環境需要使用分散式鎖,單機環境的話使用Synchronized、Lock即可)。

(b)BloomFilter布隆過濾器。

類似於一個HashSet,用於判斷某個元素是否存在於集合中。

18.4.Redis快取雪崩問題處理。

快取在同一時間內大量過期(失效),接著來的一大波請求瞬間落在資料庫上導致連線異常。

(a)互斥鎖排隊(處理同上)。

(b)建立快取備份。

快取A和快取B,B不設定超時時間,先從A讀快取,A沒有則讀B,並且更新A快取和B快取。