53道Java線程面試題_第1頁
53道Java線程面試題_第2頁
53道Java線程面試題_第3頁
53道Java線程面試題_第4頁
53道Java線程面試題_第5頁
已閱讀5頁,還剩50頁未讀 繼續免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

53道Java線程面試題

下面是Java線程相關的熱門面試題,你可以用它來好好打算面試。

線程是操作系統能夠進行運算調度的最小單位,它被包含在進程之中,是

進程中的實際運作單位。程序員可以通過它進行多處理器編程,你可以運

用多線程對運算密集型任務提速。比如,假如一個線程完成一個任務要100

毫秒,那么用十個線程完成改任務只需10毫秒。Java在語言層面對多線

程供應了卓越的支持,它也是一個很好的賣點。

線程是進程的子集,一個進程可以有很多線程,每條線程并行執行不同的

任務。不同的進程運用不同的內存空間,而全部的線程共享一片相同的內

存空間。別把它和棧內存搞混,每個線程都擁有單獨的棧內存用來存儲本

地數據。

在語言層面有兩種方式。java.lang.Thread類的實例就是一個線程但是

它須要調用接口來執行,由于線程類本身就是調用的Runnable接口所以

你可以繼承java.lang.Thread類或者干脆調用Runnable接口來重寫

run()方法實現線程。

這個問題是上題的后續,大家都知道我們可以通過繼承Thread類或者調

用Runnable接口來實現線程,問題是,那個方法更好呢?什么狀況下運

用它?這個問題很簡潔回答,假如你知道Java不支持類的多重繼承,但

允許你調用多個接口。所以假如你要繼承其他類,當然是調用Runnable

接口好了。

這個問題常常被問到,但還是能從今區分出面試者對Java線程模型的理

解程度。start。方法被用來啟動新創建的線程,而且start。內部調用了

run()方法,這和干脆調用run()方法的效果不一樣。當你調用run()方法

的時候,只會是在原來的線程中調用,沒有新的線程啟動,start。方法

才會啟動新線程。

Runnable和Callable都代表那些要在不同的線程中執行的任務°Runnable

從JDKL0起先就有了,Callable是在JDK1.5增加的。它們的主要區分是

Callable的call()方法可以返回值和拋出異樣,而Runnable的run()

方法沒有這些功能。Callable可以返回裝載有計算結果的Future對象。

CyclicBarrier和CountDownLatch都可以用來讓一組線程等待其它線

程。與CyclicBarrier不同的是,CountdownLatch不能重新運用。

Java內存模型規定和指引Java程序在不同的內存架構、CPU和操作系統

間有確定性地行為。它在多線程的狀況下尤其重要。Java內存模型對一個

線程所做的變動能被其它線程可見供應了保證,它們之間是先行發生關系。

這個關系定義了一些規則讓程序員在并發編程時思路更清楚。比如,先行

發生關系確保了:

.線程內的代碼能夠按先后依次執行,這被稱為程序次序規則。

.對于同一個鎖,一個解鎖操作確定要發生在時間上后發生的另一個鎖

定操作之前,也叫做管程鎖定規則。

?前一個對volatile的寫操作在后一個volatile的讀操作之前,也叫

volatile變量規則。

?一個線程內的任何操作必需在這個線程的start。調用之后,也叫作

線程啟動規則。

?一個線程的全部操作都會在線程終止之前,線程終止規則。

.一個對象的終結操作必需在這個對象構造完成之后,也叫對象終結規

則。

?可傳遞性

我劇烈建議大家閱讀《Java并發編程實踐》第十六章來加深對Java內存

模型的理解。

volatile是一個特別的修飾符,只有成員變量才能運用它。在Java并發

程序缺少同步類的狀況下,多線程對成員變量的操作對其它線程是透亮的。

volatile變量可以保證下一個讀取操作會在前一個寫操作之后發生,就是

上一題的volatile變量規則。

假如你的代碼所在的進程中有多個線程在同時運行,而這些線程可能會同

時運行這段代碼。假如每次運行結果和單線程運行的結果是一樣的,而且

其他的變量的值也和預期的是一樣的,就是線程平安的6—個線程平安的

計數器類的同一個實例對象在被多個線程運用的狀況下也不會出現計算

失誤。很明顯你可以將集合類分成兩組,線程平安和非線程平安的。Vector

是用同步方法來實現線程平安的,而和它相像的ArrayList不是線程平安

的。

競態條件會導致程序在并發狀況下出現一些bugso多線程對一些資源的競

爭的時候就會產生競態條件,假如首先要執行的程序競爭失敗排到后面執

行了,那么整個程序就會出現一些不確定的bugs。這種bugs很難發覺而

且會重復出現,因為線程間的隨機競爭。

Java供應了很豐富的API但沒有為停止線程供應APLJDK1.0原來有一

些像stop。,suspend()和resume。的限制方法但是由于潛在的死鎖威

逼因此在后續的JDK版本中他們被棄用了,之后JavaAPI的設計者就沒

有供應一個兼容且線程平安的方法來停止一個線程。當run()或者callO

方法執行完的時候線程會自動結束,假如要手動結束一個線程,你可以用

volatile布爾變量來退出run()方法的循環或者是取消任務來中斷線程。

這是我在一次面試中遇到的一個很刁鉆的Java面試題,簡潔的說,假如

異樣沒有被捕獲該線程將會停止執行。

Thread.UncaughtExceptionHandler是用于處理未捕獲異樣造成線程突然

中斷狀況的一個內嵌接口。當一個未捕獲異樣將造成線程中斷的時候JVM

會運用Thread.getUncaughtExceptionHandler()來查詢線程的

UncaughtExceptionHandler并將線程和異樣作為參數傳遞給handler的

uncaughtException()方法進行處理。

你可以通過共享對象來實現這個目的,或者是運用像堵塞隊列這樣并發的

數據結構。這篇教程《Java線程間通信》(涉與到在兩個線程間共享對象)

用wait和notify方法實現了生產者消費者模型。

這又是一個刁鉆的問題,因為多線程可以等待單監控鎖,JavaAPI的設

計人員供應了一些方法當等待條件變更的時候通知它們,但是這些方法沒

有完全實現。notify。方法不能喚醒某個具體的線程,所以只有一個線程

在等待的時候它才有用武之地。而notifyAUO喚醒全部線程并允許他們

爭奪鎖確保了至少有一個線程能接著運行。

這是個設計相關的問題,它考察的是面試者對現有系統和一些普遍存在但

看起來不合理的事物的看法。回答這些問題的時候,你要說明為什么把這

些方法放在Object類里是有意義的,還有不把它放在Thread類里的緣由。

一個很明顯的緣由是JAVA供應的鎖是對象級的而不是線程級的,每個對

象都有鎖,通過線程獲得。假如線程須要等待某些鎖那么調用對象中的

wait。方法就有意義了。假如wait。方法定義在Thread類中,線程正在

等待的是哪個鎖就不明顯了。簡潔的說,由于wait,notify和notifyAll

都是鎖級別的操作,所以把他們定義在Object類中因為鎖屬于對象。

ThreadLocal是Java里一種特別的變量。每個線程都有一個ThreadLocal

就是每個線程都擁有了自己獨立的一個變量,競爭條件被徹底消退了。它

是為創建代價昂揚的對象獲得線程平安的好方法,比如你可以用

ThreadLocal讓SimpleDateFormat變成線程平安的,因為那個類創建代價

昂揚且每次調用都須要創建不同的實例所以不值得在局部范圍運用它,假

如為每個線程供應一個自己獨有的變量拷貝,將大大提高效率。首先,通

過復用削減了代價昂揚的對象的創建個數。其次,你在沒有運用高代價的

同步或者不變性的狀況下獲得了線程平安。線程局部變量的另一個不錯的

例子是ThreadLocalRandom類,它在多線程環境中削減了創建代價昂揚的

Random對象的個數。

在Java并發程序中FutureTask表示一個可以取消的異步運算。它有啟動

和取消運算、查詢運算是否完成和取回運算結果等方法。只有當運算完成

的時候結果才能取回,假如運算尚未完成get方法將會堵塞。一個

FutureTask對象可以對調用了Callable和Runnable的對象進行包裝,由

于FutureTask也是調用了Runnable接口所以它可以提交給Executor來

執行。

inlerrupledO和islnlerrupled()的主耍區分是前者會將中斷狀態

清除而后者不會。Java多線程的中斷機制是用內部標識來實現的,調用

Thread,interrupt()來中斷一個線程就會設置中斷標識為true。當中斷線

程調用靜態方法Thread,interrupted。來檢查中斷狀態時,中斷狀態會被

清零。而非靜態方法islnterrupted。用來查詢其它線程的中斷狀態且不

會變更中斷狀態標識。簡潔的說就是任何拋出InterruptedException異

樣的方法都會將中斷狀態清零。無論如何,一個線程的中斷狀態有有可能

被其它線程調用中斷來變更。

主要是因為JavaAPI強制要求這樣做,假如你不這么做,你的代碼會拋

出HlegalMonitorStateException異樣。還有一個緣由是為了避開wait

和notify之間產生競態條件。

處于等待狀態的線程可能會收到錯誤警報和偽喚醒,假如不在循環中檢查

等待條件,程序就會在沒有滿足結束條件的狀況下退出。因此,當一個等

待線程醒來時,不能認為它原來的等待狀態仍舊是有效的,在notify。

方法調用之后和等待線程醒來之前這段時間它可能會變更。這就是在循環

中運用wait。方法效果更好的緣由,你可以在Eclipse中創建模板調用

wait和notify試一試。假如你想了解更多關于這個問題的內容,我舉薦

你閱讀《EffectiveJava》這本書中的線程和同步章節。

同步集合與并發集合都為多線程和并發供應了合適的線程平安的集合,不

過并發集合的可擴展性更高。在Javal.5之前程序員們只有同步集合來用

且在多線程并發的時候會導致爭用,阻礙了系統的擴展性。Java5介紹了

并發集合像ConcurrentHashMap,不僅供應線程平安還用鎖分別和內部分

區等現代技術提高了可擴展性。

為什么把這個問題歸類在多線程和并發面試題里?因為棧是一塊和線程

緊密相關的內存區域。每個線程都有自己的棧內存,用于存儲本地變量,

方法參數和棧調用,一個線程中存儲的變量對其它線程是不行見的。而堆

是全部線程共享的一片公用內存區域。對象都在堆里創建,為了提升效率

線程會從堆中弄一個緩存到自己的棧,假如多個線程運用該變量就可能引

發問題,這時volatile變量就可以發揮作用了,它要求線程從主存中讀

取變量的值。

創建線程要花費昂貴的資源和時間,假如任務來了才創建線程那么響應時

間會變長,而且一個進程能創建的線程數有限。為了避開這些問題,在程

序啟動的時候就創建若干線程來響應處理,它們被稱為線程池,里面的線

程叫工作線程。從JDK1.5起先,JavaAPI供應了Executor框架讓你可以

創建不同的線程池。比如單線程池,每次處理一個任務;數目固定的線程

池或者是緩存線程池(一個適合很多生存期短的任務的程序的可擴展線程

池)。

在現實中你解決的很多線程問題都屬于生產者消費者模型,就是一個線程

生產任務供其它線程進行消費,你必需知道怎么進行線程間通信來解決這

個問題。比較低級的方法是用wait和notify來解決這個問題,比較贊的

方法是用Semaphore或者BlockingQueue來實現生產者消費者模型,這

篇教程有實現它。

Java多線程中的死鎖

死鎖是指兩個或兩個以上的進程在執行過程中,因爭奪資源而造成的一種

相互等待的現象,若無外力作用,它們都將無法推動下去。這是一個嚴峻

的問題,因為死鎖會讓你的程序掛起無法完成任務,死鎖的發生必需滿足

以下四個條件:

?互斥條件:一個資源每次只能被一個進程運用。

?懇求與保持條件:一個進程因懇求資源而堵塞時,對已獲得的資源保

持不放。

?不剝奪條件:進程已獲得的資源,在末運用完之前,不能強行剝奪。

?循環等待條件:若干進程之間形成一種頭尾相接的循環等待資源關系。

避開死鎖最簡潔的方法就是阻擋循環等待條件,將系統中全部的資源設置

標記位、排序,規定全部的進程申請資源必需以確定的依次(升序或降序)

做操作來避開死鎖。

這是上題的擴展,活鎖和死鎖類似,不同之處在于處于活鎖的線程或進程

的狀態是不斷變更的,活鎖可以認為是一種特別的饑餓。一個現實的活鎖

例子是兩個人在狹小的走廊遇到,兩個人都試著避讓對方好讓彼此通過,

但是因為避讓的方向都一樣導致最終誰都不能通過走廊。簡潔的說就是,

活鎖和死鎖的主要區分是前者進程的狀態可以變更但是卻不能接著執行。

我始終不知道我們竟然可以檢測一個線程是否擁有鎖,直到我參與了一次

電話面試。在中有一個方法叫holdsLock(),它返回true假如當且僅當當

前線程擁有某個具體對象的鎖。

對于不同的操作系統,有多種方法來獲得Java進程的線程堆棧。當你獲

得線程堆棧時,JVM會把全部線程的狀態存到日志文件或者輸出到限制臺。

在Windows你可以運用Ctrl+Break組合鍵來獲得線程堆棧,Linux下用

kill-3吩咐。你也可以用jstack這個工具來獲得,它對線程id進行操

作,你可以用jps這個工具找到ido

這個問題很簡潔,-Xss參數用來限制線程的堆棧大小。你可以查看JVM

配置列表來了解這個參數的更多信息。

Java在過去很長一段時間只能通過synchronized關鍵字來實現互斥,它

有一些缺點。比如你不能擴展鎖之外的方法或者塊邊界,嘗試獲得鎖時不

能中途取消等。Java5通過Lock接口供應了更困難的限制來解決這些問

題。ReentrantLock類實現了Lock,它擁有與synchronized相同的并

發性和內存語義且它還具有可擴展性。

在多線程中有多種方法讓線程按特定依次執行,你可以用線程類的joinO

方法在一個線程中啟動另一個線程,另外一個線程完成該線程接著執行。

為了確保三個線程的依次你應當先啟動最終一個(T3調用T2,T2調用T1),

這樣T1就會先完成而T3最終完成。

Yield方法可以暫停當前正在執行的線程對象,讓其它有相同優先級的線

程執行。它是一個靜態方法而且只保證當前線程放棄CPU占用而不能保證

使其它線程確定能占用CPU,執行yield。的線程有可能在進入到暫停狀

態后立刻又被執行。

ConcurrentHashMap把實際map劃分成若干部分來實現它的可擴展性和線

程平安。這種劃分是運用并發度獲得的,它是Concu門'entHashMap類構造

函數的一個可選參數,默認值為16,這樣在多線程狀況下就能避開爭用。

Java中的Semaphore是一種新的同步類,它是一個計數信號。從概念上講,

從概念上講,信號量維護了一個許可集合。如有必要,在許可可用前會堵

塞每一個acquire(),然后再獲得該許可。每個release。添加一個許可,

從而可能釋放一個正在堵塞的獲得者。但是,不運用實際的許可對象,

Semaphore只對可用許可的號碼進行計數,并實行相應的行動。信號量常

常用于多線程的代碼中,比如數據庫連接池。

這個問題問得很狡猾,很多程序員會認為該任務會堵塞直到線程池隊列有

空位。事實上假如一個任務不能被調度執行那么ThreadPoolExecutor's

submit()方法將會拋出一個RejectedExecutionException異樣。

兩個方法都可以向線程池提交任務,execute。方法的返回類型是void,

它定義在Executor接口中,而submit()方法可以返回持有計算結果的

Future對象,它定義在ExecutorService接口中,它擴展了Executor接

口,其它線程池類像ThreadPoolExecutor和

ScheduledThreadPoolExecutor都有這些方法。

堵塞式方法是指程序會始終等待該方法完成期間不做其他事情,

ServerSocket的accept()方法就是始終等待客戶端連接。這里的堵塞是

指調用結果返回之前,當前線程會被掛起,直到得到結果之后才會返回。

此外,還有異步和非堵塞式方法在任務完成前就返回。

你可以很確定的給出回答,Swing不是線程平安的,但是你應當說明這么

回答的緣由即便面試官沒有問你為什么。當我們說swing不是線程平安的

常常提到它的組件,這些組件不能在多線程中進行修改,全部對GUI組件

的更新都要在AWT線程中完成,而Swing供應了同步和異步兩種回調方法

來進行更新。

這兩個方法是SwingAPI供應應Java開發者用來從當前線程而不是事務

派發線程更新GUI組件用的。InvokeAndWait()同步更新GUI組件,比如

一個進度條,一旦進度更新了,進度條也要做出相應變更。假如進度被多

個線程跟蹤,那么就調用invokeAndWaitO方法懇求事務派發線程對組件

進行相應更新。而invokeLaterO方法是異步調用更新組件的。

這個問題又提到了swing和線程平安,雖然組件不是線程平安的但是有一

些方法是可以被多線程平安調用的,比如repaint(),revalidateO。

JTextComponent的setText()方法和JTextArea的insert()和append()

方法也是線程平安的。

這個問題看起來和多線程沒什么關系,但不變性有助于簡化已經很困難

的并發程序。Immutable對象可以在沒有同步的狀況下共享,降低了對該

對象進行并發訪問時的同步化開銷。可是Java沒有?Immutable這個注解

符,要創建不行變類,要實現下面幾個步驟:通過構造方法初始化全部成

員、對變量不要供應setter方法、將全部的成員聲明為私有的,這樣就

不允許干脆訪問這些成員、在getter方法中,不要干脆返回對象本身,

而是克隆對象,并返回對象的拷貝。

一般而言,讀寫鎖是用來提升并發程序性能的鎖分別技術的成果。Java中

的ReadWriteLock是Java5中新增的一個接口,一個ReadWriteLock維

護一對關聯的鎖,一個用于只讀操作一個用于寫。在沒有寫線程的狀況下

一個讀鎖可能會同時被多個讀線程持有。寫鎖是獨占的,你可以運用JDK

中的ReentrantReadWriteLock來實現這個規則,它最多支持65535個寫

鎖和65535個讀鎖。

忙循環就是程序員用循環讓一個線程等待,不像傳統方法wait(),sleep()

或yieldO它們都放棄了CPU限制,而忙循環不會放棄CPU,它就是在運

行一個空循環。這么做的目的是為了保留CPU緩存,在多核系統中,一個

等待線程醒來的時候可能會在另一個內核運行,這樣會重建緩存。為了避

開重建緩存和削減等待重建的時間就可以運用它了。

這是個好玩的問題。首先,volatile變量和atomic變量看起來很像,

但功能卻不一樣。Volatile變量可以確保先行關系,即寫操作會發生在后

續的讀操作之前,但它并不能保證原子性。例如用volatile修飾count

變量那么count++操作就不是原子性的。而Atomiclntcger類供應的

atomic方法可以讓這種操作具有原子性如getAndlncrement()方法會原子

性的進行增量操作把當前值加一,其它數據類型和引用變量也可以進行相

像操作。

這個問題坑了很多Java程序員,若你能想到鎖是否釋放這條線索來回答

還有點希望答對。無論你的同步塊是正常還是異樣退出的,里面的線程都

會釋放鎖,所以對比鎖接口我更喜愛同步塊,因為它不用我花費精力去釋

放鎖,該功能可以在finallyblock里釋放鎖實現。

這個問題在Java面試中常常被問到,但是面試官對回答此問題的滿足度

僅為50%。一半的人寫不出雙檢鎖還有一半的人說不出它的隱患和Javal.5

是如何對它修正的。它其實是一個用來創建線程平安的單例的老方法,當

單例實例第一次被創建時它試圖用單個鎖進行性能優化,但是由于太過于

困難在JDKL4中它是失敗的,我個人也不喜愛它。無論如何,即便你也

不喜愛它但是還是要了解一下,因為它常常被問到。

這是上面那個問題的后續,假如你不喜愛雙檢鎖而面試官問了創建

Singleton類的替代方法,你可以利用JVM的類加載和靜態變量初始化特

征來創建Singleton實例,或者是利用枚舉類型來創建Singleton,我很

喜愛用這種方法。

這種問題我最喜愛了,我信任你在寫并發代碼來提升性能的時候也會遵循

某些最佳實踐。以下三條最佳實踐我覺得大多數Java程序員都應當遵循:

?給你的線程起個有意義的名字。

這樣可以便利找bug或追蹤。OrderProcessor,QuoteProcessoror

TradeProcessor這種名字比Thread-1.Thread-2andThread-3好

多了,給線程起一個和它要完成的任務相關的名字,全部的主要框架

甚至JDK都遵循這個最佳實踐。

?避開鎖定和縮小同步的范圍

鎖花費的代價昂揚且上下文切換更耗費時間空間,試試最低限度的運

用同步和鎖,縮小臨界區。因此相對于同步方法我更喜愛同步塊,它

給我擁有對鎖的確定限制權。

?多用同步類少用wait和notify

首先,CountDownLatch,Semaphore,CyclicBarrier和Exchanger這

些同步類簡化了編碼操作,而用wait和notify很難實現對困難限制

流的限制。其次,這些類是由最好的企業編寫和維護在后續的JDK中

它們還會不斷優化和完善,運用這些更高等級的同步工具你的程序可

以不費吹灰之力獲得優化。

?多用并發集合少用同步集合

這是另外一個簡潔遵循且受益巨大的最佳實踐,并發集合比同步集合

的可擴展性更好,所以在并發編程時運用并發集合效果更好。假如下

一次你須要用到map,你應當首先想到用ConcurrentHashMapo

這個問題就像是如何強制進行Java垃圾回收,目前還沒有覺得方法,雖

然你可以運用System.gc()來進行垃圾回收,但是不保證能勝利。在Java

里面沒有方法強制啟動一個線程,它是被線程調度器限制著且Java沒有

公布相關的APT。

forkjoin框架是JDK7中出現的一款高效的工具,Java開發人員可以通

過它充分利用現代服務器上的多處理器。它是特地為了那些可以遞歸劃分

成很多子模塊設計的,目的是將全部可用的處理實力用來提升程序的性能。

forkjoin框架一個巨大的優勢是它運用了工作竊取算法,可以完成更多

任務的工作線程可以從其它線程中竊取任務來執行。

Java程序中wait和sleep都會造成某種形式的暫停,它們可以滿足不同

的須要。wait。方法用于線程間通信,假如等待條件為真且其它線程被喚

醒時它會釋放鎖,而sleepO方法僅僅釋放CPU資源或者讓當前線程停止

執行一段時間,但不會釋放鎖。

2023年ssm面試題

1.很新的面試題

2.很全的面試題

3.很重點的面試題框架

Struts2與Strutsl的面試題

###1.Struts2與Strutsl的聯系與區分?為什么要用Struts2?

strutsl與struts2都是mvc框架的經典實現模式。

Struts2不是從Strutsl升級而來,而是由WebWork改名而來,而WebW

ork只是Xwork加了很多WEB攔截器而已

區分:

1.核心限制器改成了過濾器(過濾器比Servlet的級別要高,因為程

序運行時是先進入過濾器再進入Servlet)

2.strutsl嚴峻依靠于Servlet(因為太過于依靠于api的Servle

tRequest與ServletResponse的兩個參數),

struts2就則脫離了Servlet的API。

3.管理Action時strutsl是單例模式,struts2是每個懇求產生一個

實例。

4.在表達式的支持上struts2不僅有jstL還有功能更加強大的ogn

1表達式。

5.strutsl的類型轉換是單向的(頁面到ActionForm),struts2是雙向

的(頁面到Action再到頁面回顯)

6.校驗,strutsl沒有針對具體方法的校驗,struts2供應了指定某個

方法進行效驗,還有框架校驗。

7.struts2供應了攔截器,利用攔截器可以在訪問Action之前或之后

增加如權限攔截等功能。

8.struts2供應了全局范圍,包范圍,Action范圍的國際化資源文件

管理實現。

9.struts2支持多種視圖類型

###2.Struts2的核心是什么,體現了什么思想?

Struts2的核心是攔截器,基本上核心功能都是由攔截器完成,攔截器

的實現體現了A0P(面對切面編程)思想

###3.為何繼承ActionSupport

因為ActionSupport實現了Action接口,供應了國際化,校驗的功能。

ActionSupport實現了國際化功能:因為它供應了一個getText(Stri

ngkey)方法實現國際化,該方法從資源文件上獲得國際化信息。

Action接口供應了五個常量(success,error,login,input,none)o

(s?k,ses,er?(r)n?n

###4.模型驅動與屬性驅動是什么模型驅動運用時留意什么問題

答:模型驅動與屬性驅動都是用來封裝數據的。

1.模型驅動:在實現類中實現ModelDriven〈T>接口運用泛型把屬性類

封裝起來,重寫getModel。方法,然后在實現類里創建一個屬性類的實例,

2.屬性驅動:在實現類里定義屬性,生成get與set方法,通過屬性

來拿值。

###5.Struts2是怎樣進行值封裝的?

struts2的值封裝事實上是采納了ognl表達式.

###6.Struts2如何進行校驗

1.每個Action類有一個校驗文件,命名Action類名-validation,xm

1,且與Action類同書目,這是對action里面全部的方法進行校驗。

2.對Action里面的指定方法做校驗運用Action的類名-訪問路徑一方

法名-validation.xml。

在效驗文件里又分為兩種:

字段校驗:字段用什么校驗器來校驗。

非字段校驗:是用校驗器校驗什么字段。

###7.談談Struts2的國際化

在struts2中是運用了攔截器來實現國際化。

具體是先配置屬性文件,格式是文件名.語言—國家名.properties,然

后放的位置有Action同包位置,

package位置,全局位置(要在常量里面配置),然后頁面通過s:text

或者key屬性去訪問

###8?0GNL是什么你在項目中如何運用它

0GNL是:對象圖形導航語言。

在struts2中的作用:

ognl的實現關系:ActionConctxt。

ognl3個常用的符號#$%

#

1構造map,list集合。2取ognl上下文的值。3用來過濾集合。

$

1在校驗框架中取資源文件中的值。

2可以在配置文件中傳遞參數。

%

運用百分號可以進行轉義。

###9.Strust2如何訪問ServletAPI

1:通過ActionContext可以獲得request,application,session

三個作用域(struts2事實上是通過適配器

來把servlet的api轉換為一個map,并把這些map放在ActionCont

ext里面)。2:通過ActionContext的子類ServletActionContext去獲

得原滋原味的API。

3:可以通過實現ServlctRequcstAware接口,重寫里面的sctServle

tRequest方法可以獲

得request,事實上是通過set的依靠注入。

###10.什么是攔截器說說Struts2用攔截器來干什么說出6個攔截

器來

說明:在訪問類的某個方法或者屬性之前執行,攔截的是Action的懇

求,進行攔截然后在方法的執行前或者之后加入某些操作。

作用:國際化,權限,效驗等與源代碼無關的操作。

攔截器:

國際化,表單重復提交,類型轉換,自動裝配,數據封裝,異樣處理,

模型驅動,懇求參數,處理類型轉換錯誤,日志攔截器.

###11.如何實現自定義攔截器?須要留意什么?

實現:

1.可以實現Interceptor接口,重寫dolntercept方法指定某個方法

進行攔截,或者繼承AbstractInterceptor類,重寫intercept方法。

2.在xml配置文件中定義自定義攔截器,然后注入到攔截器棧中,再

把攔截器引用到action中。

3.可以配置到某個action單獨運用,也可以配置到包下面的全部act

ion運用。留意:

要把默認的攔截器棧重新引用,否則會被覆蓋。

###12.ActionContext是用來干什么的

ActionContext是Action的上下文。

###13.為什么要繼承默認的包?

因為在Strtus2里面默認有很多的常量,攔截器,還有一些bean,假如

繼承默認的包,這些默認值和常量就會繼承過來,

###14.常見的有哪幾種結果集類型?

dispatcher:指得是轉發,默認的結果集類型

redirect:重定向,

redirectAction:重定向到一個Action

stream:是返回一個流,一般用在文件下載上面

###15.開發項目時struts2在頁面怎樣拿值?

從值棧中或者是ognl的上下文

###16.怎么樣用Struts2進行文件的上傳或者下載

上傳:

1.在jsp用了s:file標簽,把s:from的enctype屬性設置為multip

art/form-data

2.在action里面定義三個字段Filefile,String[file]Content!

ype,String[file]FileName

3.用輸出流轉化成硬盤上面的文件

下載:

1.在struts,xml中配置result為stream的類型

2.在action定義四個屬性,默認的有個是InputStream的類型叫inp

utStream的,從硬盤上面讀取文件到這個流賦值即可.

contentType;contentLength;contentDisposition;inputstream;

###17.簡潔講下struts里面的標簽,說不少于5個

s:if

s:form

s:url

s:property

s:iterater

###18.默認struts2里面的標簽取值都是從那里取值的

默認都是從0GNL值棧里面取值的

###19.ValueStack分為那兩部分,組成部分是什么,分別怎么訪問

分為:

對象棧和ContextMap

訪問:

1.對象棧前臺可以干脆訪問

2.ContextMap訪問的時候前面加#

###20.標簽<s:property)和el表達式有什么區分,

相同:

都可以從值棧里面取值

區分:

el表達式只能取屬性有getset方法的簡潔數據類型

s:property標簽:取得數組的一些方法等困難數據對象類型

###21.說下重復提交的解決思路,Struts2是怎么樣解決重復提交的

1.在頁面表單域加入一個隱藏的s:token字段,然后在session里面也

加入同樣的值

2.當用戶第一次懇求的時候,把request的值和session對比,相同就

通過懇求,執行下面攔截器,并且移除Session里面的值

3.假如其次次懇求時候,Session已經沒有這個值,那么就阻斷當前懇

求,定位重復提交Struts2是通過s:token標簽來完成重復提交思路的

spring的面試題部分

Spring的aop你怎樣實現?

用動態代理和cglib實現,有接口的用動態代理,無接口的用cglib

###2.Spring在SSH起什么作用

為大部分框架供應模版,常見的核心類供應初始化,并且整合三層框架

###3.Spring容器內部怎么實現的

內部用Map實現,或者說HashMap

###4.怎么樣理解TOC與A0P

I0C是一種限制反轉的思想,降低了對象的耦合度,A0P是面對切面編

程,非侵入式編程,實現了非業務性編程(公共功能),譬如日志,權限,事務

等等

###5.Spring的事務,事務的作用。

Spring里面的事務分為編程式事務和聲明式事務,一般用聲明式事務,

用來限制數據操作的完整性,一樣性

###6.Spring的IOC和AOP你在項目中是怎么運用的?

IOC主要來解決對象之間的依靠問題,把全部的bear.的依靠關系通過

配置文件或者注解關聯起來,降低了耦合度,AOP一般用來整合框架時候都

可以用得到,

事務用的最多,還有個別日志,權限功能也可以用到

###7Spring主要運用了什么模式?

工廠模式一>每個Bean的創建通過方法

單例模式一>默認的每個Bean的作用域都是單例

代理模式一>關于AOP的實現是通過代理,體現代理模式

###8.Springbean的作用域.

Scope作用域有4種,常見的有單例或者多例,默認是單例

###9.Spring的事務是如何配置的?

1.先配置事務管理器TransactionManager,不同的框架有不同屬性

2.再配置事務通知和屬性,通過tx:advice

3.配置<aop:config),設置那些方法或者類須要加入事務

###10.Spring的配置文件最好運用什么文件?

xml,因為它是最簡潔,最流行的數據格式

###11.你運用過Spring中的哪些技術?

bean的管理,AOP技術,I0C技術,事務等

###12.為什么要用Spring

降低對象耦合度,讓代碼更加清楚,供應一些常見的模版

###13.說下Spring的注解

1.bean的標記注解

?Component通用注解?Repository長久層注解?Service業務層注

解?Controller:表現層注解

2.bean的自動裝配注解

?AutoWired默認是依據類型裝配,假如有多個類型實現可以用Quali

fier來指定名

?Resource默認是依據名稱來裝配,是JDK里面自帶的注解,默認狀況

下用@AutoWired注解

###15.寫過類似SpringA0P的操作嗎?

簡潔的寫過,譬如前置通知,后置通知的方法,環繞通知,事務就是典型

的A0P的實現

###16.Spring中的AOP在你項目中是怎么運用的,用在哪里?

Struts2和Hibernate整合時候都可以用得到,事務用的最多,還有個

別日志,權限功能也可以用到

###17.Spring的事務(傳播屬性,隔離級別)。

七大傳播屬性,四大隔離級別

###19,SpringDI的幾種方式

setter注入和構造器注入,一般用setter注入

###20.依靠注入的原理

就是通過反射機制生成想要的對象注入

###21.說一下整合Spring的核心監聽器。

這個是在SSH整合的時候運用,是整個WEB項目啟動的時候初始化Spr

ing的容器.具體是在web.xml里面配置的ContextLoaderListener

Spring配置文件中的核心是個監聽器,是用來初始化Spring的容器

###22.Spring你們為什么用配置文件而不運用注解?

配置文件耦合度低,簡潔維護,尤其是在切面或者事務的時候,只配置

一次就可以讓很多代碼擁有事務,

###23.Spring和Hibernate的事務有什么區分?

Spring的事務供應了統一的事務處理機制,包含了JDBC,Hibernate,I

Batis等事務實現,而Hibernate只處理自己事務

###24.Struts2與Spring整合先啟動那個容器。

先啟動監聽器,因為先要初始化容器,初始化容器了以后Action才能

從容器里面獲得

###26.讓你寫Spring的容器,你是怎樣實現的?

我們可以寫一個HashMap,假如并發考慮的話要寫并發的Map,把bean

的名字放在map的key,bean的實現map的value

###27.談談Spring的IOC和AOP,假如不用Spring,怎么去實現這兩

個技術。

ioc用反射實現,AOP用動態代理實現

###28.Spring事務和Hibernate事務的操作上面的區分?

hibernate的事務只能手動顯示代碼的方式限制創建事務與提交事務

以與回滾。

Spring可以通過配置文件設定一類class事務的創建與提交以與回滾,

也可以顯示代碼方式限制。

###29.講下Spring的七大事務傳播

有七個,常用有兩個REQUIERD,REQUIRED_NEW,REQUIERD表示兩個事

務的方法調用的時候,前面的時候和后面的合并成一個事務,REQUIRED_NE

W是重啟一個事務,各干各的

###30.在同一進程里,有A,B兩個方法都對不同的表進行更新數據,

假如A方法出異樣了,若要B方法執行,怎樣配置事務級別,若不要B方

法執行,又該怎樣配置?

前者用REQUIRED_NEW,后者用REQUIRED

###31.事務并發會引起什么問題,怎么解決

事務并發會引起臟讀,幻讀,不行重復讀等問題,設定事務的隔離級別

就可以解決

###32.事務的隔離級別

Spring定義有四種,但是常見的是READ_C0MMIT,Oralce有兩種實現,M

YSql有四種

###33.Spring的I0C容器與工廠類有什么區分?

IOC(InversionofControl)對Bean的限制實力更強,能限制對象自

動注入,還可以限制生命周期,而工廠類只是簡潔的創建一個對象,沒有什

么限制實力

###34.事務的平安問題:鎖機制的實現原理與在項目中的運用

鎖有悲觀鎖和樂觀鎖,悲觀鎖一般假設每個人都會修改數據,默認狀況

下把數據都鎖住,影響性能,但平安性高.

樂觀鎖是假設每個人都只讀下數據,不會修改數據,性能比較高,但是

平安性較低,一般通過增加類似于版本限制里面版本號來解決問題

###35.講下BeanFactory和ApplicationContext的區分

BeanFactory是Spring容器頂級核心接口,比較早,但功能比較少,get

Bean就是BeanFactory定義的,

ApplicationContext是Spring里面的另外一個容器頂級接口,它繼承

于BeanFactory,但是供應的功能譬如校驗,國際化,監聽,

對Bean的管理功能比較多,一般運用ApplicationContext

講下SpringMvc和Strutsl,Struts2的比較的優勢

性能上Struts1>SpringMvc>Struts2開發速度上SpringMvc和Strut

s2差不多,比Strutsl要高

講下SpringMvc的核心入口類是什么,Strutsl,Struts2

的分別是什么

SpringMvc的是DispatchServlet,Strutsl的是ActionServlet,Stru

ts2的是StrutsPrepareAndExecuteFilter

###f-sm-3.SpringMvc的限制器是不是單例模式,假如是,有什么問

題,怎么解決

是單例模式,所以在多線程訪問的時候有線程平安問題,不要用同步,

會影響性能的,解決方案是在限制器里面不能寫字段

SpingMvc中的限制器的注解一般用那個,有沒有別的注

解可以替代

一般用?Controller注解,表示是表現層,不能用用別的注解代替.

?RequestMapping注解用在類上面有什么作用

用于類上,表示類中的全部響應懇求的方法都是以該地址作為父路徑。

###f-sm-6.怎么樣把某個懇求映射到特定的方法上面

干脆在方法上面加上注解@RequestMapping,并且在這個注解里面寫上

要攔截的路徑假如在攔截懇求中,我想攔截get方式提交的

方法,怎么配置

springMVC模式的面試題部分

可以在@RequestMapping注解里面加上method=RequestMethod.GET

###f-sm-8.假如在攔截懇求中,我想攔截提交參數中包含〃type二test

〃字符串,怎么配置

可以在?RequestMapping注解里面加上params="type=test”

###f-sm-9.我想在攔截的方法里面得到從前臺傳入的參數,怎么得到

干脆在形參里面聲明這個參數就可以,但必需名字和傳過來的參數一

###f-sm-10.假如前臺有很多個參數傳入,并且這些參數都是一個對

象的,那么怎么樣快速得到這個對象

干脆在方法中聲明這個對象,SpringMvc就自動會把屬性賦值到這個

對象里面1.怎么樣在方法里面得到Request,或者Session

干脆在方法的形參中聲明request,SpringMvc就自動把request對象

傳入

###f-sm-12.SpringMvc中函數的返回值是什么.

返回值可以有很多類型,有String,ModelAndView,List,Set等,一般

用String比較好,假如是AJAX懇求,返回的可以是一個集合

SpringMvc怎么處理返回值的

SpringMvc依據配置文件中InternalResourceViewResolver(內部資

源視圖解析器)的前綴和后綴,用前綴+返回值+后綴組成完整的返回值

mf-sm-14.SpringMVC怎么樣設定重定向和轉發的

在返回值前面加〃forward:"就可以讓結果轉發,譬如“forward:user.d

o?name=method4/,在返回值前面加〃redirect:〃就可以讓返回值重定向,

譬如"redirect:://uu456SpringMvc用什么

對象從后臺向前臺傳遞數據的

通過ModelMap對象,可以在這個對象里面用addAttributeO方法,把

對象加到里面,前臺就可以通過el表達式拿到

###f-sm-16.SpringMvc中有個類把視圖和數據都合并的一起的,叫

什么

ModelAndView

###f-sm-17.怎么樣把數據放入Session里面

可以聲明一個request,或者session先拿到session,然后就可以放入

數據,或者可以在類上面加上@SessionAttributes注解,

里面包含的字符串就是要放入session里面的key

SpringMvc怎么和AJAX相互調用的

通過Jackson框架就可以把Java里面的對象干脆轉化成Js可以識別

的Json對象具體步驟如下:

1.力口入Jackson,jar

2.在配置文件中配置json的映射

3.在接受Ajax方法里面可以干脆返回Object,List等,但方法前面要

加上@ResponseBody注解

###f-sm-19.當一個方法向AJAX返回特別對象,譬如Object,List等,

須要做什么處理

要加上@ResponseBody注解

###f-sm-20.SpringMvc里面攔截器是怎么寫的

有兩種寫法,一種是實現接口,另外一種是繼承適配器類,然后在Spri

ngMvc的配置文件中配置攔截器即可:

<!一配置SpringMvc的攔截器一><mvc:interceptors><!一配置

一個攔截器的Bean就可以了默認是對全部懇求都攔截一

<beanid二〃mylnterceptor"class=zzcom.et.action.MyHandlerlnter

ceptorz"></bean>

<!一只針對部分懇求攔截一><mvc:interceptor><mvc:mappingp

ath="z/modelMap.do,z/><beanclass="zcom.et.action.MyHandlerlnter

ceptorAdapter^/></mvc:interceptor></mvc:interceptors>

講下SpringMvc的執行流程

系統啟動的時候依據配置文件創建spring的容器,首先是發送

懇求到核心限制器DispatcherServlet,spring容器通過映射器去找尋業

務限制器,

運用適配器找到相應的業務類,在進業務類時進行數據封裝,在封裝

前可能會涉與到類型轉換,執行完業務類后運用ModelAndView進行視圖

轉發,

數據放在model中,用map傳遞數據進行頁面顯示。

###1.講下MyBatis和Hibernate的區分?

MyBatis是JDBC的輕量級封裝,把Sql和java代碼獨立出來,性能相

對比較高,寫SQL語句相對于比較敏捷,并且簡潔調試,一般用在大型項目

中.

Hibernate是JDBC的重量級封裝,開發速度比較快,但是性能比較低,

調試不便利,一般適合對進度要求的比較高的中小型項目

###2.什么是MyBatis的接口綁定,有什么好處

接口映射就是在IBatis中隨意定義接口,然后把接口里面的方法和SQ

L語句綁定,我們干脆調用接口方法就可以,

這樣比起原來了SqlSession供應的方法我們可以有更加敏捷的選擇

和設置.

###3.接口綁定有幾種實現方式,分別是怎么實現的?

接口綁定有兩種實現方式,一種是通過注解綁定,就是在接口的方法上

面加上@SelectMyBatis的面試題部分

?Update等注解里面包含Sql語句來綁定,另外一種就是通過xml里面

寫SQL來綁定,在這種狀況下,

要指定xml映射文件里面的namespace必需為接口的全路徑名.

###4.什么狀況下用注解綁定,什么狀況下用xml綁定

當Sql語句比較簡潔時候,用注解綁定,當SQL語句匕較困難時候,用x

ml綁定,一般用xml綁定的比較多

###5.MyBatis實現一對一有幾種方式?具體怎么操作的

有聯合查詢和嵌套查詢,聯合查詢是幾個表聯合查詢,只查詢一次,通

過在resultMap里面配置association節點配置一對一的類就可以完成;

嵌套查詢是先查一個表,依據這個表里面的結果的外鍵id,去再另外

一個表里面查詢數據,也是通過association配置,但另外一個表的查詢通

過select屬性配置

###6.假如要查詢的表名和返回的實體Bean對象不一樣,那你是怎么

處理的?

在MyBatis里面最主要最敏捷的的一個映射對象的ResultMap,在它里

面可以映射鍵值對,默認里面有id節點,result節點,它可以映射表里面

的列名和對象里面的字段名.并且在一對一,一對多的狀況下結果集也確

定要用ResultMap

MyBatis里面的動態Sql是怎么設定的?用什么語法?

MyBatis里面的動態Sql一般是通過if節點來實現,通過0GNL語法來

實現,但是假如要寫的完整,必需協作where,trim節點,

where節點是推斷包含節點有內容就插入where,否則不插入,trim節

點是用來推斷假如動態語句是以and或or起先,那么會自動把這個and或

者or取掉

###8.MyBatis在核心處理類叫什么

MyBatis里面的核心處理類叫做SqlSession

###9.IBatis和MyBatis在細微環節上的不同有哪些

在sql里面變量命名有原來的#變量#變成了#{變量}原來的$變量

$變成了${變量},原來在sql節點里面的class都換名字交type

原來的queryForObjectqueryForList變成了selectOneselectLis

t

原來的別名設置在映射文件里面放在了核心配置文件里

###10.講下MyBatis的緩存

MyBatis的緩存分為一級緩存和二級緩存,一級緩存放在session里面,

默認就有,二級緩存放在它的命名空間里,

默認是打開的,運用二級緩存屬性類須要實現Serializable序列化接

口(可用來保存對象的狀態),可在它的映射文件中配置<cache/>

###11.MyBatis(IBatis)的好處是什么

ibatis把sql語句從Java源程序中獨立出來,放在單獨的XML文件

中編寫,給程序的

維護帶來了很大便利。

ibatis封裝了底層JDBCAPT的調用細微環節,并能自動將結果集轉

換成JavaBean對象,大大簡化了Java數據庫編程的重復工作。

因為Ibatis須要程序員自己去編寫sql語句,程序員可以結合數據庫

自身的特點敏捷限制sql語句,

因此能夠實現比hibernate等全自動orm框架更高的查詢效率,能夠

完成困難查詢。###12.MyBatis里面怎么處理分頁

用插件分頁

###13,MyBatis里面怎么樣獲得剛插入的主鍵

把insert節點的useGeneratedKeys=true設置先生成主鍵,然后keyP

roperty=〃id〃,把生成的主鍵指向屬性.

###1.為什么要用自定義標簽?

①Jsp中寫代碼比較混亂,難以維護

②把一些重復的功能都抽取出來,便利復用。

###2.自定義標簽分為幾個步驟.

1.編寫標簽處理器類(SimpleTagSupport的實現類)

重寫doTagO

2.編寫標簽庫文件(WEBTNF/xxx.tld)

整個文件的定義:〈short-name)<uri>

標簽的定義:<tag>

3.在jsp頁面運用標簽:

導入標簽庫(xxx.tld/)

運用標簽

###3.自定義標簽類要繼承哪個類?

SimpleTagSupport類

sim?pietags?'p?rt

###4.怎么配置自定義標簽的屬性

在.tld文件<tag>標簽中添加〈attribute》,

通過<name>標簽設定自定義標簽的標簽名。JSTL&EL的面試題部分

###5.為什么要用EL表達式,有什么好處

1.在頁面中用js腳本和jsp表達式來獲得數據顯示比較麻煩

a:須要條件推斷

b:可能須要強轉

2.好處是EL表達式簡潔易用,默認可訪問全部的JSP隱藏對象。

###6.EL表達式的語法是什么?

美元符號加大括號-->${EL表達式}

###7.EL有哪兩種訪問格式,有什么區分?

EL供應”和“兩種運算符來存取數據。

當要存取的屬性名稱中包含一些特別字符,如.或一等并非字母或

數字的符號,就確定要運用例如:

${user.My-Name}應當改為${user[z,My-Name,z]}

假如要動態取值時,就可以用“[]“來做,而”?“無法做到動態取

值。例如:${sessionScope.user[data]}中data是一個變量。

nuns,EL表達式中有哪些隱藏對象,舉幾個例子?

pageContext:JSP頁面的上下文

param:參數

paramValues:參數值

header:頭信息

headerValues:頭的值

cookie:緩存

initParam:初始化參數

###9.EL表達式中怎么樣拿到request,session里面的值?

例:

可以通過它的隱藏對象RequestScope來獲得到Request范圍的屬性名

稱所對應的值。可以通過它的隱藏對象sessionScope來獲得到session

范圍的屬性名稱所對應的值。

###10.EL表達式怎么樣拿到用戶懇求的參數?

可以用${param,name}來獲得用戶懇求的參數

###1LEL表達式怎么樣得到上下文路徑?

${pageContext.request.contextPath)

###12.EL表達式怎么樣拿到request?

RequestScope

###13.JSTL全稱是什么?

java服務器頁面標準標簽庫

(JavaServerPagesStandardTagLibrary)

###14.JSTL是怎么運用的?

將jstl.jar、standard,jar復制到Tomcat的WEB-INF\lib中.若

要在JSP網頁中運用JSTL時,確定要先做下面這行聲明:<%?tagli

bprefix=〃c〃uri=z,://java.sun/jsp/jstl/core〃%>

主要供應應JavaWeb開發人員一個標準通用的標簽函數庫。Web程

序開發人員能夠利用JSTL和EL來開發Web程序,

取代傳統干脆在頁面上嵌入Java程序(Scripting)的做法,以提高

程序可讀性、維護性和便利性。

###15,JSTL分為幾個標簽庫?

①核心標簽庫

②國際化標簽庫

③數據庫標簽庫

@XML標簽庫

⑤函數標簽庫

###16.JSTL里面推斷標簽是什么?

1.<c:i

溫馨提示

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

評論

0/150

提交評論