這套面試題主要目的是幫助那些尚未java軟件開發實際工做經驗,而正在努力尋找java軟件開發工做的學生在筆試/面試時更好地贏得好的結果。因爲這套試題涉及的範圍很泛,很廣,很雜,你們不可能一天兩天就看完和學完這套面試寶典,即便你已經學過了有關的技術,那麼至少也須要半個月的時間才能消化和掌握這套面試寶典,因此,你們應該早做準備,從拿到這套面試寶典之日起,就要堅持在天天閒暇之餘學習其中幾道題目,日積月累,等到出去面試時,一切都水到渠成,面試時就天然會遊刃有餘了。前端
答題時,先答是什麼,再答有什麼做用(怎麼用)——100java
若是不會回答,能夠說本身的思路(僞代碼)——80,能夠說一些相關的東西——60;程序員
,能夠表示不會這個問題你下一步要作什麼——20web
說:不知道,沒記住,——0面試
好比說面試官問:給我介紹一下ORM?sql
較好回答:數據庫
一、 ORM就是Object Relational Mapping,就是對象關係映射;編程
二、 做用:咱們在寫程序的時候,用的是面向對象的方法,可是在關係型數據庫裏,存的是一條條的記錄;爲了用純面向對象的思想解決問題,因此須要將程序中的對象和數據庫中的記錄創建起映射關係,ORM就是將對象和數據庫中的記錄創建起映射的技術;api
答案要井井有條,條理清晰,從這些表面的東西也能夠看出一我的的習慣、辦事風格、條理、思惟邏輯性等。數組
答題不侷限於什麼格式和形式,就是要將本身的掌握的技術內容展示出來,好比能夠採用舉例的說法:
須要特別注意的是,由於面試官自己水平良莠不齊,不要由於人家題目問的模棱兩可(或者題目問的不許確),你就內心膽怯和沒底氣了,不敢回答了。你要大膽地提出對方題目中你不清楚的地方,但願對方能從新明確的提出問題?
例如,你能夠問:您提的問題,我剛纔沒有徹底聽明白,能不能再說一遍。
在進行技術面試前,提醒你們,必需要準備好項目介紹,即須要準備好你的簡歷中列的全部項目的項目介紹!
面試時關於項目,面試官常見的問題及回答(以銀行櫃檯系統爲例):
l 你給我簡要介紹一下銀行櫃檯系統(功能)?
回答時,站在用戶的角度來描述系統。
一、簡易銀行櫃檯系統是模擬銀行櫃檯的基本功能而作的一個系統。
二、系統分前臺和後臺部分,前臺部分是銀行櫃檯人員操做的,包括:註冊登陸模塊、開銷戶模塊、賬號管理模塊、存取錢轉帳模塊、櫃檯人員信息管理;後臺部分是銀行管理者操做的,包括查看日誌模塊、管理櫃檯人員信息模塊;
三、我主要負責的是前臺的所有功能;
l 你詳細介紹一下你負責的模塊的功能?
問功能的時候,要記住,仍是站在用戶角度去描述;
一、我負責的註冊登陸模塊和櫃檯人員信息模塊其實是管理櫃檯人員信息的,內容比較簡單;
二、開銷戶模塊、賬號管理模塊、存取錢轉帳模塊是爲銀行儲戶服務的模塊。其中開銷戶就是爲儲戶開戶、銷戶的功能,帳戶管理模塊就是幫儲戶凍結賬號、修改密碼等功能,存取錢轉帳模塊就是爲儲戶存錢、取錢,幫儲戶轉帳的功能;
l 最容易接的下一個問題:你怎麼實現的?
功能套在技術點上,把流程再說一遍! 說業務邏輯;
l 問細節:
記得清楚的說,記不清楚的說思路,說僞代碼.
l 這個項目幾我的作的?用了多長時間?
一、 這個項目比較小,由2我的合做完成的,我負責的是前臺部分;
二、 項目大概用了4天左右的時間;
l 這個項目使用了什麼技術?
一、 這個項目使用Struts二、Hibernate3和MySQL
最容易接下來問的是,**技術/框架你是怎麼理解的?怎麼完成映射的?怎麼處理事務?Session是怎麼管理的?Struts怎麼作數據傳輸和轉換的?
l 你在作這個項目的時候,遇到了什麼困難,怎麼解決的?
一、 好比在Hiberante的使用,關於表之間關聯關係的配置,我開始操做的時候不太熟悉,後來經過查文檔、和其餘同窗溝通的方式,這個問題也獲得瞭解決;
備註:若是你在這裏提到了表之間關聯關係的配置,那麼這個問題面試官很是有可能接下去就問這個技術問題,因此務必認真準備這個技術問題。
注:基礎題是面試官最在乎的,這些內容幾乎是0容錯的。
一、這兩個語句均可以用於跳出循環的;
二、break是停止循環,執行循環體之後的語句,而continue是跳出本次循環,執行下一次循環;
一、能夠是char、byte、short、int,不能夠是long、String等其餘類型;
二、從JDK1.7開始,支持String類型;
Java裏採用了Unicode編碼格式,Unicode編碼中一個char型佔用2個字節,而一個漢字也是佔用2個字節,因此能夠存儲中文漢字。
備註:C語言裏,char佔用1個字節,不用存漢字。
&和&&均可以用做邏輯與的運算符,表示邏輯與(and),當運算符兩邊的表達式的結果都爲true時,整個運算結果才爲true,不然,只要有一方爲false,則結果爲false。
&&還具備短路的功能,即若是第一個表達式爲false,則再也不計算第二個表達式,例如,對於if(str != null && !str.equals(「」))表達式,當str爲null時,後面的表達式不會執行,因此不會出現NullPointerException若是將&&改成&,則會拋出NullPointerException異常。If(x==33 & ++y>0) y會增加,If(x==33 && ++y>0)不會增加
&還能夠用做位運算符,當&操做符兩邊的表達式不是boolean類型時,&表示按位與操做,咱們一般使用0x0f來與一個整數進行&運算,來獲取該整數的最低4個bit位,例如,0x31 & 0x0f的結果爲0x01。
備註:這道題先說二者的共同點,再說出&&和&的特殊之處,並列舉一些經典的例子來代表本身理解透徹深刻、實際經驗豐富。
在語法定義上的區別:靜態變量前要加static關鍵字,而實例變量前則不加。
在程序運行時的區別:實例變量屬於某個對象的屬性,必須建立了實例對象,其中的實例變量纔會被分配空間,才能使用這個實例變量。靜態變量不屬於某個實例對象,而是屬於類,因此也稱爲類變量,不用建立任何實例對象,靜態變量就會被分配空間,靜態變量就能夠被使用了。總之,實例變量必須建立對象後才能夠經過這個對象來使用,靜態變量則能夠直接使用類名來引用。
不能夠。由於非static方法是要與對象關聯在一塊兒的,必須建立一個對象後,才能夠在該對象上進行方法調用,而static方法調用時不須要建立對象,能夠直接調用。也就是說,當一個static方法被調用時,可能尚未建立任何實例對象,若是從一個static方法中發出對非static方法的調用,那個非static方法是關聯到哪一個對象上的呢?這個邏輯沒法成立,因此,一個static方法內部發出對非static方法的調用。
(單獨把一個東西說清楚,而後再說清楚另外一個,這樣,它們的區別天然就出來了,混在一塊兒說,則很難說清楚)
==操做符專門用來比較兩個變量的值是否相等,也就是用於比較變量所對應的內存中所存儲的數值是否相同,要比較兩個基本類型的數據或兩個引用變量是否相等,只能用==操做符。
若是一個變量指向的數據是對象類型的,那麼,這時候涉及了兩塊內存,對象自己佔用一塊內存(堆內存),變量也佔用一塊內存,例如Objet obj = new Object();變量obj是一個內存,new Object()是另外一個內存,此時,變量obj所對應的內存中存儲的數值就是對象佔用的那塊內存的首地址。對於指向對象類型的變量,若是要比較兩個變量是否指向同一個對象,即要看這兩個變量所對應的內存中的數值是否相等,這時候就須要用==操做符進行比較。
equals方法是用於比較兩個獨立對象的內容是否相同,就比如去比較兩我的的長相是否相同,它比較的兩個對象是獨立的。例如,對於下面的代碼:
String a=new String("foo");
String b=new String("foo");
兩條new語句建立了兩個對象,而後用a,b這兩個變量分別指向了其中一個對象,這是兩個不一樣的對象,它們的首地址是不一樣的,即a和b中存儲的數值是不相同的,因此,表達式a==b將返回false,而這兩個對象中的內容是相同的,因此,表達式a.equals(b)將返回true。
在實際開發中,咱們常常要比較傳遞進行來的字符串內容是否等,例如,String input = …;input.equals(「quit」),許多人稍不注意就使用==進行比較了,這是錯誤的,隨便從網上找幾個項目實戰的教學視頻看看,裏面就有大量這樣的錯誤。記住,字符串的比較基本上都是使用equals方法。
若是一個類沒有本身定義equals方法,那麼它將繼承Object類的equals方法,Object類的equals方法的實現代碼以下:
boolean equals(Object o){
return this==o;
}
這說明,若是一個類沒有本身定義equals方法,它默認的equals方法(從Object 類繼承的)就是使用==操做符,也是在比較兩個變量指向的對象是不是同一對象,這時候使用equals和使用==會獲得一樣的結果,若是比較的是兩個獨立的對象則總返回false。若是你編寫的類但願可以比較該類建立的兩個實例對象的內容是否相同,那麼你必須覆蓋equals方法,由你本身寫代碼來決定在什麼狀況便可認爲兩個對象的內容是相同的。
注意hashcode,及相關的Comparable和Comparator接口。
一、int是基本數據類型,Integer是包裝類;
二、int的默認值是0,Interger的默認值是null;
這四個做用域的可見範圍以下表所示。
說明:若是在修飾的元素上面沒有寫任何訪問修飾符,則表示friendly。
做用域 當前類 同一package 子孫類 其餘package
public √ √ √ √
protected √ √ √ ×
friendly √ √ × ×
private √ × × ×
備註:只要記住了有4種訪問權限,4個訪問範圍,而後將全選和範圍在水平和垂直方向上分別按排從小到大或從大到小的順序排列,就很容易畫出上面的圖了。
Overload是重載的意思,Override是覆蓋的意思,也就是重寫。
重載是指在一個類裏,方法名相同,參數不一樣;
重寫是指子類繼承父類,子類裏從新編寫了父類中的同名(同參數)方法,也就是覆蓋了父類的方法;
不是!由於重載必需要求參數列表不一樣!
接口能夠繼承接口。抽象類能夠實現(implements)接口,抽象類是否可繼承具體類。
備註:只要明白了接口和抽象類的本質和做用,這些問題都很好回答。
只有記住抽象類與普通類的惟一區別就是不能建立實例對象和容許有abstract方法。
一、面向對象有封裝、繼承 、抽象、多態等4個主要的特徵。
二、封裝:面向對象的封裝就是把描述一個對象的屬性和行爲的代碼封裝在一個類中,有些屬性是不但願公開的,或者說被其餘對象訪問的,因此咱們使用private修飾該屬性,使其隱藏起來;類中提供了方法(用public修飾),經常使用的是get、set方法,能夠操做這些被隱藏的屬性,其餘類能夠經過調用這些方法,改變隱藏屬性的值!
下面的回答是更高要求,不須要學生必須掌握:
封裝是保證軟件部件具備優良的模塊性的基礎,封裝的目標就是要實現軟件部件的「高內聚、低耦合」,防止程序相互依賴性而帶來的變更影響。在面向對象的編程語言中,對象是封裝的最基本單位,面向對象的封裝比傳統語言的封裝更爲清晰、更爲有力。
三、抽象:抽象就是找出一些事物的類似和共性之處,而後將這些事物歸爲一個類,這個類只考慮這些事物的類似和共性之處,而且會忽略與當前主題和目標無關的那些方面,將注意力集中在與當前目標有關的方面。
四、繼承:在定義和實現一個類的時候,能夠在一個已經存在的類的基礎之上來進行,使用extends關鍵字實現繼承;子類中能夠加入若干新的內容,或修改原來的方法使之更適合特殊的須要,這就是繼承。繼承是子類自動共享父類數據和方法的機制,這是類之間的一種關係,提升了軟件的可重用性和可擴展性。
五、多態:多態就是在聲明時使用父類,在實現或調用時使用具體的子類;即不修改程序代碼就能夠改變程序運行時所綁定的具體代碼,讓程序能夠選擇多個運行狀態,這就是多態性,多態加強了軟件的靈活性和擴展性。這裏能夠舉個例子,好比聲明時使用的是動物類,調用時傳遞的是一個貓類(動物類的子類)的對象,具體執行父類裏動物——吃的方法時,實際執行的是貓——吃的方法。
多態依賴於向上轉型和後期綁定。
一、抽象類裏面能夠用普通方法,而接口中的方法所有都是抽象的;
二、在應用範圍上來講,接口每每在程序設計的時候,用來定義程序模塊的功能,方便各模塊協同工做;抽象類是對類似類進行抽象,造成一個抽象的父類可供重用!
一、String是個類,不是基本數據類型;
二、基本數據類型包括byte、int、char、long、float、double、boolean和short。
一、String是個不可變長度的字符串,而StringBuffer是個可變長度的字符串;
二、在對String類進行操做的時候(例如增長字符),其實是在內存中產生了一個新的String對象; 而StringBuffer是給原對象增長字符,不是新建立一個對象;
三、StringBuilder是線程非安全的,StringBuffer是線程安全的,兩者的方法都是同樣的。
數組沒有length()這個方法,有length的屬性。String有length()這個方法。
final 用於聲明屬性,方法和類,分別表示屬性不可變,方法不可覆蓋,類不可繼承。
finally是異常處理語句結構的一部分,表示老是執行。
finalize是Object類的一個方法,在垃圾收集器執行的時候會調用被回收對象的此方法,能夠覆蓋此方法提供垃圾收集時的其餘資源回收,例如關閉文件等。JVM不保證此方法總被調用
全部異常的根類爲java.lang.Throwable,Throwable下面又派生了兩個子類:Error和Exception。Error 表示恢復不是不可能但很困難的狀況下的一種嚴重問題。好比說內存溢出。不可能期望程序能處理這樣的狀況。Exception 表示一種設計或實現問題。也就是說,它表示若是程序運行正常,從不會發生的狀況。
Exception表示程序還可以克服和恢復的問題,其中又分爲系統異常(RuntimeException)和普通異常,系統異常是軟件自己缺陷所致使的問題,也就是軟件開發人員考慮不周所致使的問題,軟件使用者沒法克服和恢復這種問題,但在這種問題下還可讓軟件系統繼續運行或者讓軟件死掉,例如,數組腳本越界(ArrayIndexOutOfBoundsException),空指針異常(NullPointerException)、類轉換異常(ClassCastException);普通異常是運行環境的變化或異常所致使的問題,是用戶可以克服的問題,例如,網絡斷線,硬盤空間不夠,發生這樣的異常後,程序不該該死掉。
java爲系統異常和普通異常提供了不一樣的解決方案,編譯器強制普通異常必須try..catch處理或用throws聲明繼續拋給上層調用方法處理,因此普通異常也稱爲checked異常,而系統異常能夠處理也能夠不處理,因此,編譯器不強制用try..catch處理或用throws聲明,因此係統異常也稱爲unchecked異常。
常見異常好比:
1、空指針異常;
2、數組下標越界;
3、類型轉換異常;
4、算數異常,例如除數爲零;
5、IO異常,好比說找不到文件;
6、找不到類異常;
7、sql異常,例如sql語句不能正常運行;
8、…
一、是程序執行流的最小單元。在單個程序中同時運行多個線程完成不一樣的工做,稱爲多線程。
二、開始時:就緒狀態,等待cpu調用後進入運行狀態,運行過程當中遇到阻塞事件,進入阻塞狀態,等待阻塞事件結束後,從新進入就緒狀態;若是沒有阻塞事件,運行結束後,則進入結束狀態。
sleep就是暫停當前線程一段時間,把cpu讓給其餘線程使用,到時後會自動恢復。調用sleep不會釋放對象鎖。 wait方法致使本線程放棄對象鎖,進入等待,只有等到本對象的notify方法(或notifyAll)後本線程才進入就緒狀態,等待執行。
多線程有兩種實現方法,分別是繼承Thread類與實現Runnable接口
啓動一個線程是調用start()方法,使線程就緒狀態,之後能夠被調度爲運行狀態,一個線程必須關聯一些具體的執行代碼,run()方法是該線程所關聯的執行代碼。
一、Set是無序的,元素不可重複;List是有序的,元素能夠重複;
二、List存儲的是單個對象的集合(有序的),Map存儲的是鍵值對爲對象的集合(無序的);
一、HashMap和Hashtable都完成了Map接口;
二、HashMap非線程安全的,而Hashtable是線程安全的,緣由是Hashtable裏面的方法使用Synchronize關鍵字修飾的;
三、由於Hashtable使用了Synchronize關鍵字修飾,其性能比較差;(具體緣由不作詳細說明)
一、ArrayList和LinkedList都完成了List接口;
二、ArrayList底層是用數組實現的,而LinkedList使用鏈表實現的;
三、ArrayList在插入、刪除時,須要移動數組元素,故性能較差;可是在按下標訪問時,由於是連續的數組,因此查詢速度快;LinkedList正好相反,新增刪除較快,而按下標訪問時較慢。
字節流繼承於InputStream、OutputStream,字符流繼承於Reader 、Writer。
字節流的讀寫單元爲字節或字節數組,字符流的讀寫單元爲字符或字符數組(字符串)。
咱們有時候將一個java對象變成字節流的形式傳出去或者從一個字節流中恢復成一個java對象,例如,要將java對象存儲到硬盤或者傳送給網絡上的其餘計算機,這個過程咱們能夠本身寫代碼去把一個java對象變成某個格式的字節流再傳輸,可是,jre自己就提供了這種支持,咱們能夠調用OutputStream的writeObject方法來作,若是要讓java 幫咱們作,要被傳輸的對象必須實現serializable接口,這樣,javac編譯時就會進行特殊處理,編譯的類才能夠被writeObject方法操做,這就是所謂的序列化。須要被序列化的類必須實現Serializable接口,該接口是一個mini接口,其中沒有須要實現的方法,implements Serializable只是爲了標註該對象是可被序列化的。
例如,在web開發中,若是對象被保存在了Session中,tomcat在重啓時要把Session對象序列化到硬盤,這個對象就必須實現Serializable接口。若是對象要通過分佈式系統進行網絡傳輸或經過rmi等遠程調用,這就須要在網絡上傳輸對象,被傳輸的對象就必須實現Serializable接口。
一、泛型
二、For-Each循環
三、自動裝包/拆包
四、枚舉
五、靜態導入
六、Annotation
一、避免在開發程序的時候,建立出一個類的多個實例(佔用空間,性能問題),因此使用單例模式,保證該類只建立一個對象;
二、通常單例模式一般有兩種形式:它的構造函數爲private的,必須有一個靜態方法,靜態方法返回本身的實例;實行形式有兩種,懶漢式和餓漢式;所謂的餓漢式就是在聲明實例的時候直接初始化對象,而懶漢式是先聲明一個空對象,在靜態方法中實例化該對象並返回。
JVM中類的裝載是由ClassLoader和它的子類來實現的,Java ClassLoader 是一個重要的Java運行時系統組件。它負責在運行時查找和裝入類文件的類。
能夠,但在應用的時候,須要用本身的類加載器去加載,不然,系統的類加載器永遠只是去加載jre.jar包中的那個java.lang.String。
java的內存分爲兩類,一類是棧內存,一類是堆內存。棧內存是指程序進入一個方法時,會爲這個方法單獨分配一塊私屬存儲空間,用於存儲這個方法內部的局部變量,當這個方法結束時,分配給這個方法的棧會釋放,這個棧中的變量也將隨之釋放。
堆是與棧做用不一樣的內存,通常用於存放不放在當前方法棧中的那些數據,例如,使用new建立的對象都放在堆裏,因此,它不會隨方法的結束而消失。方法中的局部變量使用final修飾後,放在堆中,而不是棧中。
一、B/S:瀏覽器 服務器模式;
二、C/S:客戶端 服務器模式;
一、在web.xml裏爲每個Servlet配置初始化參數;
二、經過ServletConfig對象實現對Servlet初始化對象的獲取;
一、Ajax是採用了異步請求的方式,解決了頁面無刷新式提交的問題,改善了頁面的用戶體驗效果;經常使用在google地圖,註冊時用戶名重複性校驗,百度搜索下拉列表框;
二、經常使用的Ajax框架:底層框架:JQuery、Prototype;高層框架:DWR、DOJO、EXTJS、YUI;
Get和Post都是提交表單的方式之一;
一、get方式表單中的數據放到HTTP數據包的頭部,post方式放到body中;
二、get方式提交後,數據會在地址欄中顯示出來,而post方式不會,因此post更安全;
三、get方式在提交數據的時候,數據長度是有限制的;而post方式在理論上對提交數據的大小是無限制的;
四、get提交表單永遠使用字符方式提交;而post方式提交表單能夠是字節方式也能夠是字符方式
Servlet生命週期包括加載和實例化、初始化、處理請求以及服務結束;
Servlet生命週期是由容器進行管理的,不能夠被程序員手工銷燬;
Servlet被服務器實例化後(用戶第一次訪問該Servlet時),容器運行其init方法,請求到達時運行其service方法,service方法自動派遣運行與請求對應的doXXX方法(doGet,doPost)等,當服務器決定將實例銷燬的時候調用其destroy方法。
一、forward是請求轉發,而reditect是重定向;
二、請求轉發是服務器將客戶端的請求轉發到另外一個地址去處理,而後將響應返回給客戶端;其實是1次請求,1次響應,對客戶端而言是透明的;而重定向是服務器根據客戶端發來的請求,返回給一個客戶端一個新的地址,客戶端根據這個返回的地址再發送請求,獲得響應;其實是2次請求,2次響應,並且客戶端的地址是第二次訪問的地址;
三、轉發只能轉發到本身的資源,重定向無限制。
JSP共有如下9個內置的對象:
request 用戶端請求
response 網頁傳回用戶端的迴應
pageContext 網頁的屬性是在這裏管理
session 與請求有關的會話期
application
out 用來傳送回應的輸出
config
page JSP網頁自己
exception頁面中的異常和錯誤
一、Session和Cookie都是會話跟蹤技術;
二、Session是保存在服務器端的技術(保持用戶登陸狀態的檢查經常使用Session),而Cookie是保存在客戶端的技術;
三、Cookie只能存字符串,Session能夠存對象;
一、靜態包含屬於編譯期包含(包含頁面和被包含的頁面在編譯期造成一個jsp文件),動態包含屬於運行期包含(包含頁面和被包含的頁面分別編譯成兩個文件,而後運行時把兩個文件組裝起來);
二、動態包含能夠帶參數;
重要備註:此數據庫部分面試題不含SQL語句(含各種函數)面試具體的題目,關於SQL語句的使用,請學生本身準備!
數據定義:create Table,Alter Table,Drop Table, Create/Drop Index等(學生須要瞭解)
數據操縱:select ,insert,update,delete(這個最重要,學生須要開展學習準備)
數據控制:grant,revoke
經常使用的數據庫對象包括:表、視圖、索引、函數、存儲過程、觸發器等。
一、視圖是一個虛擬表,是由查詢語句產生的,不是真實存在的表;同真實的表同樣,視圖包含一系列帶有名稱的列和行數據。
二、它主要出於兩種緣由:
首先是簡化查詢,將複雜查詢封裝到視圖中,使用者只需用簡單查詢從視圖中提取數據。
另一個是安全緣由, 視圖能夠隱藏一些數據,如:員工信息表,能夠用視圖只顯示姓名,年齡、性別等通用信息,而隱藏工資等敏感信息。還需經過受權屏蔽用戶(含開發人員)對基表的訪問,而對試圖開放訪問權限,這樣才能完全屏蔽敏感數據。
一、索引是一種特殊的查詢表,簡單的理解就是在數據庫中,將數據按必定的順序進行排列(分物理索引:只有1個 和邏輯索引:能夠有多個),查詢的時候,能夠有效提升查詢速度。
二、若是一個表要頻繁的進行添加和刪除記錄的操做(不是查詢),不建議創建多個索引,由於添加和刪除記錄,都須要調整索引,增長數據庫負擔,影響性能。
一、遊標是對查詢出來的結果集進行處理的一個對象,遊標至關於一個定位器,能夠定在該集合中的特定行,從而能夠先後移動遊標來處理某一行數據。
一、事務是一系列的數據庫操做,是數據庫應用的基本邏輯單位,事務由事務開始(begin transaction)和事務結束(end transaction)之間執行的全體操做組成。
二、事務具備以下特性:(其中原子性最爲重要,必須掌握)
原子性(atomicity) 一個事務是一個不可分割的工做單位,事務中包括的諸操做要麼都作,要麼都不作。
一致性(consistency) 事務必須是使數據庫從一個一致性狀態變到另外一個一致性狀態。
隔離性(isolation) 一個事務的執行不能被其餘事務干擾。即一個事務內部的操做及使用的數據對併發的其餘事務是隔離的,併發執行的各個事務之間不能互相干擾。
持久性(durability) 持續性也稱永久性(permanence),指一個事務一旦提交,它對數據庫中數據的改變就應該是永久性的。接下來的其餘操做或故障不該該對其有任何影響。
日誌的做用是記錄全部對數據庫數據的修改,主要是保護數據庫以防止故障發生後,對數據庫進行恢復;
一、主鍵和外鍵是用來創建數據庫表之間關聯關係的;
二、舉例來講,有一個學生表(學生學號、姓名、班級編號等信息)和一個班級表(班級編號、班級名稱),經過編輯編號創建班級表和學生表之間一對多的關聯,則班級表中班級編號是主鍵,學生表中的班級編號是外鍵。
一、數據庫中的存儲過程是用於定義的一系列的sql語句的集合(含控制語句),涉及特定表和其餘對象的任務,用戶能夠調用存儲過程(有些相似java裏的方法);
二、觸發器(trigger)是個特殊的存儲過程,它的執行不是由程序調用,也不是手工啓動,而是由事件來觸發,好比當對一個表進行操做( insert,delete, update)時就會激活它執行。
三、存儲過程的好處:
SQL語句已經預編繹過了,所以運行的速度比較快;
經常使用功能的集合,提升了重用性;
用戶只須要調用存儲過程,不須要逐個寫存儲過程當中的語句,減小了數據傳輸量;
一、內鏈接是保證兩個表中全部的行都要知足鏈接條件,而外鏈接則否則。
二、在外鏈接中,某些不滿條件的列也會顯示出來,也就是說,只限制其中一個表的行,而不限制另外一個表的行。分左鏈接、右鏈接、全鏈接(笛卡爾集)三種。
一、數據庫鏈接池技術,在程序啓動時會創建必定數量的數據庫鏈接(也稱爲池鏈接),並一直維持很多於此數目的池鏈接。
二、客戶端程序須要鏈接數據庫時,數據庫鏈接池會返回一個空閒的池鏈接給數據庫使用。若是當前沒有空閒鏈接,數據庫鏈接池就新建必定數量的鏈接。當使用的池鏈接調用完成後,鏈接池將此鏈接標記爲空閒(回收),其餘調用就可使用這個鏈接。這樣作的目的是提升了應用程序訪問數據庫的性能。
一、MySQL:3306
二、Oracle:1521
三、SQL Server:1433
在SQL Server中使用TOP分頁,
在Oracle中用ROWNUM,或分析函數ROW_NUMBER,
在MySQL中用Limit。
一、先優化SQL語句;
二、表級別優化:好比說創建索引;
三、數據庫級別優化:好比說數據庫參數設置,例如鏈接池數量;
一、加載JDBC驅動程序;
二、建立數據庫的鏈接;
三、建立一個Statement對象;
四、執行SQL語句;
五、返回並處理結果(有多是結果集,有多是影響行數);
六、關閉鏈接;
一、PreparedStatement是Statement的子接口;
二、PreparedStatement有綁定參數的功能,避免SQL注入,安全性更好;
三、PreparedStatement對SQL語句有預編譯的功能,因此性能更好;——由於SQL是須要進行數據庫權限驗證、解析爲關係代數和執行過程
一、有DOM,SAX等
二、DOM:處理大型文件時性能比較差,緣由是DOM須要把整個文檔裝入內存,適合對XML的隨機訪問;
三、SAX:是事件驅動型的XML解析方式,它順序讀取XML文件,不須要一次所有裝載整個文件,當遇到像文檔開頭、文檔結束或標籤開頭和結束時,會觸發一個事件,用戶能夠進行處理;
一、配置文件中使用XML文檔;
二、XML是標準的文件傳輸格式,異構系統數據交換常採用XML;
一、M:Model 模型層 主要用來處理業務邏輯,承載數據;
二、V:View 視圖層 主要用來作頁面顯示的
三、C:Control 控制層 主要用來進行業務流程控制;
四、經常使用的MVC框架包括:Struts、Struts二、SpringMVC;
備註:下面的描述必須轉換成本身的語言進行表述!!!這道題很是重要,面試官關於Struts的不少問題均可以從本題中找到答案。
一、Struts是一個應用於Web層的MVC框架;
二、以ActionServlet做爲核心控制器,接收用戶全部請求,並將請求分發到不一樣的Action中進行處理,並將響應結果返回給客戶端;
三、咱們能夠在web.xml文件中將符合某種特徵的全部請求交給這個核心控制器進行處理,這個狠心控制器再參照一個配置文件(一般爲/WEB-INF/struts-config.xml)將各個請求分別分配給不一樣的Action去處理。
四、ActionServlet把請求交給Action去處理以前,會將請求參數封裝成一個formbean對象。
備註:若是面試官須要解釋一下formbean,則按以下思路回答:
ActionServlet把formbean對象傳遞給action的execute方法以前,可能會調用formbean的validate方法進行校驗,只有校驗經過後纔將這個formbean對象傳遞給action的execute方法,不然,它將返回一個錯誤頁面,這個錯誤頁面由input屬性指定,(看配置文件)做者爲何將這裏命名爲input屬性,而不是error屬性,咱們後面結合實際的運行效果進行分析。
五、Action執行完後要返回顯示的結果視圖,這個結果視圖是用一個ActionForward對象來表示的,actionforward對象經過struts-config.xml配置文件中的配置關聯到某個jsp頁面,由於程序中使用的是在struts-config.xml配置文件爲jsp頁面設置的邏輯名,這樣能夠實現action程序代碼與返回的jsp頁面名稱的解耦。
備註:下面的描述必須轉換成本身的語言進行表述!!!這道題很是重要,面試官關於Struts2的不少問題均可以從本題中找到答案。
一、客戶端發送一個指向Servlet容器(例如Tomcat)的請求
二、這個請求通過一系列的過濾器(Filter)
三、接着FilterDispatcher被調用,將request中所攜帶的數據放入值棧(ValueStack);
四、 FilterDispatcher詢問ActionMapper來決定這個請求是否須要調用某個Action,把請求的處理交給ActionProxy;
五、 ActionProxy經過Configuration Manager詢問框架的配置文件(struts.xml),找到調用的Action類;
六、 ActionProxy建立一個ActionInvocation的實例;
七、 ActionInvocation在調用Action的過程先後,涉及到相關攔截器(Intercepter)的調用;
八、 一旦Action執行完畢,ActionInvocation負責根據struts.xml中的配置找到對應的返回結果(JSP顯示結果)。
備註:下面的描述必須轉換成本身的語言進行表述!!!
一、都是MVC的WEB框架;
二、struts1的前端控制器是一個Servlet,名稱爲ActionServlet,struts2的前端控制器是一個filter,在struts2.0中叫FilterDispatcher,在struts2.1中叫StrutsPrepareAndExecuteFilter;
三、struts1的action須要繼承Action類,struts2的action能夠不繼承任何類;struts1對同一個路徑的全部請求共享一個Action實例,struts2對同一個路徑的每一個請求分別使用一個獨立Action實例對象,全部對於struts2的Action不用考慮線程安全問題。
四、在struts1中使用formbean封裝請求參數,在struts2中直接使用action的屬性來封裝請求參數。
五、struts1中的多個業務方法放在一個Action中時(即繼承DispatchAction時),要麼都校驗,要麼都不校驗;對於struts2,能夠指定只對某個方法進行校驗,當一個Action繼承了ActionSupport且在這個類中只編寫了validateXxx()方法,那麼則只對Xxx()方法進行校驗。
優勢:
1、 框架是一個半成品,將不少開發中的常見任務都已經封裝好,好比請求參數到javaBean的轉換,這樣能夠減輕程序開發的工做量,提高開發效率;
2、 struts框架實現了MVC模式,規範了代碼結構,提升了代碼可維護性;
3、 有豐富的頁面標籤能夠用 ,能大大簡化頁面的開發;
一、實現MVC模式,結構清晰,使開發者只關注業務邏輯的實現;
二、有豐富的tag能夠用 ,Struts的標記庫(Taglib),如能靈活動用,則能大大提升開發效率;
三、經過配置文件,使系統的脈絡更加清晰。一個配置文件,便可把握整個系統各部分之間的聯繫,這對於後期的維護有着很大的好處。
四、Struts提供了兩週異常處理方式,聲明式異常處理和編程式異常處理——此處學生須要本身多看看相關資料,可以進一步回答面試官問題;
五、對國際化進行支持,支持I18N;
缺點:
一、實現MVC模式,代碼複雜度提高;
二、須要維護配置文件,比較麻煩;
一、Hibernate是一個操做數據庫的框架,實現了對JDBC的封裝;
二、Hibernate是一個ORM框架,咱們在寫程序的時候,用的是面向對象的方法,可是在關係型數據庫裏,存的是一條條的記錄;爲了用純面向對象的思想解決問題,因此須要將程序中的對象和數據庫中的記錄創建起映射關係,ORM就是將對象和數據庫中的記錄創建起映射的技術,而Hibernate就是這樣一個ORM框架;
三、Hibernate簡化了代碼編寫,原來JDBC須要寫一堆代碼完成的功能,Hibernate須要少許的代碼便可以實現;
四、Hibernate屏蔽了數據庫的差別,增長了對不一樣數據庫的可移植性(經過方言);
五、使用Hibernate的基本流程是:配置Configuration對象、產生SessionFactory、獲取/建立Session對象,啓動事務,完成CRUD操做,提交事務,關閉Session對象;
六、使用Hibernate時,先要配置hibernate.cfg.xml文件,其中配置數據庫鏈接信息和方言等,還要爲每一個實體配置相應的hbm.xml文件,hibernate.cfg.xml文件中須要登記每一個hbm.xml文件。
一、update針對的是已存在的實體對象,數據庫中若是沒有實體所對應的數據記錄,將會拋出異常;
二、saveOrUpdate()對象存在與否都不會有任何影響,有則更新,沒則插入。
一、瞬時態:用new建立的對象,它沒有被持久化,沒有處於Session中,處於此狀態的對象叫臨時對象;
二、持久態:已經持久化,擁有持久化標識,在數據庫中有一條對應的數據;同時它處於Session上下文中。如經過Session的save方法,能夠將對象從瞬時態轉換爲持久態;從數據庫中加載出來的數據也是持久態的,關聯加載出的對象也是持久態的。
三、遊離態(託管態): 持久化對象脫離了Session以後就是遊離態,Session緩存被清空後的對象。特色:曾經被持久化,擁有持久化標識,在數據庫中有對應的數據條目,但不在Session緩存中。處於此狀態的對象叫遊離對象;遊離態的對象經過Session的saveOrUpdate或者update方法從新回到持久態。
一、get()採用當即加載方式;而load()採用延遲加載;
二、get()方法執行的時候,會當即向數據庫發出查詢語句,而load()方法返回的是一個代理(此代理中只有一個id屬性),只有等真正使用該對象屬性的時候,纔會發出sql語句;
三、若是數據庫中沒有對應的記錄,get()方法返回的是null。而load()方法出現異常ObjectNotFoundException 。
一、Hibernate是一個全自動的orm映射工具,它能夠自動生成sql語句;ibatis須要咱們本身在xml配置文件中寫sql語句,hibernate要比ibatis功能負責和強大不少。由於hibernate自動生成sql語句,咱們沒法控制該語句,咱們就沒法去寫特定的高效率的sql。對於一些不太複雜的sql查詢,hibernate能夠很好幫咱們完成,可是,對於特別複雜的查詢,hibernate就很難適應了,這時候用ibatis就是不錯的選擇,由於ibatis仍是由咱們本身寫sql語句;
二、相同點:屏蔽jdbc api的底層訪問細節,使用咱們不用與jdbc api打交道,就能夠訪問數據。
三、jdbc api編程流程固定,還將sql語句與java代碼混雜在了一塊兒,常常須要拼湊sql語句,細節很繁瑣。
四、ibatis的好處:屏蔽jdbc api的底層訪問細節;將sql語句與java代碼進行分離;提供了將結果集自動封裝稱爲實體對象和對象的集合的功能,queryForList返回對象集合,用queryForObject返回單個對象;提供了自動將實體對象的屬性傳遞給sql語句的參數。
一、按照如下思路來回答:(1)首先說清楚什麼是緩存,(2)再說有了hibernate的Session就是一級緩存,即有了一級緩存,爲何還要有二級緩存,(3)最後再說如何配置Hibernate的二級緩存。
2.一、緩存就是把之前從數據庫中查詢出來和使用過的對象保存在內存中,當之後要使用某個對象時,先查詢緩存中是否有這個對象,若是有則使用緩存中的對象,若是沒有則去查詢數據庫,並將查詢出來的對象保存在緩存中,以便下次使用。
2.二、Hibernate中Session內置了一種緩存,咱們一般將之稱爲Hibernate的一級緩存(Session級別的),當想使用session從數據庫中查詢出一個對象時,Session也是先從本身內部查看是否存在這個對象,存在則直接返回,不存在纔去訪問數據庫,並將查詢的結果保存在本身內部。因爲Session表明一次會話過程,一個Session與一個數據庫鏈接相關連,因此Session最好不要長時間保持打開,一般僅用於一個事務當中,在事務結束時就應關閉。
2.三、二級緩存是SessionFactory級別的緩存,能被此SessionFactory裏的全部Session共享。多個廠商和組織都提供有緩存產品,例如,EHCache和OSCache等等。在Hibernate中使用二級緩存,首先就要在hibernate.cfg.xml配置文件中配置使用哪一個廠家的緩存產品,接着須要配置該緩存產品本身的配置文件,最後要配置Hibernate中的哪些實體對象要歸入到二級緩存的管理中。
一、AOP爲Aspect Oriented Programming的縮寫,意爲:面向切面編程(也叫面向方面),能夠經過預編譯方式和運行期動態代理實如今不修改源代碼的狀況下給程序動態統一添加功能的一種思想。
二、利用AOP能夠對業務邏輯的各個部分進行隔離,從而使得業務邏輯各部分之間的耦合度下降,提升程序的可重用性,同時提升了開發的效率。 當項目中須要編寫大量相同功能重複代碼時,能夠考慮使用AOP的形式來實現。如聲明式事務管理、權限校驗等。
備註:若是面試官問你是否用過AOP,必定要說用過(Spring的事務處理機制就是AOP的思想來實現的)——很是重要!!!
1、 IOC:原來咱們對依賴的對象的建立是由主對象來完成的,如今由IOC容器來建立對象並管理對象間的依賴關係,由於控制權從本質上發生了轉變,因此咱們稱之爲控制反轉。(這樣帶來的好處是,下降代碼的耦合度,更加符合開閉原則;)
2、 DI和IOC是相同的概念,不一樣的表述,它側重描述了容器的行爲——建立對象併爲對象裝配其依賴的對象。
備註:學生須要知道怎麼在配置文件裏配置相關信息,面試官可能會問。
一、Set注入
二、構造器注入
一、singleton