2023java面試題及答案_第1頁
2023java面試題及答案_第2頁
2023java面試題及答案_第3頁
2023java面試題及答案_第4頁
2023java面試題及答案_第5頁
已閱讀5頁,還剩7頁未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

第頁2023java面試題及答案java面試題2023及答案

SunJava認(rèn)證分為兩個(gè)級(jí)別:Sun認(rèn)證Java程序員和Sun認(rèn)證Java開發(fā)員。下面是我整理的關(guān)于java面試題2023及答案,希望大家喜愛!

1〕什么是線程?

線程是操作系統(tǒng)能夠進(jìn)行運(yùn)算調(diào)度的最小單位,它被包含在進(jìn)程之中,是進(jìn)程中的實(shí)際運(yùn)作單位。程序員可以通過它進(jìn)行多處理器編程,你可以運(yùn)用多線程對(duì)運(yùn)算密集型任務(wù)提速。比方,假設(shè)一個(gè)線程完成一個(gè)任務(wù)要100毫秒,那么用十個(gè)線程完成改任務(wù)只需10毫秒。Java在語言層面對(duì)多線程供給了卓越的支持,它也是一個(gè)很好的賣點(diǎn)。欲了解更多具體信息請(qǐng)點(diǎn)擊這里。

2〕線程和進(jìn)程有什么區(qū)分?

線程是進(jìn)程的子集,一個(gè)進(jìn)程可以有許多線程,每條線程并行執(zhí)行不同的任務(wù)。不同的進(jìn)程運(yùn)用不同的內(nèi)存空間,而全部的線程共享一片相同的內(nèi)存空間。別把它和棧內(nèi)存搞混,每個(gè)線程都擁有單獨(dú)的一樣。當(dāng)你調(diào)用run〔〕方法的時(shí)候,只會(huì)是在原來的線程中調(diào)用,沒有新的線程啟動(dòng),start〔〕方法才會(huì)啟動(dòng)新線程。更多探討請(qǐng)點(diǎn)擊這里

7〕Java中Runnable和Callable有什么不同?

Runnable和Callable都代表那些要在不同的線程中執(zhí)行的任務(wù)。Runnable從JDK1。0起先就有了,Callable是在JDK1。5增加的。它們的主要區(qū)分是Callable的call〔〕方法可以返回值和拋出異樣,而Runnable的run〔〕方法沒有這些功能。Callable可以返回裝載有計(jì)算結(jié)果的Future對(duì)象。我的博客有更具體的說明。

8〕Java中CyclicBarrier和CountDownLatch有什么不同?

CyclicBarrier和CountDownLatch都可以用來讓一組線程等待其它線程。與CyclicBarrier不同的是,CountdownLatch不能重新運(yùn)用。點(diǎn)此查看更多信息和例如代碼。

9〕Java內(nèi)存模型是什么?

Java內(nèi)存模型規(guī)定和指引Java程序在不同的內(nèi)存架構(gòu)、CPU和操作系統(tǒng)間有確定性地行為。它在多線程的狀況下尤其重要。Java內(nèi)存模型對(duì)一個(gè)線程所做的變動(dòng)能被其它線程可見供給了保證,它們之間是先行發(fā)生了關(guān)系。這個(gè)關(guān)系定義了一些規(guī)那么讓程序員在并發(fā)編程時(shí)思路更清楚。比方,先行發(fā)生了關(guān)系確保了:

線程內(nèi)的代碼能夠按先后依次執(zhí)行,這被稱為程序次序規(guī)那么。

對(duì)于同一個(gè)鎖,一個(gè)解鎖操作肯定要發(fā)生在時(shí)間上后發(fā)生的另一個(gè)鎖定操作之前,也叫做管程鎖定規(guī)那么。

前一個(gè)對(duì)volatile的寫操作在后一個(gè)volatile的讀操作之前,也叫volatile變量規(guī)那么。

一個(gè)線程內(nèi)的任何操作必需在這個(gè)線程的start〔〕調(diào)用之后,也叫作線程啟動(dòng)規(guī)那么。

一個(gè)線程的全部操作都會(huì)在線程終止之前,線程終止規(guī)那么。

一個(gè)對(duì)象的終結(jié)操作必需在這個(gè)對(duì)象構(gòu)造完成之后,也叫對(duì)象終結(jié)規(guī)那么。

可傳遞性

我劇烈建議大家閱讀?Java并發(fā)編程實(shí)踐?第十六章來加深對(duì)Java內(nèi)存模型的理解。

10〕Java中的volatile變量是什么?

volatile是一個(gè)特別的修飾符,只有成員變量才能運(yùn)用它。在Java并發(fā)程序缺少同步類的狀況下,多線程對(duì)成員變量的操作對(duì)其它線程是透亮的。volatile變量可以保證下一個(gè)讀取操作會(huì)在前一個(gè)寫操作之后發(fā)生,就是上一題的volatile變量規(guī)那么。點(diǎn)擊這里查看更多volatile的相關(guān)內(nèi)容。

11〕什么是線程平安?Vector是一個(gè)線程平安類嗎?〔詳見這里〕

假設(shè)你的代碼所在的進(jìn)程中有多個(gè)線程在同時(shí)運(yùn)行,而這些線程可能會(huì)同時(shí)運(yùn)行這段代碼。假設(shè)每次運(yùn)行結(jié)果和單線程運(yùn)行的結(jié)果是一樣的,而且其他的變量的值也和預(yù)期的是一樣的,就是線程平安的。一個(gè)線程平安的計(jì)數(shù)器類的同一個(gè)實(shí)例對(duì)象在被多個(gè)線程運(yùn)用的狀況下也不會(huì)出現(xiàn)計(jì)算失誤。很明顯你可以將集合類分成兩組,線程平安和非線程平安的。Vector是用同步方法來實(shí)現(xiàn)線程平安的,而和它相像的ArrayList不是線程平安的。

12〕Java中什么是競(jìng)態(tài)條件?舉個(gè)例子說明。

競(jìng)態(tài)條件會(huì)導(dǎo)致程序在并發(fā)狀況下出現(xiàn)一些bugs。多線程對(duì)一些資源的競(jìng)爭(zhēng)的時(shí)候就會(huì)產(chǎn)生競(jìng)態(tài)條件,假設(shè)首先要執(zhí)行的程序競(jìng)爭(zhēng)失敗排到后面執(zhí)行了,那么整個(gè)程序就會(huì)出現(xiàn)一些不確定的bugs。這種bugs很難覺察而且會(huì)重復(fù)出現(xiàn),因?yàn)榫€程間的隨機(jī)競(jìng)爭(zhēng)。一個(gè)例子就是無序處理,詳見答案。

13〕Java中如何停止一個(gè)線程?

Java供給了很豐富的API但沒有為停止線程供給API。JDK1。0原來有一些像stop〔〕,suspend〔〕和resume〔〕的限制方法但是由于潛在的死鎖威逼因此在后續(xù)的JDK版本中他們被棄用了,之后JavaAPI的設(shè)計(jì)者就沒有供給一個(gè)兼容且線程平安的方法來停止一個(gè)線程。當(dāng)run〔〕或者call〔〕方法執(zhí)行完的時(shí)候線程會(huì)自動(dòng)結(jié)束,假設(shè)要手動(dòng)結(jié)束一個(gè)線程,你可以用volatile布爾變量來退出run〔〕方法的循環(huán)或者是取消任務(wù)來中斷線程。點(diǎn)擊這里查看例如代碼。

14〕一個(gè)線程運(yùn)行時(shí)發(fā)生異樣會(huì)怎樣?

這是我在一次面試中遇到的一個(gè)很刁鉆的Java面試題,簡(jiǎn)潔的說,假設(shè)異樣沒有被捕獲該線程將會(huì)停止執(zhí)行。Thread。UncaughtExceptionHandler是用于處理未捕獲異樣造成線程突然中斷狀況的一個(gè)內(nèi)嵌接口。當(dāng)一個(gè)未捕獲異樣將造成線程中斷的時(shí)候JVM會(huì)運(yùn)用Thread。getUncaughtExceptionHandler〔〕來查詢線程的UncaughtExceptionHandler并將線程和異樣作為參數(shù)傳遞給handler的uncaughtException〔〕方法進(jìn)行處理。

15〕如何在兩個(gè)線程間共享數(shù)據(jù)?

你可以通過共享對(duì)象來實(shí)現(xiàn)這個(gè)目的,或者是運(yùn)用像堵塞隊(duì)列這樣并發(fā)的數(shù)據(jù)結(jié)構(gòu)。這篇教程?Java線程間通信?〔涉及到在兩個(gè)線程間共享對(duì)象〕用wait和notify方法實(shí)現(xiàn)了生產(chǎn)者消費(fèi)者模型。

16〕Java中notify和notifyAll有什么區(qū)分?

這又是一個(gè)刁鉆的問題,因?yàn)槎嗑€程可以等待單監(jiān)控鎖,JavaAPI的設(shè)計(jì)人員供給了一些方法當(dāng)?shù)却龡l件變更的時(shí)候通知它們,但是這些方法沒有完全實(shí)現(xiàn)。notify〔〕方法不能喚醒某個(gè)詳細(xì)的線程,所以只有一個(gè)線程在等待的時(shí)候它才有用武之地。而notifyAll〔〕喚醒全部線程并允許他們爭(zhēng)奪鎖確保了至少有一個(gè)線程能接著運(yùn)行。我的博客有更具體的資料和例如代碼。

17〕為什么wait,notify和notifyAll這些方法不在thread類里面?

這是個(gè)設(shè)計(jì)相關(guān)的問題,它考察的是面試者對(duì)現(xiàn)有系統(tǒng)和一些普遍存在但看起來不合理的事物的看法。答復(fù)這些問題的.時(shí)候,你要說明為什么把這些方法放在Object類里是有意義的,還有不把它放在Thread類里的緣由。一個(gè)很明顯的緣由是JAVA供給的鎖是對(duì)象級(jí)的而不是線程級(jí)的,每個(gè)對(duì)象都有鎖,通過線程獲得。假設(shè)線程須要等待某些鎖那么調(diào)用對(duì)象中的wait〔〕方法就有意義了。假設(shè)wait〔〕方法定義在Thread類中,線程正在等待的是哪個(gè)鎖就不明顯了。簡(jiǎn)潔的說,由于wait,notify和notifyAll都是鎖級(jí)別的操作,所以把他們定義在Object類中因?yàn)殒i屬于對(duì)象。你也可以查看這篇文章了解更多。

18〕什么是ThreadLocal變量?

ThreadLocal是Java里一種特別的變量。每個(gè)線程都有一個(gè)ThreadLocal就是每個(gè)線程都擁有了自己獨(dú)立的一個(gè)變量,競(jìng)爭(zhēng)條件被徹底消退了。它是為創(chuàng)立代價(jià)昂揚(yáng)的對(duì)象獲得線程平安的好方法,比方你可以用ThreadLocal讓SimpleDateFormat變成線程平安的,因?yàn)槟莻€(gè)類創(chuàng)立代價(jià)昂揚(yáng)且每次調(diào)用都須要?jiǎng)?chuàng)立不同的實(shí)例所以不值得在局部范圍運(yùn)用它,假設(shè)為每個(gè)線程供給一個(gè)自己獨(dú)有的變量拷貝,將大大提高效率。首先,通過復(fù)用削減了代價(jià)昂揚(yáng)的對(duì)象的創(chuàng)立個(gè)數(shù)。其次,你在沒有運(yùn)用高代價(jià)的同步或者不變性的狀況下獲得了線程平安。線程局部變量的另一個(gè)不錯(cuò)的例子是ThreadLocalRandom類,它在多線程環(huán)境中削減了創(chuàng)立代價(jià)昂揚(yáng)的Random對(duì)象的個(gè)數(shù)。查看答案了解更多。

19〕什么是FutureTask?

在Java并發(fā)程序中FutureTask表示一個(gè)可以取消的異步運(yùn)算。它有啟動(dòng)和取消運(yùn)算、查詢運(yùn)算是否完成和取回運(yùn)算結(jié)果等方法。只有當(dāng)運(yùn)算完成的時(shí)候結(jié)果才能取回,假設(shè)運(yùn)算尚未完成get方法將會(huì)堵塞。一個(gè)FutureTask對(duì)象可以對(duì)調(diào)用了Callable和Runnable的對(duì)象進(jìn)行包裝,由于FutureTask也是調(diào)用了Runnable接口所以它可以提交給Executor來執(zhí)行。

20〕Java中interrupted和isInterruptedd方法的區(qū)分?

interrupted〔〕和isInterrupted〔〕的主要區(qū)分是前者會(huì)將中斷狀態(tài)去除而后者不會(huì)。Java多線程的中斷機(jī)制是用內(nèi)部標(biāo)識(shí)來實(shí)現(xiàn)的,調(diào)用Thread。interrupt〔〕來中斷一個(gè)線程就會(huì)設(shè)置中斷標(biāo)識(shí)為true。當(dāng)中斷線程調(diào)用靜態(tài)方法Thread。interrupted〔〕來檢查中斷狀態(tài)時(shí),中斷狀態(tài)會(huì)被清零。而非靜態(tài)方法isInterrupted〔〕用來查詢其它線程的中斷狀態(tài)且不會(huì)變更中斷狀態(tài)標(biāo)識(shí)。簡(jiǎn)潔的說就是任何拋出InterruptedException異樣的方法都會(huì)將中斷狀態(tài)清零。無論如何,一個(gè)線程的中斷狀態(tài)有有可能被其它線程調(diào)用中斷來變更。

21〕為什么wait和notify方法要在同步塊中調(diào)用?

主要是因?yàn)镴avaAPI強(qiáng)制要求這樣做,假設(shè)你不這么做,你的代碼會(huì)拋出IllegalMonitorStateException異樣。還有一個(gè)緣由是為了避開wait和notify之間產(chǎn)生競(jìng)態(tài)條件。

22〕為什么你應(yīng)當(dāng)在循環(huán)中檢查等待條件?

處于等待狀態(tài)的線程可能會(huì)收到錯(cuò)誤警報(bào)和偽喚醒,假設(shè)不在循環(huán)中檢查等待條件,程序就會(huì)在沒有滿意結(jié)束條件的狀況下退出。因此,當(dāng)一個(gè)等待線程醒來時(shí),不能認(rèn)為它原來的等待狀態(tài)仍舊是有效的,在notify〔〕方法調(diào)用之后和等待線程醒來之前這段時(shí)間它可能會(huì)變更。這就是在循環(huán)中運(yùn)用wait〔〕方法效果更好的緣由,你可以在Eclipse中創(chuàng)立模板調(diào)用wait和notify試一試。假設(shè)你想了解更多關(guān)于這個(gè)問題的內(nèi)容,我舉薦你閱讀?EffectiveJava?這本書中的線程和同步章節(jié)。

23〕Java中的同步集合與并發(fā)集合有什么區(qū)分?

同步集合與并發(fā)集合都為多線程和并發(fā)供給了適宜的線程平安的集合,不過并發(fā)集合的可擴(kuò)展性更高。在Java1。5之前程序員們只有同步集合來用且在多線程并發(fā)的時(shí)候會(huì)導(dǎo)致爭(zhēng)用,阻礙了系統(tǒng)的擴(kuò)展性。Java5介紹了并發(fā)集合像ConcurrentHashMap,不僅供給線程平安還用鎖分別和內(nèi)局部區(qū)等現(xiàn)代技術(shù)提高了可擴(kuò)展性。更多內(nèi)容詳見答案。

24〕Java中堆和棧有什么不同?

為什么把這個(gè)問題歸類在多線程和并發(fā)面試題里?因?yàn)闂J且粔K和線程緊密相關(guān)的內(nèi)存區(qū)域。每個(gè)線程都有自己的棧內(nèi)存,用于存儲(chǔ)本地變量,方法參數(shù)和棧調(diào)用,一個(gè)線程中存儲(chǔ)的變量對(duì)其它線程是不行見的。而堆是全部線程共享的一片公用內(nèi)存區(qū)域。對(duì)象都在堆里創(chuàng)立,為了提升效率線程會(huì)從堆中弄一個(gè)緩存到自己的棧,假設(shè)多個(gè)線程運(yùn)用該變量就可能引發(fā)問題,這時(shí)volatile變量就可以發(fā)揮作用了,它要求線程從主存中讀取變量的值。

25〕什么是線程池?為什么要運(yùn)用它?

創(chuàng)立線程要花費(fèi)昂貴的資源和時(shí)間,假設(shè)任務(wù)來了才創(chuàng)立線程那么響應(yīng)時(shí)間會(huì)變長(zhǎng),而且一個(gè)進(jìn)程能創(chuàng)立的線程數(shù)有限。為了避開這些問題,在程序啟動(dòng)的時(shí)候就創(chuàng)立假設(shè)干線程來響應(yīng)處理,它們被稱為線程池,里面的線程叫工作線程。從JDK1。5起先,JavaAPI供給了Executor框架讓你可以創(chuàng)立不同的線程池。比方單線程池,每次處理一個(gè)

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

評(píng)論

0/150

提交評(píng)論