1. 程式人生 > >Java基礎、Java集合、多執行緒、JDBC、HTTP、JSP、Servlet、Struts面試題彙總(附答案)

Java基礎、Java集合、多執行緒、JDBC、HTTP、JSP、Servlet、Struts面試題彙總(附答案)

[Java基礎]
1.”==”和equals方法有什麼區別?
答:==是運算子,equals是方法,方法可以通過重寫改變其行為,如String的equals就是比較字串內容。

2. switch語句能否作用在byte上,能否作用在long上,能否作用在String上?
答: 在Java7之前,switch只能支援 byte、short、char、int或者其對應的封裝類以及Enum型別,在Java7中可以支援String。

3. Integer與int的區別?
答:Integer為包裝類,int是基本資料型別。包裝類擁有方法和屬性,基本資料型別不具備。包裝類可以通過intValue來轉換成基本資料型別,也可以通過new Integer()將基本資料型別轉換為包裝類。在JDK1.5後,包裝類和基本資料型別可以實現自動轉換。

4.try {}裡有一個return語句,那麼緊跟在這個try後的finally {}裡的code會不會被執行,什麼時候被執行,在return前還是後?
答: finally在return之前執行。

5.final, finally, finalize的區別。
final用於宣告屬性,方法和類,分別表示屬性不可變,方法不可覆蓋,類不可繼承。
finally是異常處理語句結構的一部分,無論是否異常該部分程式碼總是執行。
finalize是Object類的一個方法,在垃圾收集器執行的時候會呼叫被回收物件的此方法。

[Java集合]
1.ArrayList、Vector、LinkedList的儲存效能和特性?
ArrayList和Vector都是使用陣列方式儲存資料,索引資料快而插入/刪除資料慢;Vector相對ArrayList是執行緒安全的,所以效能要低一些;而LinkedList使用雙向連結串列實現儲存,插入/刪除資料快而索引資料慢。

2.如何對List進行排序?
使用java.util.Collections的sort靜態方法。一種方法是傳入一個Comparator物件,另一種方法是List中的物件實現Comparable。

[多執行緒]
1.synchronized和java.util.concurrent.locks.Lock的異同?
兩者功能類似,都是用來控制執行緒同步。Lock能完成synchronized所實現的所有功能。Lock需要在finally程式碼中釋放鎖,synchronized會自動釋放鎖。

2.sleep() 和 wait() 有什麼區別?
sleep是執行緒類(Thread)的方法,傳入引數是毫秒數,執行緒暫停休眠一段時間,到時後會自動恢復,sleep不會釋放物件鎖。
wait是Object類的方法,對此物件呼叫wait方法導致本執行緒放棄物件鎖並等待,只有此物件呼叫notify或notifyAll後本執行緒才再次獲得物件鎖,並執行。

[JDBC]
1.JDBC連線資料庫為什麼需要Class.forName(“com.mysql.jdbc.Driver”)?
為了執行Driver中的static程式碼段,裡面註冊驅動的程式碼DriverManager.registerDriver(new Driver())。

2.Statement和PreparedStatement有什麼區別?
PreparedStatement是預編譯的SQL,多次執行效率高。
PreparedStatement可以設定引數,且不用考慮引數中的特殊符號,Statement則要拼SQL字串,要考慮特殊符號。
PreparedStatement由於是設定引數而不是拼SQL,可以有效防止SQL注入。

3.什麼是資料庫事務?JDBC如何實現事務?

資料庫事務(Database Transaction) ,是指一系列原子性的操作,要麼完整地執行,要麼完全地不執行。
開始時:connection.setAutoCommit(false);
出現異常時回滾事務:connection.rollback();
提交事務:connection.commit();

[HTTP]
1.GET和POST有什麼區別?
GET請求引數會在位址列顯示,POST不會。POST提交的資料可以比GET更大,型別更多,例如上傳檔案需要用POST。POST更安全。
本質的區別是,GET請求一般沒有請求body,引數直接寫在URL中,POST請求引數在請求body中。

2.Session和Cookie區別。
Cookie儲存在客戶端,而Session儲存在伺服器上。
Session一般是通過Cookie中新增一項sessionid來實現功能,但是如果客戶端禁用Cookie的話,也可以將sessionid寫在url中。
Session一般關閉瀏覽器後再開啟就無效了,實際上是因為Cookie中的Sessionid失效而不是伺服器儲存的Session失效。
Session可以用來做登陸後保持登陸狀態,Cookie可以做例如一個月自動登陸這樣的功能。

[Servlet/JSP]
1. Servlet生命週期。
init初始化,整個生命週期只調用一次。
service處理請求,每次請求呼叫一次。
destroy銷燬, 整個生命週期只調用一次。

2.JSP內建物件。
request:請求。
response:響應。
out:向客戶端寫資料的輸出流。
page:該JSP生成的Servlet例項,也就是this,page==this。
session:客戶端和伺服器的會話。
application:存放全域性變數,實現使用者間資料共享。
pageContext:可以通過它獲取到其他內建物件,它的Attribute只能在被頁面訪問。
config:Servlet初始化引數。
exception:異常。

3.JSP四大屬性範圍。
pageContext:作用域是當前頁面。
request:作用域是一次請求。
session:作用域是一個客戶端會話。
application:作用域是整個應用,所有使用者共享。

4.JSP和Servlet的相同和不同。
相同:
JSP本質上是Servlet。
不同:
用法不同,在MVC模式中,Servlet用來做控制器,用於處理使用者請求和業務邏輯,再跳轉到相應的JSP,JSP一般用來做頁面顯示。

5.redirect和forward的區別。
redirect是伺服器發給客戶端一個狀態碼為3XX的響應,由客戶端負責跳轉,所以瀏覽器位址列顯示的是跳轉後的地址。
forward又叫轉發,是伺服器內部的跳轉,客戶端是不知道的,所以瀏覽器位址列顯示的是跳轉前的地址。

6.JSP兩種include有什麼區別?
include指令:<%@include file=”MyJsp.jsp” %>
可以引用各種文字檔案,包括jsp檔案,只是單純的將檔案合併,生成Servlet。file是隻檔案路徑,必須是實實在在的檔案。
jsp:include標籤:<jsp:include page=”MyJsp.jsp” flush=”true”></jsp:include>
不是簡單的文字合併,而是兩個獨立的頁面。可以理解為將這個頁面的執行結果引用進來。page是頁面地址,例如可以是Servlet,所以不一定是一個存在的檔案,而是一個可以訪問的地址。它當然還能帶引數,但是include指令不能。

[Struts]
1.Struts 1和Struts 2有什麼區別?
Struts 1的Action只有一個例項來處理請求,需要考慮執行緒安全問題,Struts 2為每個請求生成一個Action例項,不需要考慮多執行緒問題;
Struts 1依賴Servlet API,Struts 2不依賴Servlet API便於單獨測試;
Struts 1採用ActionForm獲取引數,Struts 2直接使用Action獲取引數;
Struts 1使用Servlet實現,Struts 2使用過濾器實現。

2.Struts 2 result type。
dispatcher:預設,forward到jsp頁面;
chain:forward到另一個Action;
redirect:重定向到jsp頁面;
redirectAction:重定向到另一個Action;
另外還有其他的型別比如freemarker等。

3.Struts 2如何實現Ajax。
方法1:在Action的一個方法中直接獲取HttpServletResponse,通過輸出流直接將結果out.print,缺點是和Servlet API耦合度高,優點是靈活自由。
方法2:設定result type為stream,通過字元流的方式將字串設定響應字串,Struts 2推薦的方法。
方法3:使用json外掛,設定result type為json。