1. 程式人生 > >java面試題集(收錄)

java面試題集(收錄)

1.Arrays.sort實現原理和Collection實現原理

Collection.sort()底層會呼叫Arrays.sort(),Arrays.sort()底層實現是TimeSort,TimeSort的演算法就是先找到已經排好序資料的子序列,然後對剩餘部分資料進行排序,然後在合併起來。

2.foreach和while的區別(編譯之後)

while會讀一行輸入,把它存入某個變數並執行迴圈體,然後再找其他行的輸入,適用於不確定迴圈次數的情況;foreach是增強for迴圈,它是逐條讀取,在迴圈開始前會將所有輸入全部讀入,適用於陣列、集合等確定長度的情況;當輸入內容非常大的時候foreach會非常佔記憶體。

3.執行緒池的種類,區別和使用場景

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

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

c.newScheduledTreadPool建立一個定長執行緒池,支援定時或者週期性任務執行。

d.newSingleThreadPool建立一個單執行緒化的執行緒池,它只會用唯一的執行緒來執行任務,保證所有任務按照指定順序執行。

4.執行緒的排程過程

a.當執行緒池小於corePoolSize時,新提交的任務會建立一個新的執行緒執行,技術此執行緒池中有空閒執行緒;

b.當執行緒池達到corePoolSize時,新提交的任務將被放入workQueue,等待執行緒池中任務排程執行;

c.當workQueue已滿,並且maximunPoolSize > corePoolSize時,新提交的任務會建立新的執行緒執行;

d.當提交的任務數超過maximunPoolSize時,新提交的任務將被拒絕;

e.當執行緒池中超過corePoolSize執行緒,空閒時間達到keepAliveTime時,關閉空閒執行緒;

f.當執行緒池中設定allowCoreThreadTimeOut=true時,執行緒池中corePoolSize執行緒超過keepAliveTime時也將被關閉;

5.動態代理的幾種方式

jdk動態代理和cglib動態代理。jdk動態代理是有java內部的反射機制實現的,前提是代理類和目標類必須實現統一的介面;cglib動態代理是藉助asm來實現的。

6.HashMap的併發問題

HashMap是執行緒不安全的,當size超過一定大小需要擴容時,會重新計算hashcode值,在多執行緒的情況下可能會產生死迴圈。可以使用HashTable和ConcurrentHashMap。

7.HashTable和ConcurrentHashMap區別

當HashTable增加到一定數量時效能會急劇降低,因為迭代時會鎖很長時間,而ConcurrentHashMap使用了分割,無論數量多大,都只需要鎖map的某一個部分。

8.反射的原理,反射建立類例項的三種方式是什麼

java反射機制實在運行當中,對任意一個類來說,能夠知道它的所有屬性和方法,都能呼叫它的任意一個屬性和方法。

三種方式:getClass()方式,呼叫類的靜態屬性class,Class.forName()。

9.hashmap的理解

hashmap是連結串列+陣列的儲存結構,外層是一個連結串列,而每個連結串列中又是一個數組,儲存時先通過key獲取hashcode並計算出value儲存的連結串列位置,如果不存在hash碰撞則value存在該連結串列中陣列的第一個位置,如果發生hash碰撞則存在該連結串列的陣列的最後一個位置。

10.arraylist和linkedlist區別及實現原理

arraylist是基於動態陣列的資料結構,而linkedlist是基於連結串列的資料結構;對於查詢來說arraylist優於linkedlist,而對於刪除和新增則linkedlist更好些。

11.反射中,Class.forName和ClassLoader區別

java類載入的過程包括:載入->驗證->準備->解析->初始化->使用->解除安裝,而初始化就是啟用java類中靜態變數初始化程式碼和靜態程式碼塊,並初始化程式設定的變數值。

Class.forName會執行類的初始化,而ClassLoader不會執行類的初始化。

來源:java面試題網http://www.wityx.com