![Java面試題完整版_第1頁](http://file4.renrendoc.com/view12/M03/1D/1F/wKhkGWaejgeAUS_uAAOS2ATSNFU577.jpg)
![Java面試題完整版_第2頁](http://file4.renrendoc.com/view12/M03/1D/1F/wKhkGWaejgeAUS_uAAOS2ATSNFU5772.jpg)
![Java面試題完整版_第3頁](http://file4.renrendoc.com/view12/M03/1D/1F/wKhkGWaejgeAUS_uAAOS2ATSNFU5773.jpg)
![Java面試題完整版_第4頁](http://file4.renrendoc.com/view12/M03/1D/1F/wKhkGWaejgeAUS_uAAOS2ATSNFU5774.jpg)
![Java面試題完整版_第5頁](http://file4.renrendoc.com/view12/M03/1D/1F/wKhkGWaejgeAUS_uAAOS2ATSNFU5775.jpg)
版權說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權,請進行舉報或認領
文檔簡介
Java面試題面向對象的特征有那些?三大特征就是(繼承、封裝、多態(tài)性)抽象:抽象就是忽略一個主題中與當前目標無關的那些方面,以便更充分的注意與當前目標有關的方面。抽象并不打算了解全部問題,而只是選擇其中的一部分,暫時不用部分細節(jié)。抽象包括兩個方面,一是過程抽象,二是數(shù)據(jù)抽象。繼承:繼承是一種聯(lián)結類的層次模型,并且允許和鼓勵類的重用,它提供了一種明確表述共性的方法。對象的一個新類可以沖現(xiàn)有的類中派生,這個過程稱為類繼承。新類繼承了原始類的特性,新類稱為原始類的派生類(子類),原始類稱為新類的基類(父類)。派生類可以從它的基類那里繼承方法和實例變量,并且類可以修改或增加新的方法使之更適合特殊的需要。封裝:封裝就是把過程和數(shù)據(jù)包圍起來,對數(shù)據(jù)的訪問只能通過已定義的界面,面向對象計數(shù)始于這個基本概念,即現(xiàn)實世界可以被描繪成一系列完全自治、封裝的對象,這些對象通過一個受保護的接口訪問其他對象。多態(tài)性:是指允許不同的類的對象對同一消息做出響應。多態(tài)性包括參數(shù)化多態(tài)性和包含多態(tài)性。多態(tài)性語音具有靈活、抽象、行為共享、代碼共享的優(yōu)勢,很好的解決了應用程序函數(shù)同名的問題。String是基本的數(shù)據(jù)類型嗎?Java的基本數(shù)據(jù)類型包括byte、int、char、long、float、double和short。java.lang.String類是final類型的,因此不能繼承和修改這個類,為了提高效率節(jié)省空間,我們應該使用StringBuffer類?;緮?shù)據(jù)類型及轉換char16-bitUnicode0Unicode216-1Characterbyte8-bit-128+127Byteshort16-bit-215+215-1Shortint32-bit-231+321-1Integerlong64-bit-263+263-1Longfloat32-bitIEEE754IEEE754Floatdouble64-bitIEEE754IEEE754DoubleString和StringBuffer,StringBuild的區(qū)別。String和StringBuffer,它們可以存儲和操作字符串,即包含多個字符的字符數(shù)據(jù)。這個String類提供了數(shù)值不可改變的字符串,而這個StringBuffer類提供的字符串可以進行修改,可以使用這個StringBuffer來動態(tài)構造字符數(shù)據(jù)。StringBuild是jdk1.5后用來替換StringBuffer的一個類,大多數(shù)時候可以替換StringBuffer。和StringBuffer的區(qū)別在于StringBuild是一個單線程使用的類,不執(zhí)行線程,同步所以比StringBuffer速度快,效率高,是非線程安全的。說出ArrayList,Vector,LinkedList的存儲性能和特性ArrayList和Vector都是使用數(shù)組方式存儲數(shù)據(jù),此數(shù)組元素數(shù)大于實際存儲的數(shù)據(jù)以便增加和插入元素,它們都允許直接按序號索引元素,但是插入元素要涉及數(shù)組元素移動等內(nèi)存操作,所以索引數(shù)據(jù)快而插入數(shù)據(jù)慢,Vector由于使用synchronized方法(線程安全),通常性能上較ArrayList差,而LinkedList使用雙向鏈表實現(xiàn)存儲,按序號索引需要進行前向或后向遍歷,但是插入數(shù)據(jù)時只需要記錄本項的前后即可,所以插入速度較快。HashMap和HashTable的區(qū)別。HashMap是HashTable的輕量級實現(xiàn)(非線程安全的實現(xiàn)),它們走完成了Map接口。HashMap允許空(null)鍵值(key),由于非線程安全,效率上可能高于HashTable。HashMap允許將null作為一個entry的key或者value,HashTable不允許。HashMap把HashTable的contains方法去掉了,改成containsKey和containsVaule。因為contains方法容易讓人誤會。HashTable繼承自Dictionary類,而HashMap是java1.2引進的Mapinterface的一個實現(xiàn)。HashTable的方法是Synchronize的,而HashMap的不是,在多個線程訪問HashTable時,不需要自己為它的方法實現(xiàn)同步,而HashMap就必須為之提供外同步。final,finally,finalize的區(qū)別final-修飾符(關鍵字)如果一個類被聲明為final,意味著它不能再派生出新的子類,不能作為父類被繼承。因此一個類不能既被聲明為abstract的,又被聲明為final的。將變量或方法聲明為final,可以保證它們在使用過程中不被改變。被聲明為final變量必須在聲明時給定初值,而在以后的引用中只能讀取,不能修改。被聲明為final的方法也是只能使用,不能重載。finally-在異常處理時提供finally塊來執(zhí)行任何清除操作。如果拋出一個異常,那么相匹配的catch子句就會執(zhí)行,然后控制就會進入finally塊(如果有的話)。finalize-方法名。Java技術允許使用finalize()方法在垃圾收集器將對象從內(nèi)存中清除出去之前做必要的清理工作。這個方法是由垃圾收集器在確定這個對象沒有被引用時對這個對象調(diào)用的。它是在Object類中定義的,因此所有的類都繼承了它。子類覆蓋finalize()方法以整理系統(tǒng)資源或執(zhí)行其他清理工作。finalize()方法是在垃圾收集器刪除對象之前對這個對象調(diào)用的。Overlord和Override的區(qū)別。Overlorded的方法是否可以改變返回值的類型?方法重寫overriding和重載overlording是Java多態(tài)性的不同表現(xiàn)。重寫overriding是父類與子類之間多態(tài)性的一種表現(xiàn):如果在子類中定義某方法與其父類有相同的名稱和參數(shù),我們說該方法被重寫了。如子類的對象使用這個方法時,將調(diào)用子類中定義的,對它而言,父類中的方法如同被屏蔽了。重載overlording是一個類中多態(tài)性的一種表現(xiàn):如果在一個類中定義了多個同名的方法,它們或有不同的參數(shù)個數(shù)或有不同的參數(shù)類型,這樣稱為方法的重載。Overlorded是可以改變返回值的類型的。abstractclass和interface有什么區(qū)別?抽象類:抽象類是特殊的類,只是不能被實例化;除此之外,具有類的其他特性;重要的是抽象類可以包括抽象方法,這是普通類所不能的。抽象方法只能聲明在抽象類中,且不包含任何實現(xiàn),派生類必須覆蓋它們。另外,抽象類可以派生自一個抽象類,可以覆蓋基類的抽象方法也可以不覆蓋,如果不覆蓋,則其派生類必須覆蓋它們。接口:接口是應用類型的,類似于類,更和抽象類有所相似,以至于很多人對抽象類和接口的區(qū)別比較模糊,接口除了可以包含方法外,還可以包含屬性、索引器、事件,而且這些成員都被定義為公有的。除此之外,不能包含任何其他成員,例如:常量、域、構造函數(shù)、析構函數(shù)、靜態(tài)成員。一個類可以直接繼承多個接口,但是只能繼承一個類(包括抽象類)。抽象類與接口的相似之處不能實例化;包含未實現(xiàn)的方法聲明;派生類必須實現(xiàn)未實現(xiàn)的方法,抽象類是抽象方法,接口的所有成員。抽象類與接口的區(qū)別接口可以多重繼承,抽象類不可以;接口定義方法,不給實現(xiàn),抽象類可以實現(xiàn)部分方法;接口中基本數(shù)據(jù)類型的數(shù)據(jù)成員,都默認為static和final的,抽象類則不是;如果事先知道某種東西會成為基礎類,那么第一選擇就是把它變成一個接口;只有在必須使用方法定義或者成員變量的時候,才考慮抽象類。shorts1=1;s1=s1+1;有什么錯?shorts1=1;s1+=1;有什么錯?shorts1=1;s1=s1+1;(s1+1是int類型的,需要進行強制轉換)shorts1=1;s1+=1;(可以正確運行)Math.round(11.5)等于多少?Math.round(-11.5)等于多少?Math.round(11.5)=12;Math.round(-11.5)=-11;Round方法返回與參數(shù)最近的長整數(shù),參數(shù)加1/2后求其float。Strings=newString(“xyz”);創(chuàng)建了幾個Stringobject?Java有沒有goto?創(chuàng)建了兩個對象,一個是“syz”,一個是指向“syz”的引用對象s。goto是Java中的保留字,現(xiàn)在沒有在java中使用。啟動一個線程是用run()還是start()?啟動一個線程是調(diào)用start()方法,使線程所代表的虛擬處理機處于可運行狀態(tài),這意味著它可以有JVM調(diào)度并執(zhí)行。這并不意味著線程就好立即運行,run()方法可以產(chǎn)生必須退出的標志來停止一個線程。JVM是什么?JVM是Java虛擬機,它是一個虛構出來的計算機,是通過在實際的計算機上仿真模擬各種計算機功能來實現(xiàn)的。JVM有自己完善的硬件架構,如處理器、堆棧、寄存器等,還具有相應的指令系統(tǒng)。Java語言最重要的特點就是跨平臺運行,使用JVM就是為了支持與操作系統(tǒng)無關,實現(xiàn)跨平臺。JVM的原理:JVM是Java的核心和基礎,在java編譯器和OS平臺之間的虛擬處理器,它是一種利用軟件方法實現(xiàn)的抽象的計算機基于下層的操作系統(tǒng)和硬件平臺,可以在上面執(zhí)行java的字節(jié)碼程序。JVM執(zhí)行程序的過程加載.class文件;管理并分配內(nèi)存;c)執(zhí)行垃圾收集;d)JRE(java運行時環(huán)境)由JVM構造的java程序的運行環(huán)境,也是java程序的 運行環(huán)境,但是它同時一個操作系統(tǒng)的一個應用程序一個進程,因此它也有它 自己的生命周期,也有自己的代碼和數(shù)據(jù)空間。JVM在整個jdk中處于最底層, 負責于操作系統(tǒng)的交互,用來屏蔽操作系統(tǒng)環(huán)境,提供一個完整的Java運行環(huán) 境,因此也就是虛擬計算機。操作系統(tǒng)裝入JVM是通過jdk中的Java.exe來完 成,通過下面4步來完成JVM環(huán)境:(1、創(chuàng)建JVM裝載環(huán)境和配置;2、裝載` JVM.dll;3、初始化JVM.dll并掛界到jnienv(jni調(diào)用接口)實例;4、調(diào)用 jnienv實例裝載并處理class類)。JVM的聲明周期JVM實例對應了一個獨立運行的java程序,它是進程級別a)啟動:啟動一個java程序時,一個JVM實例就產(chǎn)生了,任何一個擁有publicstaticvoidmain(String[]args)函數(shù)的class都可以作為JVM實例運行的起點。b)運行:main()作為該程序初始線程的起點,任何其他線程都由該線程啟動。JVM內(nèi)部有兩種線程:守護線程和非守護線程,main()屬于非守護線程,守護線程通常由JVM自己使用,java程序也可以表明自己創(chuàng)建的線程是守護線程。c)消亡:當程序中的所有非守護線程都終止時;JVM才退出,若安全管理器允許,程序也可以使用Runtime類或者使用System.exit();來退出。JVM執(zhí)行引擎實例則對應了屬于用戶運行程序的線程它是線程級別的。應用服務器都有哪些?BEAWebLogicServer、IBMWebSphereApplicationServer、Oracle9iApplicationServer、jBoss、Tomcat。Tomcat下部署項目在Tomcat中部署Javaweb應用程序有兩種方式:靜態(tài)部署和動態(tài)部署。靜態(tài)部署:靜態(tài)部署指的是我們在服務器啟動之前部署我們的程序,只有在啟動服務器之后,我們的web應用程序才能訪問。動態(tài)部署:動態(tài)部署是指可以在啟動服務器之后部署web應用程序,而不用重新啟動服務器。heap和stack有什么區(qū)別?棧是一種線性集合,棧按照后進先出的方式進行處理第一,從軟件設計的角度看,棧代表了處理邏輯,而堆代表了數(shù)據(jù)。這樣分開,使得處理邏輯更為清晰。分而治之的思想。這種隔離、模塊化的思想在軟件設計的方方面面都有體現(xiàn)。第二,堆與棧的分離,使得堆中的內(nèi)容可以被多個棧共享(也可以理解為多個線程訪問同一個對象)。這種共享的收益是很多的。一方面這種共享提供了一種有效的數(shù)據(jù)交互方式(如:共享內(nèi)存),另一方面,堆中的共享常量和緩存可以被所有棧訪問,節(jié)省了空間。第三,棧因為運行時的需要,比如保存系統(tǒng)運行的上下文,需要進行地址段的劃分。由于棧只能向上增長,因此就會限制住棧存儲內(nèi)容的能力。而堆不同,堆中的對象是可以根據(jù)需要動態(tài)增長的,因此棧和堆的拆分,使得動態(tài)增長成為可能,相應棧中只需記錄堆中的一個地址即可。第四,面向對象方式的程序與以前結構化的程序在執(zhí)行上沒有任何區(qū)別。但是,面向對象的引入,使得對待問題的思考方式發(fā)生了改變,而更接近于自然方式的思考。當我們把對象拆開,你會發(fā)現(xiàn),對象的屬性其實就是數(shù)據(jù),存放在堆中,而對象的行為(方法),就是運行邏輯,放在棧中。我們編寫對象的時候,其實即編寫了數(shù)據(jù)結構,也編寫了處理數(shù)據(jù)的邏輯。forward和redirect的區(qū)別?forward是服務器請求資源,服務器直接訪問目標地址的URL,把那個URL的響應內(nèi)容讀取過來,然后把這些內(nèi)容再發(fā)給瀏覽器,瀏覽器根本不知道服務器發(fā)送的內(nèi)容是從哪來的,所以它的地址欄中還是原來的地址。redirect就是服務端根據(jù)邏輯,發(fā)送一個狀態(tài)碼,告訴瀏覽器重新去請求那個地址,一般來說瀏覽器會用剛才請求的所有參數(shù)重新請求,所以session,request參數(shù)都可以獲取。Set里的元素是不能重復的,那么用什么方法來區(qū)分重復與否呢?是用==還是equals()?它們有何區(qū)別?使用iterator()方法來區(qū)分重復與否。equals()是判斷兩個set是否相等。equals()和==方法決定引用值是否指向同一對象,equals()在類中被覆蓋,為的是當兩個分離的對象的內(nèi)容和類型相配的話,返回真值。說出數(shù)據(jù)連接池的工作機制是什么?J2EE服務器啟動時會建立一定數(shù)量的池連接,并一直維持不少于此數(shù)目的池連接??蛻舳顺绦蛐枰B接時,池驅動程序會返回一個未使用的池連接并將其表記為忙。如果當前沒有空閑連接,池驅動程序就新建一定數(shù)量的連接,新建連接的數(shù)據(jù)由配置參數(shù)決定。當使用的池連接調(diào)用完成后,池驅動程序將此連接表記為空閑,其他調(diào)用就可以使用這個連接。Java中的異常處理機制的簡單原理和應用當Java程序違反了Java的語義規(guī)則時,Java虛擬機就會將發(fā)生的錯誤表示為一個異常。違反語義規(guī)則包括兩種情況。一種是Java類庫內(nèi)置的語義檢查。例如數(shù)組下標越界,會引發(fā)IndexOutOfBoundsException;方法null的對象時會引發(fā)NullPointerException。另一種情況就是Java允許程序員擴展這種語義檢查,程序員可以創(chuàng)建自己的異常,并自由選擇在何時用throw關鍵字引發(fā)異常。所有的異常都是java.lang.Thowable的子類。sleep()和wait()有什么區(qū)別?sleep是線程類(Thread)的方法,導致此線程暫停執(zhí)行指定時間,給執(zhí)行機會給其他線程但是監(jiān)控狀態(tài)依然保持,到時后會自動恢復。調(diào)用sleep不會釋放對象鎖。wait是object類的方法,對此對象調(diào)用wait方法導致本線程放棄對象鎖,進入等待此對象的等待鎖定池,只有針對此對象發(fā)出notify方法(或notifyAll)后,本線程才進入對象鎖定池準備獲得對象鎖進入運行狀態(tài)。sleep()方法是使線程停止一段時間的方法。在sleep時間間隔期滿后,線程不一定立即恢復執(zhí)行。這是因為在那個時刻,其它線程可能正在運行而且沒有被調(diào)度為放棄執(zhí)行,除非(a)“醒來”的線程具有更高的優(yōu)先級;(b)正在運行的線程因為其它原因而阻塞。wait()是線程交互時,如果線程對一個同步對象x發(fā)出一個wait()調(diào)用,該線程會暫停執(zhí)行,被調(diào)對象進入等待狀態(tài),直到被喚醒或等待時間到。java中實現(xiàn)多線程的方法及其方法的作用interrupt():中斷線程。join():等待該線程終止。join(longmillis):等待該線程終止的時間最長為milli毫秒。run():如果該線程是使用獨立的Runnable運行對象構造的,則調(diào)用該Runnable對象的run方法;否則,該方法不執(zhí)行任何操作并返回。setPriority(intnewPriority):更改線程的優(yōu)先級。start():使該線程開始執(zhí)行,Java虛擬機調(diào)用該線程的run方法。sleep(longmillis):在指定的毫秒數(shù)內(nèi)讓當前執(zhí)行的線程休眠。yield():暫停當前正在執(zhí)行的線程對象,并執(zhí)行其他線程。多線程有幾種實現(xiàn)方法?同步有幾種實現(xiàn)方法?兩種實現(xiàn)方法,分別是繼承Thread類與實現(xiàn)Runnable接口。同步有兩種實現(xiàn)方法,分別是synchronized,wait與notify。線程的基本概念、線程的基本狀態(tài)以及狀態(tài)之間的關系線程指在程序執(zhí)行過程中,能夠執(zhí)行程序代碼的一個執(zhí)行單位,每個程序至少都有一個線程,也就是程序本身。Java中的線程有四種狀態(tài):運行、就緒、掛起、結束。 新狀態(tài)(就緒):線程已創(chuàng)建但尚未執(zhí)行(start()尚未被調(diào)用)。 可執(zhí)行狀態(tài)(運行):線程可以執(zhí)行,雖然不一定正在執(zhí)行。CPU時間隨時可能被分配給該線程,從而使得它執(zhí)行。 死亡狀態(tài)(結束):正常情況下run()返回使得線程死亡。調(diào)用stop()或destroy()亦有同樣的效果,但是不被推薦,前者會產(chǎn)生異常,后者是強制終止,不會釋放鎖。 阻塞狀態(tài)(掛起):線程不會被分配CPU時間,無法執(zhí)行。多線程的并發(fā),単例創(chuàng)建線程進程:一個計算機程序的運行實例,包含了需要執(zhí)行的指令;有自己的獨立地址空間,包含程序內(nèi)容和數(shù)據(jù);不同進程的地址空間是互相隔離的;進程擁有各種資源和狀態(tài)信息,包括打開的文件、子進程和信號處理。Java標準庫提供了進程和線程相關的API,進程主要包括表示進程的java.lang.Process類和創(chuàng)建進程的java.lang.ProcessBuilder類;表示線程是java.lang.Thread類。如何實現(xiàn)多線程1、實現(xiàn)多線程有兩種方法:Thread類繼承和Runnable接口實現(xiàn)。 a)繼承Thread類的步驟: 1)定義類繼承Thread;2)復寫Thread類中的run方法;將自定義代碼存儲在run方法,讓線程運行。3)調(diào)用線程的start方法。 b)實現(xiàn)Runnable接口的步驟: 1)定義類實現(xiàn)Runnable接口; 2)覆蓋Runnable接口中的run方法。將線程要運行的代碼放在該run方法中。JSP的內(nèi)置對象及方法request:表示HttpServletRequest對象。它包含了有關瀏覽器請求的信息,并且提供了幾個用于獲取cookie、header和session數(shù)據(jù)的有用的方法。response:表示HttpServletResponse對象,并提供了幾個用于設置送回瀏覽器的響應的方法(如cookies、頭信息等)。out:對象是javax.jsp.JspWriter的一個實例,提供了幾個方法使你能用于向瀏覽器回送輸出結果。pageContext:表示一個javax.servlet.jsp.PageContext對象。它是用于方便存儲各種范圍的名字空間、servlet相關的對象的API,并且包裝了通用servlet相關功能的方法。session:表示一個請求的javax.servlet.http.HttpSession對象。Session可以存儲用戶的狀態(tài)信息。application:表示一個javax.servlet.ServletContext對象。這有助于查找有關servlet引擎和servlet環(huán)境的信息。config:表示一個javax.servlet.ServletConfig對象。該對象用于存取servlet實例的初始化參數(shù)。page:表示從該頁面產(chǎn)生的一個servlet實例。JSP和Servlet有那些相同點和不同點,他們之間的聯(lián)系是什么?JSP是servlet技術的擴展,本質上是servlet的簡易方式,更強調(diào)應用的外表表達。JSP編譯后是”類servlet”。Servlet和JSP最主要的不同的在于,servlet的應用邏輯是在Java文件中,并且完全從表示層中的HTML里分離開來。而JSP的情況是Java和HTML可以組合成一個擴展名為.jsp的文件。JSP側重于視圖,servlet主要用于控制邏輯。Servlet的生命周期?Servlet被服務器實例化后,容器運行其init方法,請求到達時運行其service方法自動派遣運行與請求對應的doXXX方法(doGet,doPost)等,當服務器決定將實例銷毀的時候調(diào)用destroy方法。XML文檔定義有幾種形式?它們之間有何本質區(qū)別?解析XML文檔有哪幾種方式?XML定義有兩種方式:dtd和schema;本質區(qū)別:schema本身是xml的,可以被XML解析器解析(這也是從DTD上發(fā)展schema的根本目的)解析XML文檔的方式:DOM,SAX,STAX等。DOM:處理大型文件時其性能下降的非常厲害。這個問題是有DOM的樹結構所造成的,這種結構占用的內(nèi)存較多,而且DOM必須在解析文件之前把整個文檔裝入內(nèi)存,適合XML的隨機訪問。SAX:(SimpleAPIforXML)不同于DOM,SAX是事件驅動型的XML解析方式。它順序讀取XML文件,不需要一次全部裝載整個文件。當遇到像文件開頭,文檔結束,或者標簽開頭與標簽結束時,它會觸發(fā)一個事件,用戶通過在其回調(diào)事件中寫入處理代碼來處理XML文件,適合對XML的順序訪問。STAX:StreamingAPIforXML流模型中的拉模型分析方式。提供基于指針和基于迭代器兩種方式的支持,jdk1.6新特性【和推式解析相比的優(yōu)點】①在拉式解析中,事件是由解析應用產(chǎn)生,因此拉式解析中向客戶端提供的是解析規(guī)則,而不是解析器。②同推式解析相比,拉式解析的代碼更簡單,而且不用那么多庫。③拉式解析客戶端能夠一次讀取多個XML文件。④拉式解析允許你過濾XML文件和跳過解析事件?!竞喗椤縎TAXAPI的實現(xiàn)是使用了Javaweb服務開發(fā)(JWSDP)1.6,并結合了sunJava流式XML分析器(SJSXP)-它位于javax.xml.stream包中。XMLStreamReader接口用于分析一個XML文檔,而XMLStreamWriter接口用于生成一個XML文檔。XMLLEventReader負責使用一個對象事件迭代子分析XML時間-這與XMLStreamReader所使用的光標機制形成對照。XML的數(shù)據(jù)導入數(shù)據(jù)庫中:可以使用XML的解析方式解析XML數(shù)據(jù)成object,再插入數(shù)據(jù)庫中。J2ee常用的設計模式?說明工程模式。簡潔說明簡單工廠和抽象的區(qū)別。Java中的23中設計模式:Factory(工廠模式),Builder(建造模式),F(xiàn)actoryMethod(工廠方式模式),Protory(原始模型模式),Singletom(單例模式),F(xiàn)a?ade(門面模式),Adapter(適配器模式),Bridge(橋梁模式),Composite(合成模式),Decorator(裝飾模式),F(xiàn)lyweight(享元模式),Proxy(代理模式),Command(命令模式),Interpreter(解釋器模式),Visitor(訪問者模式),Iterator(迭代子模式),Mediator(調(diào)停者模式),Memento(備忘錄模式),Observer(觀察者模式),State(狀態(tài)模式),Strategy(策略模式),TemplateMethod(模板方法模式),ChainOfResponsibleity(責任鏈模式)。工廠模式:工廠模式是一種經(jīng)常被使用到的模式,根據(jù)工廠模式實現(xiàn)的類可以根據(jù)提供的數(shù)據(jù)生成一組類中某一個類的實例,通常這一組類有一個公共的抽象父類并且實現(xiàn)了相同的方法,但是這些方法針對不同的數(shù)據(jù)進行了不同的操作。首先需要定義一個基類,該類的子類通過不同的實現(xiàn)了基類中的方法。然后需要定義一個工廠類,工廠類可以根據(jù)條件生成不同的子類實例。當?shù)玫阶宇惖膶嵗?,開發(fā)人員可以調(diào)用基類中的方法而不必考慮到底返回的是哪一個子類的實例。簡單工廠:一個具體工廠通過條件語句創(chuàng)建多個產(chǎn)品,產(chǎn)品的創(chuàng)建邏輯集中與一個工廠類。客戶端通過傳不同的參數(shù)給工廠,實現(xiàn)創(chuàng)建不同產(chǎn)品的目的增加新產(chǎn)品時,需要修改工廠類、增加產(chǎn)品類,不符合OCP(開閉原則)原則工廠方法。抽象工廠:一個具體工廠創(chuàng)建一個產(chǎn)品族,一個產(chǎn)品族是不同系列產(chǎn)品的組合,產(chǎn)品的創(chuàng)建的邏輯分別在每個具體工廠類中。所有的具體工廠繼承自同一個抽象工廠??蛻舳藙?chuàng)建不同產(chǎn)品族的工廠,產(chǎn)品族的工廠創(chuàng)建具體的產(chǎn)品對客戶端是不可見的。增加新的產(chǎn)品族時,需要增加具體工廠類,符合OCP原則。排序都有哪幾種方法?請舉例。用Java實現(xiàn)一個快速排序。排序的方法有:插入排序(直接插入排序、希爾排序);交換排序(冒泡排序、快速排序);選擇排序(直接選擇排序、堆排序);歸并排序;分配排序(箱排序、基數(shù)排序)冒泡排序:#include
<stdio.h>
void
swap(int
*a,
int
*b);int
main(){
int
array[10]
=
{15,
225,
34,
42,
52,
6,
7856,
865,
954,
10};
int
i,
j;
for(i=0;i<10;i++;){
//每一次由底至上地上升
for(j
=
9;
j
>
i;
j--){
if(array[j]<array[j-1]){
swap(&array[j],&array[j-1]);
}
}
}
for
(i=0;i<10;i++){
printf("%d\n",array[i]);
}
return
0;
}
void
swap(int
*a,
int
*b)
{
int
temp;
temp
=
*a;
*a
=
*b;
*b
=
temp;
}
快速排序的偽代碼//使用快速排序方法對a[0:n-1]排序從a[0:n-1]中選擇一個元素作為middle,該元素為支點把余下的元素分割為兩段left和right,使得left中的元素都小于等于支點,而right中的元素都大于等于支點;遞歸地使用快速排序方法對left進行排序;遞歸地使用快速排序方法對right進行排序;所得結果為left+middle+right。Java語言如何進行異常處理,關鍵字:throws,throw,try,catch,finally分別代表什么意義?在try塊中可以拋出異常嗎?Java通過面向對象的方法進行異常處理,把各種不同的異常進行分類,并提供了良好的接口。在Java中,每個異常都是一個對象,它是Throwable類或其它子類的實例。當一個方法出現(xiàn)異常后便拋出一個異常對象。該對象中包含有異常信息,調(diào)用這個對象的方法可以捕獲到這個異常并進行處理。Java的異常處理是通過5個關鍵詞來實現(xiàn)的:try、catch、throw、throws和finally。一般情況下是用try來執(zhí)行一段程序,如果出現(xiàn)異常,系統(tǒng)會拋出(throws)一個異常,這時候你可以通過它的類型來捕捉(catch)它,或最后(finally)由缺省處理器來處理。用try來指定一塊預防所有”異常”的程序。緊跟在try程序后面,應包含一個catch字句來指定你想要捕捉的”異?!钡念愋汀hrow語句用來明確的拋出一個”異?!?。throws用來標明一個成員函數(shù)可能拋出的各種”異?!?。Finally為確保一段代碼不管發(fā)生什么”異?!倍急粓?zhí)行一段代碼??梢栽谝粋€成員函數(shù)調(diào)用的外面寫一個try語句,在這個成員函數(shù)內(nèi)部寫另一個try語句包含其他代碼。每當遇到一個try語句,“異常”的框架就放到堆棧上面,直到所有的try語句都完成。如果下一級的try語句沒有對某種“異常”進行處理,堆棧就會展開,直到遇到有處理這種“異?!钡膖ry語句。Webservice的運行機制是什么?在項目中是怎么使用的?客戶端應用程序查找web服務的信息或類型描述。這些信息是一個XML文件,稱為web服務描述(WSDL)語言。然后,客戶端按要求使用簡單對象訪問協(xié)議(SOAP)將所需參數(shù)發(fā)送至服務器,服務器在將相應的結果返回給客戶端。這里我們將發(fā)布webservice的機器稱為服務端,而將調(diào)用webservice的機器稱為客戶端。首先服務端將發(fā)布web服務。 客戶端調(diào)用步驟: a.加入web應用,將剛才發(fā)布的web服務加入,這時生成了上述web服務在本地的一個道理,我們假設為WebProxy。 b.客戶端調(diào)用之前首先實例化一個該代理的對象,然后調(diào)用發(fā)布的方法。 c.客戶端將調(diào)用信息包括方法名和參數(shù)加入到soap消息中通過http傳送給webservice服務端。 d.服務端從soap消息中獲得調(diào)用信息,然后執(zhí)行方法,將返回結果加入到soap消息中,然后通過http傳回。 e.客戶端代理得到這個soap消息后解析出結果返回給調(diào)用客戶端方法。項目中用到了哪些測試方法?進行簡單的描述。單元測試:用于測試軟件中的各個組件。它是屬于白盒測試的。用的最多的是使用Junit工具來進行單元測試。類只需繼承TestCase類即可。集成測試:把幾個相關的單元集成在一起,通過檢查集成單元或模塊以發(fā)行缺陷的過程就稱為集成測試。我們通常在項目中是將每個人的模塊整合到一起進行統(tǒng)一測試。系統(tǒng)測試:是一系列的測試,其主要目的是在模擬環(huán)境中完整、準確的運行軟件系統(tǒng)。我們通常的處理方法是: a.負載測試:使系統(tǒng)處理超過其能力的任務來測試系統(tǒng)的過程。 b.壓力測試:也叫做強度測試,獲取系統(tǒng)正確運行的極限。 c.性能測試:其目的不是為了發(fā)現(xiàn)錯誤或缺陷,而是消除瓶頸。 d.可用性測試:這個主要是體現(xiàn)在給用戶的體驗上。用戶驗收測試:開發(fā)階段之后的測試階段,確保開發(fā)的軟件是完整且沒有缺陷的。項目中如何規(guī)范編碼?制定一份編碼規(guī)范文檔:類名以大寫開頭、有意義的單詞的組成,組合單詞的每一個單詞都要大寫。接口以I開頭,實現(xiàn)類在類名后加Impl如:接口為IUserDAO,實現(xiàn)類為UserDAOImpl。系統(tǒng)中涉及的常量字符串,不能采用硬編碼,需要properties文件中讀取。編碼需要多加注釋。Jsp頁面命名以小寫字母開頭、有意義的單詞的組成,組合單詞除第一個單詞首字母小寫,其他單詞的首字母大寫,其余小寫。包名全部小寫。數(shù)據(jù)庫中表字段:同5。 如何考慮一個項目的安全性?從哪些方面去體現(xiàn)?項目的安全性并不是指一個系統(tǒng)的功能,而是屬性。 要考慮的方面: 防止有人惡意破壞,如:sql注入。編碼、權限的嚴密控制,也能很好的控制項目的安全性。如頁面盡量少用客戶端驗證,而使用服務器驗證,減少有人修改客戶端代碼而破壞項目的安全性。硬件設備等的支持,如:防火墻能夠防止有人攻擊Ip,從端口訪問服務器。平臺穩(wěn)定性如何,如:考慮Linux、Window平臺下項目是否能夠很好的運行。js的命名規(guī)范、注釋有哪幾種?java的命名規(guī)范JS的命名規(guī)范:變量名必須以字母或下劃線開頭。變量名可以包含數(shù)字、從A到Z的大寫字母和從a到z的小寫字母,由于JavaScript區(qū)分大小寫,所以說,變量myVar、myVAR和myvar是三個不同的變量。 注釋:1.<!—注釋--> 2.//注釋。Java的命名規(guī)范: 標識符的命名規(guī)則:必須以字母、下劃線“_”或“$”符號開頭。首字母后面可以跟任意數(shù)量的字母、數(shù)字、下劃線或“$”符號。標識符可以包含數(shù)字,但是不能以數(shù)字開頭。另外,除下劃線和“$”符號外,不能包含任何特殊字符。不能使用java語言的關鍵字。Java中的變量名區(qū)分大小寫。 類名命名規(guī)范:不能為java中的關鍵字。不能包含任何嵌入的空格或點號“.”以及除下劃線、“$”字符之外的特殊字符。不能以數(shù)字開頭。一般以大寫字母開頭,且為有意義的單詞組合。 方法命名:不能為java中的關鍵字。不能包含任何嵌入的空格或點號“.”以及除下劃線、“$”字符之外的特殊字符。不能以數(shù)字開頭。一般以小寫字母開頭,有意義的單詞組合。 SVN命令行下常用的幾個命令將文件checkout到本地目錄svncheckoutpath(path是服務器的目錄)例如:svncheckoutsvn:///pro/domain簡寫:svnco往版本庫中添加新的文件svnaddfile例如:svnaddtest.php(添加test.php)svnadd*.php(添加當前目錄下所有的php文件)將改動的文件提交到版本庫svncommit–m“LogMessage”[-N][--no-unlock]PATH(如果選擇了保持鎖,就使用—no-unlock開關)。例如:svncommit–m“addtestfileformytest”test.php,簡寫:svnci加鎖/解鎖svnlock–m“LockMessage”[--force]PATH 例如:svnlock–m“l(fā)ocktestfile”test.php svnunlockPATH。更新到某個版本svnupdate–rmpath例如:svnupdate如果后面沒有目錄,默認將當前目錄以及子目錄下的所有文件都更新到最新版本。 svnupdate–r200test.php(將版本庫中的文件test.php還原到版本200);svnupdatetest.php(更新,于版本庫同步。如果在提交的時候提示過期的話,是因為沖突,需要先update,修改文件,然后清除svnresolved,最后再提交commit);簡寫:svnup。查看文件或者目錄狀態(tài)svnstatuspath(目錄下的文件和子目錄的狀態(tài),正常狀態(tài)不顯示)svnstatus–vpath(顯示文件和子目錄狀態(tài)) 第一列保持相同,第二列顯示工作版本號,第三和第四列顯示最后一次修改的版本號和修改人。簡寫:svnst。 刪除文件 svndeletepath–m“deletetestfle” 例如:svndeletesvn:///pro/domain/test.php–m“deletetestfile”或者直接svndeletetest.php然后再svnci–m’deletetestfile’ 簡寫:svn(del,remove,rm) 查看文件 svnlogpath 例如:svnlogtest.php顯示這個文件的所有修改記錄,及其版本號的變化。查看文件詳細信息 svninfopath 例如:svninfotest.php比較差異 svndiffpath(將修改的文件與基礎版本比較) 例如:svndifftest.php svndiff–rm:npath(對版本m和版本n比較差異) 例如:svndiff–r200:201test.php 簡寫:svndi 將兩個版本之間的差異合并到當前文件 svnmerge–rm:npath 例如:svnmerge–r200:205test.php(將版本200與205之間的差異合并到當前文件,但是一般都會產(chǎn)生沖突,需要處理一下) svn幫助svnhelpsvnhelpci版本庫下的文件和目錄列表 svnlistpath 顯示path目錄下的所有屬于版本庫的文件和目錄,簡寫:svnls 創(chuàng)建納入版本控制下的目錄 svnmkdir:創(chuàng)建納入版本控制下的新目錄。 用法:1、mkdirPATH...2、mkdirURL... 恢復本地修改 svnrevert:恢復原始未改變的工作副本文件(恢復大部分的本地修改)。 用法:revertPATH...代碼庫URL變更 svnswitch(sw):更新工作副本至不同的URL。 用法:1、switchURL[PATH]2、switch–relocateFROMTO[PATH...]解決沖突 svnresolved:移除工作副本的目錄或文件的“沖突”狀態(tài) 用法:resolvedPATH... 注意:本子命令不會依語法來解決沖突或是移除沖突標記;它只是移除沖突的相關文件,然后讓PATH可以再次提交。輸出指定文件或URL的內(nèi)容 svncat目標[@版本]...如果指定了版本,將從指定的版本開始查找。svncat–rPREVfilename>filename 安裝配置安裝SVN#yuminstallsubversion測試是否安裝成功#svnserve--version如果顯示了版本信息則表示安裝成功創(chuàng)建倉庫#svnadmincreate/home/svn/repo給svn設置密碼修改配置文件/home/svn/repo/conf/svnserve.conf去掉#[general]前面的#號匿名訪問的權限,可以是read,write,none,默認為readanon-access=none認證用戶的權限,可以是read,write,none,默認為writeauth-access=write密碼數(shù)據(jù)庫的路徑#password-db=passwd去掉前面的#修改配置文件passwd#vim/home/svn/repo/conf/passwd=前面是用戶名,后面是密碼[users]name=password啟動SVN服務器對于單個代碼倉庫#svnserve–d–r/home/svn–listen–host00svn默認端口是3690,在防火墻上開發(fā)這個端口。/sbin/iptables–AINPUT–IethO–ptcp–dport3690–jACCEPT/sbin/serviceiptablessave把/var/www/html/目錄導入到svn的repo目錄下svnimport/var/www/html/file:///home/svn/repo-m”rest”Java為什么可以跨平臺?因為Java程序編譯之后的代碼不是能被硬件系統(tǒng)直接運行的代碼,而是一種“中間碼”—字節(jié)碼。然后不同的硬件平臺上安裝有不同的Java虛擬機(JVM),由JVM來把字節(jié)碼再“翻譯”成所對應的硬件平臺能夠執(zhí)行的代碼。因此對于Java編程者來說,不需要考慮硬件平臺是什么。所以Java可以跨平臺。而C/C++不可以跨平臺的原因就是編譯后的代碼在特定的硬件上可以直接執(zhí)行,換個硬件平臺這些代碼就不能被執(zhí)行了。不過正是因為可以直接執(zhí)行,所以C/C++程序的執(zhí)行效率要比Java程序高。Java中的類,集合,對象所謂對象就是真實世界中的實體,對象與實體是一一對應的,也就是說實現(xiàn)世界中每一個實體都是一個對象,它是一種具體的概念。類是具備某些共同特征的實體的集合,它是一種抽象的概念,用程序設計的語言來說,類是一種抽象的數(shù)據(jù)類型,它是對所具有相同特征實體的抽象。Map的用法Java中的map其實就是以鍵值對形式的存放數(shù)據(jù)的容器,其常用的實現(xiàn)類主要是 hashmap,例如:Mapmap=newHashMap(); 插入元素:map.put(“key”,obj); 移除元素:map.remove(“key”); 清空:map.clear();Java中的反射機制JAVA反射機制是在運行狀態(tài)中,對于任意一個類,都能夠知道這個類的所有屬性和方法;對于任意一個對象,都能夠調(diào)用它的任意一個方法和屬性;這種動態(tài)獲取的信息以及動態(tài)調(diào)用對象的方法的功能稱為java語言的反射機制。 JAVA反射(放射)機制:“程序運行時,允許改變程序結構或變量類型,這種語言稱為動態(tài)語言”。從這個觀點看,Perl,Python,Ruby是動態(tài)語言,C++,Java,C#不是動態(tài)語言。但是JAVA有著一個非常突出的動態(tài)相關機制:Reflection,用在Java身上指的是我們可以于運行時加載、探知、使用編譯期間完全未知的classes。換句話說,Java程序可以加載一個運行時才得知名稱的class,獲悉其完整構造(但不包括methods定義),并生成其對象實體、或對其fields設值、或喚起其methods。 JAVA中常用到的集合框架都有哪些?下面是詳細: Collection├List│├LinkedList│├ArrayList│└Vector│└Stack└SetMap├Hashtable├HashMap└WeakHashMapJAVA中最常用的集合類是List、Set和Map List特點:元素有放入順序,元素可重復。 Map特點:元素按鍵值對存儲,無放入順序。 Set特點:元素無放入順序,元素不可重復(注意:元素雖然無放入順序,但是元素在set中的位置是有該元素的HashCode決定的,其位置其實是固定的)List和Ma。List的具體實現(xiàn)包括ArrayList和Vector,它們是可變大小的列表,比較適合構建、存儲和操作任何類型對象的元素列表。List適用于按數(shù)值索引訪問元素的情形。Map提供了一個更通用的元素存儲方法。Map集合類用于存儲元素對(稱作“鍵”和“值”)其中每個鍵映射到一個值。 編程題:用最有效率的方法算出2乘以8等于幾?兩個對象值相同(x.equals(y)==true),但卻可有不同的hashcode,這句話對不對?什么時候會使用hashCode?2<<3,因為將一個數(shù)左移n位,就相當于乘以了2的n次方,那么,一個數(shù)乘以8只要將其左移3位即可,而位運算cpu直接支持的,效率最高,所以,2乘以8等于幾的最效率的方法是2<<3。兩個對象值相同(x.equals(y)==true),但卻可有不同的hashcode,這句話是不對的,它們有相同的hashcode,hashCode是用hashTable的時候為了檢索才用的。說出一些常用的類,包,接口,請個舉5個常用的類:BufferedReader、BufferedWriter、FileReader、FileWirter、String、Integer。常用的包:java.lang、java.awt、java.io、java.util、java.sql。常用的接口:Remote、List、Map、Document、NodeList。Java中取兩個集合的并集、交集和差集?并集:也叫合集,即把兩個集合的所有元素加在一起。publicstaticvoidmain(String[]args){ //TODOAuto-generatedmethodstub List<String>list1=newArrayList<String>(); list1.add("A"); list1.add("B"); List<String>list2=newArrayList<String>(); list2.add("C"); list2.add("B"); //2個集合的并集 list1.addAll(list2); System.out.println("并集:"+list1); }運行結果并集:[A,B,C,B]交集:計算兩個集合的共有元素,即你有我也有。publicstaticvoidmain(String[]args){ //TODOAuto-generatedmethodstub List<String>list1=newArrayList<String>(); list1.add("A"); list1.add("B"); List<String>list2=newArrayList<String>(); list2.add("C"); list2.add("B"); //2個集合的交集 list1.retainAll(list2); System.out.println("交集:"+list1); }運行結果:交集:[B]差集:由所有屬于A但是不屬于B的元素組成的集合,叫做A與B的差集,即我有而你沒有的元素。publicstaticvoidmain(String[]args){ //TODOAuto-generatedmethodstub List<String>list1=newArrayList<String>(); list1.add("A"); list1.add("B"); List<String>list2=newArrayList<String>(); list2.add("C"); list2.add("B"); //2個集合的差集 list1.removeAll(list2); System.out.println("差集:"+list1); }運行結果:差集:[A]Java中有幾種類型的流?jdk為每種類型的流提供了一些抽象類以供繼承,請說出它們分別是哪些類?主要分為字節(jié)流,字符流。字節(jié)流繼承于InputStream,OutputStream。字符流繼承于InputStreamReader,OutputStreamWriter。在java.io包中還有許多其他的流,主要是為了提高性能和使用方便。什么是java序列化,如何實現(xiàn)java實例化?序列化就是一種用來處理對象流的機制,所謂對象也就是將對象的內(nèi)容進行流花。為了解決在對對象流進行讀寫操作時所引發(fā)的問題??梢詫α骰蟮膶ο筮M行讀寫操作,也可將流化后的對象傳輸于網(wǎng)絡之間。序列化的實現(xiàn):將需要被序列化的類實現(xiàn)Serializable接口,該接口沒有需要實現(xiàn)的方法,implementsSerializable只是為了標注對象是可被序列化的;然后使用一個輸出流(FileOutputStream)來構造一個ObjectOutputStream(對象流)對象,接著,使用ObjectOutputStream對象的writeObject(Objectobj)方法就可以將參數(shù)為objd的對象寫出(即保存其狀態(tài)),要恢復的話則用輸入流。請對以下在J2EE中常用的名詞進行解釋(或簡單描述)web容器:給處于其中的應用程序組件(jsp,servlet)提供一個環(huán)境,使jsp,servlet直接跟容器中的環(huán)境變量接口交互,不必關注其他系統(tǒng)問題。主要有web服務器來實現(xiàn)。例如:tomcat,weblogic,websphere等。該容器提供的接口嚴格遵守J2EE規(guī)范中的webapplication標準。我們把遵守以上標準的web服務器就叫做J2EE中的web容器。EJB容器:Enterprisejavabean容器。更具有行業(yè)領域特色。他提供給運行在其中的組件EJB各種管理功能。只要滿足J2EE規(guī)范的EJB放入該容器,馬上就會被容器進行高效率的管理。并且可以通過現(xiàn)成的接口來獲得系統(tǒng)級別的服務。例如郵件服務、事務管理。JNDI:(JavaNaming&DirectoryInterface)JAVA命名目錄服務。主要提供的功能是:提供一個目錄系統(tǒng),讓其他各地的應用程序在其上面留下自己的索引,從而滿足快速查找和定位分布式應用程序的功能。JMS:(JavaMessageService)JAVA消息服務。主要實現(xiàn)各個應用程序之間的通訊。包括點對點和廣播。JTA:(JavaTransactionAPI)JAVA事務服務。提供各種分布式事務服務。應用程序只需調(diào)用其提供的接口即可。JAF:(JavaActionFrameWork)JAVA安全認證框架。提供一些安全控制方面的框架。讓開發(fā)者通過各種部署和自定義實現(xiàn)自己的個性安全控制策略。RMI/IIOP:(RemoteMethodInvocation/internet對象請求中介協(xié)議)他們主要用于通過遠程調(diào)用服務。例如,遠程有一臺計算機上運行一個層析,它提供股票分析服務,我們可以在本地計算機上實現(xiàn)對其直接調(diào)用。當然這是要通過一定的規(guī)范才能在異構的系統(tǒng)之間進行通信。RMI是JAVA特有的。BS與CS的聯(lián)系與區(qū)別。C/S是Client/Server的縮寫。服務器通常采用高性能的PC、工作站或小型機,并采用大型數(shù)據(jù)庫系統(tǒng),如Oracle、Sybase、Informix或SQLServer??蛻舳诵枰惭b專用的客戶端軟件。B/S是Brower/Server的縮寫,客戶機上只要安裝一個瀏覽器,服務器安裝Oracle、Sybase、Informix或SQLServer等數(shù)據(jù)庫。在這種結構下,用戶界面完全通往WWW瀏覽器實現(xiàn),一部分事務邏輯在前端實現(xiàn),但是主要事務邏輯在服務端實現(xiàn)。瀏覽器通過WebServer同數(shù)據(jù)庫進行交互。struts1.2和struts2.0的區(qū)別?如何控制兩種框架中的單例模式?struts1.2和struts2.0的對比Action類:struts1.2要求Action類繼承一個基類。struts2.0的Action要求繼承ActionSupport基類。線程模式:struts1.2的Action是單例模式的并且必須是線程安全的,因為僅有一個Action的實例來處理所有的請求。單例策略限制了struts1.2的Action能做的事情,并且開發(fā)時特別小心。Action資源必須是線程安全的或同步的。struts2.0的Action為每一個請求產(chǎn)生一個實例,因此沒有線程安全問題。Servlet依賴:struts1.2的Action依賴于ServletAPI,因為當一個Action被調(diào)用時HttpServletRequest和HttpServletResponse被傳遞給execute方法。struts2.0的Action不依賴于容器,運行Action脫離容器單獨測試。如果需要,struts2.0的Action仍然可以訪問初始的Request和Response。但是,其他的元素減少或者消除了直接訪問HttpServletRequest和HttpServletResponse的必要性??蓽y性:測試struts1.2的Action的一個主要問題是execute方法暴露了ServletAPI(這使得測試要依賴于容器)。需要第三方擴展strutsTestCase提供了一套struts1.2的模擬對象來進行測試。struts2.0的Action可以通過初始化、設置屬性、調(diào)用方法來測試。Struts2在項目中是怎么用的?struts2是如何配置的?struts2的標簽都用過哪些?怎么使用:web.xml中配置StrutsPrepareAndExecuteFilter過濾器,在src下添加struts.xml配置文件。然后在struts.xml文件內(nèi)配置需要的action。如何配置:使用action節(jié)點驚醒action的配置,將name值設置為對應的攔截路徑,class值設置為攔截后需要創(chuàng)建對象的全路徑名。如果使用了spring的話,將class的值設置為spring配置文件中對于bean的id名稱就可以了。最后配置對應調(diào)用的方法名與返回后的結果集。標簽:<s:property/>、<s:if>、<s:form>、<s:select>、<s:iterator>。Struts工作機制?為什么要使用struts?Struts的工作流程: 1、request請求會先通過一系列過濾器,配置 StrutsPrepareAndExecuteFilter過濾HttpServletReques請求;過濾器根據(jù)訪問的路徑來決定是否調(diào)用,若符合,則調(diào)用ActionMapper;ActionMapper調(diào)用ActionProxy,通過配置文件,找到相應的Action類;Action類實例化一個ActionInvocation的實例,該實例涉及到一系列的攔截器;一旦方法運行完畢,ActionInvocation根據(jù)返回值去配置文件查找要求訪問的路徑,通常可以是jsp頁面和另一個Action。為什么要用Struts: JSP、Servlet、JavaBean技術的出現(xiàn)給我們構建強大的企業(yè)應用系統(tǒng)提供了可能。但用這些技術構建的系統(tǒng)非常的繁亂,所以在此之上,我們需要一個規(guī)則、一個把這些技術組織起來的規(guī)則,這就是框架,struts便應運而生?;趕truts開發(fā)的應用由3類組件構成:控制器組件、模型組件、視圖組件。 說下Struts的設計模式MVC模式:將控制層、模型層、視圖層分開(配合詳細的MVC流程,自由發(fā)揮)Treadlocal模式:針對同一個Servlet實例代理模式Struts的應用(如struts架構)Struts是采用servlet技術,開發(fā)Web應用程序的開放源碼的framework。采用Struts能開放出基于MVC(Model-View-Controller)設計模式的應用構架。 Struts有如下的主要功能: 1、包含一個controllerservlet,能將用戶的請求發(fā)送到相應的Action對象。2、JSP自由tag庫,并且在controllerservlet中提供關聯(lián)支持,幫助開發(fā)員創(chuàng)建交互式表單應用。 3、提供了一系列實用對象:XML處理、通過JavareflectionAPIs自動處理JavaBeans屬性、國際化的提供和消息。 Struts的validate框架是如何驗證的?在struts配置文件中配置具體的錯誤提示,再在FormBean中的validate()方法具體調(diào)用。Hibernate工作原理及為什么要用?原理: 1、讀取并解析配置文件 2、讀取并解析映射信息,創(chuàng)建SessionFactory 3、打開Session 4、創(chuàng)建事務Transcation 5、持久化操作 6、提交事務 7、關閉Session 8、關閉SessionFactory為什么要用: 1、對JDBC訪問數(shù)據(jù)庫的代碼做了封裝,大大簡化了數(shù)據(jù)訪問層繁瑣的重復性代碼。2、Hibernate是一個基于JDBC的主流持久化框架,是一個優(yōu)秀的ORM實現(xiàn)。 3、Hibernate映射很靈活性。它支持各種關系數(shù)據(jù)庫,從一對一到多對多的各種復雜關系。Hibernate與jdbc的聯(lián)系1、hibernate是jdbc的輕量級封裝,包括jdbc與數(shù)據(jù)庫的連接,增刪改查等功能。2、hibernate用面向對象的思想,通過配置文件把pojo類的字段和數(shù)據(jù)庫的字段關聯(lián)起來。3、其實hibernate=封裝的jdbc+XML文件。Hibernate與spring的聯(lián)系1、spring實現(xiàn)了程序的全局性管理,包括對hibernate的管理:2、hibernate中的一些對象可以給spring來管理,讓spring容器來創(chuàng)建hibernate中一些對象實例化。例如:SessionFactory,HibernateTemplate等。3、hibernate本來是對數(shù)據(jù)庫的一些操作,放在DAO層,而spring給業(yè)務層的方法定義了事務,業(yè)務層調(diào)用DAO層的方法,很好的將hibernate的操作也加入到事務中來了。什么是Hibernate的并發(fā)機制?怎么去處理并發(fā)問題?Hibernate并發(fā)機制: 1、hibernate的session對象是非線程安全的,對于單個請求,單個會話,單個的工作單元,它通常只使用一次,然后就丟棄。如果一個session實例運行共享的話,那些支持并發(fā)運行的,例如Httprequest,sessionbeans將會導致出現(xiàn)資源爭用。2、并發(fā)可能會引發(fā)第一類丟失更新,臟讀,幻讀,不可重復讀,第二類丟失更新一系列的問題。處理并發(fā)問題:將session綁定到ThreadLocal,每個線程使用的只是session的副本,不會影響到session;設置事務隔離級別: Serializable:串行化。隔離級別最高 RepeatableRead:可重復讀。 ReadCommitted:已提交數(shù)據(jù)讀。 ReadUncommitted:未提交數(shù)據(jù)讀,隔離級別最差。設置鎖,樂觀鎖和悲觀鎖: 樂觀鎖:使用版本號或時間戳來檢測更新丟失,在class的的映射中設置optimistic-lock=”all”可以在沒有版本或者時間戳屬性映射的情況下實現(xiàn)版本檢查,此時hibernate將比較一行記錄的每個字段的狀態(tài)。 行級悲觀鎖:hibernate總是使用數(shù)據(jù)庫的鎖定機制,從不在內(nèi)存中鎖定對象,只要為JDBC連接指定一下隔離級別,然后讓數(shù)據(jù)庫去搞定一切就夠了。類LockMode定義了hibernate所需的不同的鎖定級別:LockMode.UPGRADE_NOWAIT,LockMode.UPGRADE,LockMode.READ。說說Hibernate的緩存機制內(nèi)部緩存存在hibernate中又叫一級緩存,屬于應用事務級緩存二級緩存: a)應用及緩存 b)分布式緩存 條件:數(shù)據(jù)不好被第三方修改、數(shù)據(jù)大小在可接受范圍、數(shù)據(jù)更新頻率低、同一數(shù)據(jù)被系統(tǒng)頻繁使用、非關鍵數(shù)據(jù)。 c)第三方緩存的實現(xiàn):使用第三方緩存插件。Hibernate的查詢方式Hibernate特有的語句Hql:屬性查詢、參數(shù)查詢、命名參數(shù)查詢、關聯(lián)查詢、分頁查詢、統(tǒng)計函數(shù) Criteria查詢Sql查詢Hibernate的三種狀態(tài)之間如何轉換當對象由瞬間狀態(tài)(Transient)—save()時,就變成了持久化狀態(tài)。當我們在session里存儲對象的時候,實際是在session的map里存了一份,也就是它的緩存里放了一份,然后,又到數(shù)據(jù)庫里存了一份,在緩存里這一份叫持久對象(persistent)。Session—Close()了,它的緩存也都關閉了,整個session也就失效了,這個時候,這個對象變成了游離狀態(tài)(Detached),但數(shù)據(jù)庫中還是存在的。當游離狀態(tài)(Detached)update()時,又變?yōu)榱顺志脿顟B(tài)(Persistent)。當持久狀態(tài)(Persistent)delete()時,又變?yōu)榱怂矔r狀態(tài)(Transient),此時,數(shù)據(jù)庫中沒有與之對應的記錄。Hibernate中怎樣實現(xiàn)類之間的關系?(如:一對多、多對多的關系)類與類之間的關系主要體現(xiàn)在表與表之間的關系進行操作,它們都是對對象進行操作,我們程序中把所有的表與類都映射在一起,它們通過配置文件中的many-to-one、one-to-many、many-to-many。如何優(yōu)化hibernate?1、使用雙向一對多關聯(lián),不使用單向一對多2、靈活使用單向一對多關聯(lián)3、不用一對一,用多對一取代4、配置對象緩存,不使用集合緩存5、一對多集合使用Bag,多對多集合使用Set6、繼承類使用顯示多態(tài)7、表字段要少,表關聯(lián)不要怕多,有二級緩存撐腰比較truncate和delete命令?相同點:truncate和delete都可以講數(shù)據(jù)實體刪掉;不同點:a、truncate的操作并不記錄到rollback日志,所以操作數(shù)據(jù)較快,但同時這個數(shù)據(jù)不能恢復;b、delete操作不能騰出表空間的空間;c、truncate不能對視圖等進行刪除;d、truncate是數(shù)據(jù)定義語言(DDL),而delete是數(shù)據(jù)操縱語言(DML)。垃圾回收器的基本原理是什么?垃圾回收器可以馬上回收內(nèi)存嗎?有什么辦法主動通知虛擬機進行垃圾回收?對于GC(GarbageCollection)來說,當程序員創(chuàng)建對象時,GC就開始監(jiān)控對這個對象的地址、大小以及使用情況。通常,GC采用有向圖的方式記錄和管理堆(heap)中的所有對象。通過這種方式確定哪些對象是”可達的”,哪些對象是“不可達的”。當GC確定一些對象為“不可達”時,GC就有責任回收這些內(nèi)存空間。垃圾回收器不可以馬上回收內(nèi)存。程序員可以手動執(zhí)行System.gc(),通知GC運行,但是Java語言規(guī)范并不保證GC一定會執(zhí)行。項目中為什么使用SSH1、使用Struts是因為struts是基于MVC模式的,很好的將非應用程序進行了分層,使開發(fā)者更關注與業(yè)務邏輯的實現(xiàn);第二,struts有著豐富的taglib,如能靈活運用,則能大大提高開發(fā)效率。2、使用Hibernate:因為hibernate為Java應用提供了一個易用的、高效率的對象關系映射框架。Hibernate是個輕量級的持久性框架,功能豐富。3、使用Spring:因為spring基于IoC(InversionofControl,反向控制)和AOP構架多層j2ee系統(tǒng)的框架,但它不強迫你必須在每一層中必須使用spring,因為它模塊化的很好,允許你根據(jù)自己的需要選擇使用它的某一個模塊;采用IoC使得可以很容易的實現(xiàn)bean的裝配,而且能夠在類與類之間解耦合,提供了簡潔的AOP并根據(jù)實現(xiàn)事務管理(TranscationManagment)等。SpringMVC工作機制為什么要用?工作機制: 1、springmvc請所有的請求都提交給DispatcherServlet,它會委托應用系統(tǒng)的其他模塊負責對請求進行真正的處理工作。2、DispatcherServlet查詢一個或多個HandlerMapping,找到處理請求的Controller。3、DispatcherServlet請求提交到目標Controller。4、Controller進行業(yè)務邏輯處理后,會返回一個ModelAndView。5、Dispathcher查詢一個或多個ViewResolver視圖解析器,找到ModelAndView對象指定的視圖對象。6、視圖對象負責渲染返回給客戶端。 為什么要用spring?1、spring既是一個AOP框架,也是一個IOC容器。Spring最好的地方是它有助于替換對象。有了spring,只要用JavaBean屬性和配置文件加入依賴性(協(xié)作對象)。然后可以很容易地在需要時替換不同的接口實現(xiàn)類。2、spring有兩大特性:IOC和AOP IOC:正如單詞倒置所表明的,IOC就像反過來的JNDI。沒有使用一堆抽象工廠、服務定位器、單元素(singleton)和直接構造(straightconstruction),把對象的創(chuàng)建和維護交由容器管理,從而使類與類之間的依賴關系發(fā)生反轉,實現(xiàn)解耦合。 AOP:讓開發(fā)人員可以創(chuàng)建非行為性的關注
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經(jīng)權益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
- 6. 下載文件中如有侵權或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 現(xiàn)代商務場合下的著裝與舉止規(guī)范
- 居然之家國慶節(jié)活動方案
- 現(xiàn)代農(nóng)業(yè)旅游產(chǎn)業(yè)鏈構建與農(nóng)業(yè)可持續(xù)發(fā)展
- 未來生態(tài)社區(qū)的規(guī)劃與水環(huán)境關系探討
- 災害預防教育在學校的推廣與應用
- 匯報邏輯清晰度職場的制勝法寶
- 6 飛向藍天的恐龍說課稿-2023-2024學年四年級下冊語文統(tǒng)編版
- 2023九年級物理上冊 第四章 探究電流4.3 導體對電流阻礙作用說課稿 (新版)教科版
- 2 送元二使安西(說課稿)- 2024-2025學年部編版語文六年級上冊
- 2024-2025學年高中數(shù)學 第一章 集合與常用邏輯用語 1.4.2 充要條件說課稿 新人教A版必修第一冊001
- 2024年公安機關理論考試題庫附答案【考試直接用】
- 課題申報參考:共同富裕進程中基本生活保障的內(nèi)涵及標準研究
- 2025年浙江嘉興桐鄉(xiāng)市水務集團限公司招聘10人高頻重點提升(共500題)附帶答案詳解
- 食品企業(yè)如何做好蟲鼠害防控集
- 2025中國聯(lián)通北京市分公司春季校園招聘高頻重點提升(共500題)附帶答案詳解
- 康復醫(yī)學科患者隱私保護制度
- 環(huán)保工程信息化施工方案
- 狂犬病暴露后預防處置
- 紅色中國風2025蛇年介紹
- 2024年安徽省高考地理試卷真題(含答案逐題解析)
- 高中學校開學典禮方案
評論
0/150
提交評論