1. 程式人生 > >30道經典面試題

30道經典面試題

1.HashMap是如何擴容的?

當hashmap中的元素個數超過陣列大小*loadFactor時,就會進行陣列擴容,loadFactor的預設值為0.75,也就是說,預設情況下,陣列大小為16,那麼當hashmap中元素個數超過16*0.75=12的時候,
就把陣列的大小擴充套件為2*16=32,即擴大一倍,然後重新計算每個元素在陣列中的位置,
而這是一個非常消耗效能的操作,所以如果我們已經預知hashmap中元素的個數,
那麼預設元素的個數能夠有效的提高hashmap的效能。比如說,我們有1000個元素new HashMap(1000),
但是理論上來講new HashMap(1024)更合適,不過上面annegu已經說過,即使是1000,hashmap也自動會將其設定為1024。
但是new HashMap(1024)還不是更合適的,因為0.75*1000 < 1000, 也就是說為了讓0.75 * size > 1000,
我們必須這樣new HashMap(2048)才最合適,既考慮了&的問題,也避免了resize的問題。

2. Spring迴圈依賴的處理

Spring容器能順利的例項化以建構函式注入方式配置的bean有一個前提:即bean建構函式入參引用的物件必須已經準備就緒。
那麼如果兩個bean都採用建構函式注入,並且都通過建構函式入參引用了對方。就會發生類似與執行緒死鎖的迴圈依賴問題。
這種迴圈依賴的解決辦法就是修改配置檔案將將建構函式注入修改為屬性注入

3.字元流和位元組流的區別?

在Java.io包中操作檔案內容的主要有兩大類:位元組流、字元流,兩類都分為輸入和輸出操作。在位元組流中輸出資料主要是使用OutputStream完成,輸入使的是InputStream,在字元流中輸出主要是使用Writer類完成,輸入流主要使用Reader類完成。(這四個都是抽象類)
java中提供了專用於輸入輸出功能的包Java.io,其中包括:
InputStream,OutputStream,Reader,Writer
InputStream 和OutputStream,兩個是為位元組流設計的,主要用來處理位元組或二進位制物件,
Reader和 Writer.兩個是為字元流(一個字元佔兩個位元組)設計的,主要用來處理字元或字串.

字元流處理的單元為2個位元組的Unicode字元,分別操作字元、字元陣列或字串,而位元組流處理單元為1個位元組,操作位元組和位元組陣列。所以字元流是由Java虛擬機器將位元組轉化為2個位元組的Unicode字元為單位的字元而成的,所以它對多國語言支援性比較好!如果是音訊檔案、圖片、歌曲,就用位元組流好點,如果是關係到中文(文字)的,用字元流好點
所有檔案的儲存是都是位元組(byte)的儲存,在磁碟上保留的並不是檔案的字元而是先把字元編碼成位元組,再儲存這些位元組到磁碟。在讀取檔案(特別是文字檔案)時,也是一個位元組一個位元組地讀取以形成位元組序列
位元組流可用於任何型別的物件,包括二進位制物件,而字元流只能處理字元或者字串; 2. 位元組流提供了處理任何型別的IO操作的功能,但它不能直接處理Unicode字元,而字元流就可以
位元組流是最基本的,所有的InputStrem和OutputStream的子類都是,主要用在處理二進位制資料,它是按位元組來處理的 但實際中很多的資料是文字,又提出了字元流的概念,它是按虛擬機器的encode來處理,也就是要進行字符集的轉化 這兩個之間通過 InputStreamReader,OutputStreamWriter來關聯,實際上是通過byte[]和String來關聯 在實際開發中出現的漢字問題實際上都是在字元流和位元組流之間轉化不統一而造成的

4.mq訊息佇列滿了如何處理?

它有一個處理過滿佇列(稱為“高水位標誌”)的方法。當佇列滿時,MQ 會自動阻止發件人,或丟棄訊息,這取決於你正在做的是哪種訊息傳遞(即所謂的“模式”)。

5.執行緒池佇列滿的時候如何處理?

當工作佇列滿了,不同策略的處理方式為:
1.Abort策略:預設策略,新任務提交時直接丟擲未檢查的異常RejectedExecutionException,該異常可由呼叫者捕獲。
2.CallerRuns策略:為調節機制,既不拋棄任務也不丟擲異常,而是將某些任務回退到呼叫者。不會線上程池的執行緒中執行新的任務,而是在呼叫exector的執行緒中執行新的任務。
3.Discard策略:新提交的任務被拋棄。
4.DiscardOldest策略:佇列的是“隊頭”的任務,然後嘗試提交新的任務。(不適合工作佇列為優先佇列場景)