今年的6月份又到了,又是一年一度的畢業季,可是你真的作好準備了嗎?。應屆畢業生不少,怎麼讓你本身在這羣人中脫穎而出呢?那你就要作萬分的準備,不打沒準備的仗,下面小猿圈java講師爲你總結了常見的java面試題,但願對你的面試有所幫助。java
1.list中存放可重複字符串,如何刪除某個字符串面試
調用iterator相關方法刪除數組
倒刪,防止正序刪除致使的數組重排,index跳過數組元素問題多線程
2.concurrenthashmap爲什麼讀不用加鎖app
jdk1.7線程
1)HashEntry中的key、hash、next均爲final型,只能表頭插入、刪除結點對象
2)HashEntry類的value域被聲明爲volatile型排序
3)不容許用null做爲鍵和值,當讀線程讀到某個HashEntry的value域的值爲null時,便知道產生了衝突——發生了重排序現象(put設置新value對象的字節碼指令重排序),須要加鎖後從新讀入這個value值隊列
4)volatile變量count協調讀寫線程之間的內存可見性,寫操做後修改count,讀操做先讀count,根據happen-before傳遞性原則寫操做的修改讀操做可以看到內存
jdk1.8
1)Node的val和next均爲volatile型
2)tabAt和casTabAt對應的unsafe操做實現了volatile語義
3.ContextClassLoader(線程上下文類加載器)的做用
越過類加載器的雙親委派機制去加載類,如serviceloader實現
使用線程上下文類加載器加載類,要注意保證多個須要通訊的線程間的類加載器應該是同一個,防止由於不一樣的類加載器致使類型轉換異常(ClassCastException)
4.如何結束一個一直運行的線程
使用退出標誌,這個flag變量要多線程可見
使用interrupt,結合isInterrupted()使用
5.如何從FutureTask不阻塞獲取結果
get(longtimeout,TimeUnitunit),超時則返回
輪詢,先經過isDone()判斷是否結束,而後調用get()
6.線程池從啓動到工做的流程
剛建立時,裏面沒有線程
調用execute()添加任務時:
1)若是正在運行的線程數量小於核心參數corePoolSize,繼續建立線程運行這個任務
2)不然,若是正在運行的線程數量大於或等於corePoolSize,將任務加入到阻塞隊列中
3)不然,若是隊列已滿,同時正在運行的線程數量小於核心參數maximumPoolSize,繼續建立線程運行這個任務
4)不然,若是隊列已滿,同時正在運行的線程數量大於或等於maximumPoolSize,根據設置的拒絕策略處理
5)完成一個任務,繼續取下一個任務處理
6)沒有任務繼續處理,線程被中斷或者線程池被關閉時,線程退出執行,若是線程池被關閉,線程結束
7)不然,判斷線程池正在運行的線程數量是否大於核心線程數,若是是,線程結束,不然線程阻塞。所以線程池任務所有執行完成後,繼續留存的線程池大小爲corePoolSize
7.阻塞隊列BlockingQueuetake和poll區別
poll(time):取走BlockingQueue裏排在首位的對象,若不能當即取出,則能夠等time參數規定的時間,取不到時返回null
take():取走BlockingQueue裏排在首位的對象,若BlockingQueue爲空,阻塞直到BlockingQueue有新的對象被加入
小猿圈講師總結java面試題就到這裏了,看到這篇文章的小夥伴們必定要好好看看這篇面試題,都是老師用心總結的,最後祝願各位大學生找到一份滿意的工做,加油!