1.JDK和JRE的區(qū)別:
JDK是Java Development Kit。是面向開發(fā)人員使用的SDK,提供了java的開發(fā)環(huán)境以及運(yùn)行環(huán)境。
JRE是Java Runtime Enviroment。是指java的運(yùn)行環(huán)境,是面向java程序得使用者,而不是開發(fā)者。
2.序列化的目的:
Java中,一切都是對象,在分布式環(huán)境中經(jīng)常需要將Object從這一端網(wǎng)絡(luò)或設(shè)備傳遞到另一端。這就需要有一種可以在兩端傳輸數(shù)據(jù)的協(xié)議。Java序列化機(jī)制就是為了解決這個(gè)問題而產(chǎn)生。
以某種存儲(chǔ)形式使自定義對象持久化。
將對象從一個(gè)地方傳到另一個(gè)地方。
3.equals和==的區(qū)別:
基本數(shù)據(jù)類型應(yīng)該用“==”來比較他們的值。
當(dāng)比較對象時(shí)候,如果對象里重寫了equals方法,比如String,Integer,Date這些類,比較對象的內(nèi)存地址應(yīng)該用“==”,比較對象的值用“equals”,如果沒有重寫equals方法,兩者本質(zhì)上是相同的,都是比較值。
4.什么時(shí)候使用Comparator and Comparable 接口
當(dāng)需要排序的集合或數(shù)組不是單純的數(shù)字類型的時(shí)候,通常可以使用Comparator或Comparable,以簡單的方式實(shí)現(xiàn)對象排序和自定義排序。
Comparable用在對象本身,說明這個(gè)對象是可以被比較的,也就是說可以被排序的。(String和Integer之所以可以比較大小,是因?yàn)樗鼈兌紝?shí)現(xiàn)了Comparable接口,并實(shí)現(xiàn)了compareTo()方法)。
Compator用在對象外,相當(dāng)于定義了一個(gè)排序算法。
5.轉(zhuǎn)發(fā)和重定向的區(qū)別:
轉(zhuǎn)發(fā)時(shí)URL不會(huì)改變,request請求內(nèi)的對象將可以繼續(xù)使用,重定向時(shí)瀏覽器URL會(huì)改變,之前的request會(huì)丟失,因此request里的數(shù)據(jù)也不會(huì)得到。
通常情況下轉(zhuǎn)發(fā)速度更快,而且能保持request內(nèi)的對象,但是轉(zhuǎn)發(fā)之后,瀏覽器的連接還在先前頁面所以可以重載先前頁面。
轉(zhuǎn)發(fā):request.getRequestDispatcher("apage.jsp").forward(request, response);
重定向:response.sendRedirect("apage.jsp");
6.編譯期異常和運(yùn)行時(shí)異常
編譯時(shí)異常可以捕捉,比如我們讀寫文件時(shí)候會(huì)拋出IOException,操作數(shù)據(jù)庫時(shí)會(huì)有SQLException,運(yùn)行時(shí)異常不可以捕捉,比如數(shù)組下標(biāo)溢出,空指針異常等
7.Struts1原理和Struts2原理以及區(qū)別和聯(lián)系,在什么項(xiàng)目中用過,有什么體會(huì)?
struts1原理:客戶端發(fā)送HttpServletRequest請求給ActionServlet,ActionServlet會(huì)檢索和用戶請求匹配的ActionMapping實(shí)例,如果不存在就返回請求路徑無效的信息,如果存在就會(huì)把請求的表單數(shù)據(jù)保存到ActionForm中去,如果ActionForm不存在就會(huì)創(chuàng)建一個(gè)ActionForm對象,然后再根據(jù)配置信息決定是否需要表單驗(yàn)證,如果需要驗(yàn)證就調(diào)用ActionForm的validate()方法,驗(yàn)證通過后ActionServlet根據(jù)ActionMapping實(shí)例包含的映射信息決定將請求轉(zhuǎn)發(fā)給哪個(gè)Action,如果相應(yīng)的Action實(shí)例不存在就先創(chuàng)建這個(gè)Action然后調(diào)用Action的execute()方法。Action的execute()方法返回一個(gè)ActionForward對象,ActionServlet再把客戶請求轉(zhuǎn)發(fā)給ActionForward對象指向的jsp組件。
struts2原理:客戶端發(fā)送HttpServletRequest請求,請求被提交到一系列的Filter,首先是ActionContextCleanUp,然后是其他Filter,最后是FilterDispatcher。FilterDispatcher是Struts2的核心,就是MVC的Struts2實(shí)現(xiàn)中控制層的核心。FilterDispatcher詢問ActionMapper決定需要調(diào)用哪個(gè)Action,F(xiàn)ilterDispatcher會(huì)把請求交給ActionProxy,ActionProxy會(huì)根據(jù)Struts.xml配置文件找到需要調(diào)用的Action類。ActionProxy創(chuàng)建一個(gè)ActionInvocation實(shí)例,同時(shí)ActionInvocation通過代理模式調(diào)用Action類,調(diào)用之前會(huì)加載Action相關(guān)的所有攔截器,一旦Action執(zhí)行完畢,ActionInvocation根據(jù)Struts.xml配置文件返回對應(yīng)的result。
區(qū)別:1.Struts1是通過Servlet啟動(dòng)的,struts1要求Action繼承一個(gè)抽象類,而不是接口,Struts2的Action類可以實(shí)現(xiàn)一個(gè)Action接口也可以實(shí)現(xiàn)其他接口。
2.struts1的Action是單例模式線程是不安全的,struts2是線程安全的,Action為每一個(gè)請求都生成了一個(gè)實(shí)例。
3.struts1是以ActionServlet為核心控制器,struts2是以FilterDispatcher為核心控制器。
執(zhí)行流程:
a)struts1
jsp發(fā)起httprequest請求->servlet捕獲->struts.xml->namespace+ActionName-> Action->填充表單setXxx()->action.execute()->”success”->Result->設(shè)置request屬性->跳轉(zhuǎn)目標(biāo)頁
b) Action(jsp發(fā)起httprequest請求,被過濾器捕獲)->FilterDispatcher->struts.xml->namespace+ActionName->new Action->填充表單setXxx()->action.execute()->”success”->Result->設(shè)置request屬性->跳轉(zhuǎn)目標(biāo)頁
8.spring原理
spring的最大作用ioc/di,將類與類的依賴關(guān)系寫在配置文件中,程序在運(yùn)行時(shí)根據(jù)配置文件動(dòng)態(tài)加載依賴的類,降低的類與類之間的藕合度。它的原理是在applicationContext.xml加入bean標(biāo)記,在bean標(biāo)記中通過class屬性說明具體類名、通過property標(biāo)簽說明該類的屬性名、通過constructor-args說明構(gòu)造子的參數(shù)。其一切都是反射,當(dāng)通過applicationContext.getBean(“id名稱”)得到一個(gè)類實(shí)例時(shí),就是以bean標(biāo)簽的類名、屬性名、構(gòu)造子的參數(shù)為準(zhǔn),通過反射實(shí)例對象,喚起對象的set方法設(shè)置屬性值、通過構(gòu)造子的newInstance實(shí)例化得到對象。正因?yàn)閟pring一切都是反射,反射比直接調(diào)用的處理速度慢,所以這也是spring的一個(gè)問題。
spring第二大作用就是aop,其機(jī)理來自于代理模式,代理模式有三個(gè)角色分別是通用接口、代理、真實(shí)對象。代理、真實(shí)對象實(shí)現(xiàn)的是同一接口,將真實(shí)對象作為代理的一個(gè)屬性,向客戶端公開的是代理,當(dāng)客戶端調(diào)用代理的方法時(shí),代理找到真實(shí)對象,調(diào)用真實(shí)對象方法,在調(diào)用之前之后提供相關(guān)的服務(wù),如事務(wù)、安全、日志。其名詞分別是代理、真實(shí)對象、裝備、關(guān)切點(diǎn)、連接點(diǎn)。
9.簡要概述一下SpringMVC和StrutsMVC
Spring的MVC框架主要由DispatcherServlet、處理器映射、處理器、視圖解析器、視圖組成。
1)DispatcherServlet接收到請求后,根據(jù)對應(yīng)配置文件中配置的處理器映射,找到對應(yīng)的處理器映射項(xiàng)(HandlerMapping),根據(jù)配置的映射規(guī)則,找到對應(yīng)的處理器(Handler)。
2)調(diào)用相應(yīng)處理器中的處理方法,處理該請求,處理器處理結(jié)束后會(huì)將一個(gè)ModelAndView類型的數(shù)據(jù)傳給DispatcherServlet,這其中包含了處理結(jié)果的視圖和視圖中要使用的數(shù)據(jù)。
3)DispatcherServlet 根據(jù)得到的ModelAndView中的視圖對象,找到一個(gè)合適的ViewResolver(視圖解析器),根據(jù)視圖解析器的配 置,DispatcherServlet將視圖要顯示的數(shù)據(jù)傳給對應(yīng)的視圖,最后給瀏覽器構(gòu)造一個(gè)HTTP響應(yīng)。
DispatcherServlet是整個(gè)Spring MVC的核心。它負(fù)責(zé)接收HTTP請求組織協(xié)調(diào)Spring MVC的各個(gè)組成部分。其主要工作有以下三項(xiàng):
1)截獲符合特定格式的URL請求。
2)初始化DispatcherServlet上下文對應(yīng)的WebApplicationContext,并將其與業(yè)務(wù)層、持久化層的WebApplicationContext建立關(guān)聯(lián)。
3)初始化Spring MVC的各個(gè)組成組件,并裝配到DispatcherServlet中。
StrutsMVC
1.當(dāng)啟動(dòng)容器時(shí),容器(tomcat、weblogic)實(shí)例化ActionServlet,初始化ActionServlet,在初始化
ActionServlet時(shí)加載struts-config.xml文件。
2.當(dāng)客戶通過url.do將請求發(fā)給ActionServlet,ActionServlet將處理轉(zhuǎn)發(fā)給助手RequestProcessor,RequestProcess通過struts-config.xml找到對應(yīng)的actionForm及 action,如果有ActionForm用已有的,沒有通過類的反射實(shí)例化一個(gè)新的ActionForm,放置到作用域?qū)ο螅ㄟ^反射
- 將表單域的值填充到actionForm中。如果有Action用已有的,沒有產(chǎn)生一個(gè)新的,通過反射調(diào)用action實(shí)例的execute方法,在執(zhí)行前將actionForm通過參數(shù)注入到execute方法中。
- 3.execute方法執(zhí)行結(jié)束前通過actionMapping找到actionForward轉(zhuǎn)發(fā)到另一個(gè)頁面。
10.Servlet的工作原理、生命周期
Servlet的工作原理:
Servlet 生命周期:Servlet 加載--->實(shí)例化--->服務(wù)--->銷毀。 init():在Servlet的生命周期中,僅執(zhí)行一次init()方法。它是在服務(wù)器裝入Servlet時(shí)執(zhí)行的,負(fù)責(zé)初始化Servlet 對象。可以配置服務(wù)器,以在啟動(dòng)服務(wù)器或客戶機(jī)首次訪問Servlet時(shí)裝入Servlet。無論有多少客戶機(jī)訪問Servlet,都不會(huì)重復(fù)執(zhí)行 init()。 service():它是Servlet的核心,負(fù)責(zé)響應(yīng)客戶的請求。每當(dāng)一個(gè)客戶請求一個(gè)HttpServlet對象,該對象的 Service()方法就要調(diào)用,而且傳遞給這個(gè)方法一個(gè)“請求”(ServletRequest)對象和一個(gè)“響應(yīng)” (ServletResponse)對象作為參數(shù)。在HttpServlet中已存在Service()方法。默認(rèn)的服務(wù)功能是調(diào)用與HTTP請求的方法 相應(yīng)的do功能。 destroy(): 僅執(zhí)行一次,在服務(wù)器端停止且卸載Servlet時(shí)執(zhí)行該方法。當(dāng)Servlet對象退出生命周期時(shí),負(fù)責(zé)釋放占用的資 源。一個(gè)Servlet在運(yùn)行service()方法時(shí)可能會(huì)產(chǎn)生其他的線程,因此需要確認(rèn)在調(diào)用destroy()方法時(shí),這些線程已經(jīng)終止或完成。
Servlet工作原理:
1、首先簡單解釋一下Servlet接收和響應(yīng)客戶請求的過程,首先客戶發(fā)送一個(gè)請求,Servlet是調(diào)用service()方法對請求進(jìn)行響應(yīng) 的,通過源代碼可見,service()方法中對請求的方式進(jìn)行了匹配,選擇調(diào)用doGet,doPost等這些方法,然后再進(jìn)入對應(yīng)的方法中調(diào)用邏輯層 的方法,實(shí)現(xiàn)對客戶的響應(yīng)。在Servlet接口和GenericServlet中是沒有doGet()、doPost()等等這些方法 的,HttpServlet中定義了這些方法,但是都是返回error信息,所以,我們每次定義一個(gè)Servlet的時(shí)候,都必須實(shí)現(xiàn)doGet或 doPost等這些方法。
2、每一個(gè)自定義的Servlet都必須實(shí)現(xiàn)Servlet的接口,Servlet接口中定義了五個(gè)方法,其中比較重要的三個(gè)方法涉及到 Servlet的生命周期,分別是上文提到的init(),service(),destroy()方法。GenericServlet是一個(gè)通用的,不 特定于任何協(xié)議的Servlet,它實(shí)現(xiàn)了Servlet接口。而HttpServlet繼承于GenericServlet,因此 HttpServlet也實(shí)現(xiàn)了Servlet接口。所以我們定義Servlet的時(shí)候只需要繼承HttpServlet即可。
3、Servlet接口和GenericServlet是不特定于任何協(xié)議的,而HttpServlet是特定于HTTP協(xié)議的類,所以 HttpServlet中實(shí)現(xiàn)了service()方法,并將請求ServletRequest、ServletResponse 強(qiáng)轉(zhuǎn)為HttpRequest 和 HttpResponse。
11.OOA、OOD、OOP含義
Object-Oriented Analysis:面向?qū)ο蠓治龇椒?/span>
Object-Oriented Design:面向?qū)ο笤O(shè)計(jì)
Object Oriented Programming:面向?qū)ο缶幊?/span>
OOA是對系統(tǒng)業(yè)務(wù)調(diào)查了解之后根據(jù)面向?qū)ο蟮乃枷脒M(jìn)行系統(tǒng)分析,在OOA分析的基礎(chǔ)上對系統(tǒng)根據(jù)面向?qū)ο蟮乃枷脒M(jìn)行系統(tǒng)設(shè)計(jì),從而能夠直接進(jìn)行OOP面向?qū)ο缶幊獭?/span>
12.mysql分頁查詢
對于有大數(shù)據(jù)量的mysql表來說,使用LIMIT分頁存在很嚴(yán)重的性能問題。
查詢從第1000000之后的30條記錄:
SQL代碼1:平均用時(shí)6.6秒 SELECT * FROM `cdb_posts` ORDER BY pid LIMIT 1000000 , 30
SQL代碼2:平均用時(shí)0.6秒 SELECT * FROM `cdb_posts` WHERE pid >= (SELECT pid FROM `cdb_posts` ORDER BY pid LIMIT 1000000 , 1) LIMIT 30
因?yàn)橐〕鏊凶侄蝺?nèi)容,第一種需要跨越大量數(shù)據(jù)塊并取出,而第二種基本通過直接根據(jù)索引字段定位后,才取出相應(yīng)內(nèi)容,效率自然大大提升。
可以看出,越往后分頁,LIMIT語句的偏移量就會(huì)越大,兩者速度差距也會(huì)越明顯。
實(shí)際應(yīng)用中,可以利用類似策略模式的方式去處理分頁,比如判斷如果是一百頁以內(nèi),就使用最基本的分頁方式,大于一百頁,則使用子查詢的分頁方式。
Oracle查詢:SELECT * FROM (SELECT A.*, ROWNUM RN FROM (SELECT * FROM TABLE_NAME) A WHERE ROWNUM <= 40) WHERE RN >= 21
13.單例模式、工廠模式、代理模式
枚舉實(shí)現(xiàn)單例模式:
public enum Singleton {
/**
* 定義一個(gè)枚舉的元素,它就代表了Singleton的一個(gè)實(shí)例。
*/
uniqueInstance;
/**
* 單例可以有自己的操作
*/
public void singletonOperation(){
//功能處理
}
}
懶漢同步單例模式:
public class LazySingleton {
private static LazySingleton instance = null;
/**
* 私有默認(rèn)構(gòu)造子
*/
private LazySingleton(){}
/**
* 靜態(tài)工廠方法
*/
public static synchronized LazySingleton getInstance(){
if(instance == null){
instance = new LazySingleton();
}
return instance;
}
}
工廠模式:http://www.cnblogs.com/java-my-life/archive/2012/03/28/2418836.html
代理模式:http://yangguangfu.iteye.com/blog/815787
未完待續(xù)...