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。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章