1. 程式人生 > >Java面試題,每日一總結(2)

Java面試題,每日一總結(2)

1.字串String和StringBuilder 、StringBuffer的區別?StringBuilder和StringBuffer的區別?

分析:java提供了String和StringBuilder 、StringBuffer三種表示和操作字串的類。字串就是有多個字元的陣列。

①String和StringBuilder 、StringBuffer的區別:

String是內容不可改變的字串,它的底層是由final修飾的字元陣列實現。

StringBuilder 、StringBuffer是內容可變的字串,底層由不是final修飾的字元陣列實現。

②StringBuilder和StringBuffer的區別:

StringBuilder執行緒不安全,效率較高;StringBuffer執行緒安全,效率較低。(底層加了同步鎖)

③延伸問題,字串拼接使用哪一個?

字串拼接不使用String,因為String拼接會建立多個物件,效率低。例:String s="a"+"b";

使用StringBuilder或StringBuffer,例:StringBuffer sb=new StringBuffer(); sb.append("a").append("b");

2.講一下Java中的集合

答:java中的集合分為值儲存和鍵值對儲存

值儲存(value):List和Set

List:有序的,可重複;

Set:無序的,不可重複,不可重複是通過equals和hashCode方法來實現的,因此一個物件想通過Set儲存,需要重寫equals和hashCode方法。

鍵值對儲存(key--value):Map

3.ArrayLsit 和LinkedList的區別和使用場景

答:區別:ArrayList底層通過陣列實現,LinkedList底層通過連結串列實現。

使用場景:

陣列對查詢特定的元素效率高,對插入,刪除,修改較慢,因為陣列在記憶體中是一組連續的記憶體地址,插入和刪除需要移動記憶體。

連結串列不要求記憶體連續,在當前元素中存放上一個或下一個元素的地址,查詢需要從頭部開始,一個一個找,效率低,而插入和刪除不需要移動記憶體,只需要改變引用指向。

因此ArrayList常用於查詢多,插入和刪除,修改少的地方;LinkedList常用於查詢少,插入和刪除,修改多的地方。

4.講一下HashMap和HashTable的區別?HashMap和ConcurrentHashMap(jdk1.5以後)的區別?

答:相同點:HashMap和HashTable都可以儲存鍵值對。

        區別:1)HashMap可以將null作為key或value儲存,但HashTable不可以;

                   2)HashMap執行緒不安全,效率較高,HashTable執行緒安全按,效率較低。

ConcurrentHashMap:就是既可以保證安全又可以保證效率。

它是將整個Map分為N個segment(類似HashTable),可以提供相同的執行緒安全,效率卻提高了N倍,預設提高了16倍。

5.實現一個拷貝檔案的工具類使用位元組流還是字元流?

答:使用位元組流(因為拷貝的檔案不確定只含有字元流,有可能有位元組流(圖片、聲音、影象),為保證通用性,使用位元組流)。

6.

1)講一下執行緒的幾種實現方式?

答:⑴通過繼承Thread類

       ⑵通過實現Runnable介面

2)怎麼啟動?

答:Thread thread=new Thread(繼承Thread/實現Runnable介面的類);

        thread.setName("執行緒名稱");

        thread.start();//執行緒啟動使用start方法,啟動後執行run方法

3)怎麼區分執行緒?在一個系統中有很多執行緒,每個執行緒都會列印日誌,我想區分是哪個執行緒列印的怎麼辦?

答:thread.setName("執行緒名稱");這是一種規範,在建立執行緒後,都要給執行緒起一個新的名稱。

4)執行緒池,執行緒併發庫?

①java如何建立執行緒池?

答:Java通過Executors提供四種靜態方法建立四種執行緒池:分別為

newCachedThreadPool建立一個可快取執行緒池,如果執行緒池長度超過處理需要,可靈活回收空閒執行緒,若無可回收,則新建執行緒。

newFixedThreadPool建立一個定長執行緒池,可控制執行緒最大併發數,超出的執行緒會在佇列中等待。

newScheduledThreadPool建立一個定長執行緒池,支援定時及週期性任務執行。

newSingleThreadExecutor建立一個單執行緒化的執行緒池,它只會用唯一的工作執行緒來執行任務,保證所有任務按照指定順序(FIFO,LIFO,優先順序)執行

②為什麼要使用執行緒池?

1.限定執行緒的個數,保證不會因執行緒過多導致系統執行緩慢或崩潰;

2.執行緒池不需要每次都去建立或銷燬,節約了資源;

3.執行緒池不需要每次都建立,響應時間更快。

或者:為了減少建立和銷燬執行緒的次數,讓每個執行緒多次使用,可根據系統情況調整指向執行緒的數量,防止消耗過多記憶體,所以要使用執行緒池。