1.很新的面試題
2.很全的面試題
3.很重點(diǎn)的面試題 框架
Struts2與Struts1的面試題
###1.Struts2與Struts1的聯(lián)系與區(qū)別?為什么要用Struts2?
struts1與struts2都是mvc框架的經(jīng)典實(shí)現(xiàn)模式。
Struts2不是從Struts1升級(jí)而來(lái),而是由WebWork改名而來(lái),而WebWork只是Xwork加了很多WEB攔截器而已
區(qū)別:
1.核心控制器改成了過(guò)濾器(過(guò)濾器比Servlet的級(jí)別要高,因?yàn)槌绦蜻\(yùn)行時(shí)是先進(jìn)入過(guò)濾器再進(jìn)入Servlet)
2.struts1嚴(yán)重依賴于Servlet(因?yàn)樘^(guò)于依賴于api的HttpServletRequest與HttpServletResponse的兩個(gè)參數(shù)),
struts2就則脫離了Servlet的API。
3.管理Action時(shí)struts1是單例模式,struts2是每個(gè)請(qǐng)求產(chǎn)生一個(gè)實(shí)例。
4.在表達(dá)式的支持上struts2不僅有jstl,還有功能更加強(qiáng)大的ognl表達(dá)式。
5.struts1的類型轉(zhuǎn)換是單向的(頁(yè)面到ActionForm),struts2是雙向的(頁(yè)面到Action再到頁(yè)面回顯)
6.校驗(yàn),struts1沒(méi)有針對(duì)具體方法的校驗(yàn),struts2提供了指定某個(gè)方法進(jìn)行效驗(yàn),還有框架校驗(yàn)。
7.struts2提供了攔截器,利用攔截器可以在訪問(wèn)Action之前或之后增加如權(quán)限攔截等功能。
8.struts2提供了全局范圍,包范圍,Action范圍的國(guó)際化資源文件管理實(shí)現(xiàn)。
9.struts2支持多種視圖類型
###2.Struts2的核心是什么,體現(xiàn)了什么思想?
Struts2的核心是攔截器,基本上核心功能都是由攔截器完成,攔截器的實(shí)現(xiàn)體現(xiàn)了AOP(面向切面編程)思想
###3.為何繼承ActionSupport
因?yàn)锳ctionSupport實(shí)現(xiàn)了Action接口,提供了國(guó)際化,校驗(yàn)的功能。
ActionSupport實(shí)現(xiàn)了國(guó)際化功能:因?yàn)樗峁┝艘粋€(gè)getText(String key)方法實(shí)現(xiàn)國(guó)際化,該方法從資源文件上獲取國(guó)際化信息。
Action接口提供了五個(gè)常量(success,error,login,input,none)。
(s?k'ses,er?(r) n?n
###4.模型驅(qū)動(dòng)與屬性驅(qū)動(dòng)是什么 模型驅(qū)動(dòng)使用時(shí)注意什么問(wèn)題
答:模型驅(qū)動(dòng)與屬性驅(qū)動(dòng)都是用來(lái)封裝數(shù)據(jù)的。
1.模型驅(qū)動(dòng):在實(shí)現(xiàn)類中實(shí)現(xiàn)ModelDriven<T>接口使用泛型把屬性類封裝起來(lái),重寫getModel()方法,然后在實(shí)現(xiàn)類里創(chuàng)建一個(gè)屬性類的實(shí)例,
2.屬性驅(qū)動(dòng):在實(shí)現(xiàn)類里定義屬性,生成get與set方法,通過(guò)屬性來(lái)拿值。
###5.Struts2是怎樣進(jìn)行值封裝的?
struts2的值封裝實(shí)際上是采用了ognl表達(dá)式.
###6.Struts2如何進(jìn)行校驗(yàn)
1.每個(gè)Action類有一個(gè)校驗(yàn)文件,命名 Action類名-validation.xml,且與Action類同目錄,這是對(duì)action里面所有的方法進(jìn)行校驗(yàn)。
2.對(duì)Action里面的指定方法做校驗(yàn)使用Action的類名-訪問(wèn)路徑_方法名-validation.xml。
在效驗(yàn)文件里又分為兩種:
字段校驗(yàn):字段用什么校驗(yàn)器來(lái)校驗(yàn)。
非字段校驗(yàn):是用校驗(yàn)器校驗(yàn)什么字段。
###7.談?wù)凷truts2 的國(guó)際化
在struts2中是使用了攔截器來(lái)實(shí)現(xiàn)國(guó)際化。
具體是先配置屬性文件,格式是文件名_語(yǔ)言_國(guó)家名.PRoperties,然后放的位置有Action同包位置,
package位置,全局位置(要在常量里面配置), 然后頁(yè)面通過(guò)s:text或者key屬性去訪問(wèn)
###8.OGNL是什么你在項(xiàng)目中如何使用它
OGNL是:對(duì)象圖形導(dǎo)航語(yǔ)言。
在struts2中的作用:
ognl的實(shí)現(xiàn)關(guān)系:ActionConetxt。
ognl 3個(gè)常用的符號(hào) # $ %
#
1 構(gòu)造map,list集合。 2 取ognl上下文的值。 3 用來(lái)過(guò)濾集合。 $
1 在校驗(yàn)框架中取資源文件中的值。
2 可以在配置文件中傳遞參數(shù)。
%
使用百分號(hào)可以進(jìn)行轉(zhuǎn)義。
###9.Strust2如何訪問(wèn)Servlet API
1:通過(guò)ActionContext可以獲得request,application,session三個(gè)作用域(struts2實(shí)際上是通過(guò)適配器
來(lái)把servlet的api轉(zhuǎn)換為一個(gè)map,并把這些map放在ActionContext里面)。 2:通過(guò)ActionContext的子類ServletActionContext去獲取原滋原味的API。
3:可以通過(guò)實(shí)現(xiàn)ServletRequestAware接口,重寫里面的setServletRequest方法可以獲
得request,實(shí)際上是通過(guò)set的依賴注入。
###10.什么是攔截器 說(shuō)說(shuō)Struts2用攔截器來(lái)干什么 說(shuō)出6個(gè)攔截器來(lái)
解釋:在訪問(wèn)類的某個(gè)方法或者屬性之前執(zhí)行,攔截的是Action的請(qǐng)求,進(jìn)行攔截然后在方法的執(zhí)行前或者之后加入某些操作。
作用:國(guó)際化,權(quán)限,效驗(yàn)等與源代碼無(wú)關(guān)的操作。
攔截器:
國(guó)際化,表單重復(fù)提交,類型轉(zhuǎn)換,自動(dòng)裝配,數(shù)據(jù)封裝,異常處理,模型驅(qū)動(dòng),請(qǐng)求參數(shù),處理類型轉(zhuǎn)換錯(cuò)誤,日志攔截器。
###11.如何實(shí)現(xiàn)自定義攔截器? 需要注意什么?
實(shí)現(xiàn):
1.可以實(shí)現(xiàn)Interceptor接口,重寫doIntercept方法指定某個(gè)方法進(jìn)行攔截,或者繼承AbstractInterceptor類,重寫intercept方法。
2.在xml配置文件中定義自定義攔截器,然后注入到攔截器棧中,再把攔截器引用到action中。
3.可以配置到某個(gè)action單獨(dú)使用,也可以配置到包下面的所有action使用。 注意:
要把默認(rèn)的攔截器棧重新引用,否則會(huì)被覆蓋。
###12. ActionContext是用來(lái)干什么的
ActionContext是Action的上下文。
###13.為什么要繼承默認(rèn)的包?
因?yàn)樵赟trtus2里面默認(rèn)有很多的常量,攔截器,還有一些bean,如果繼承默認(rèn)的包,這些默認(rèn)值和常量就會(huì)繼承過(guò)來(lái),
###14.常見(jiàn)的有哪幾種結(jié)果集類型?
dispatcher:指得是轉(zhuǎn)發(fā),默認(rèn)的結(jié)果集類型
redirect:重定向,
redirectAction:重定向到一個(gè)Action
stream:是返回一個(gè)流,一般用在文件下載上面
###15.開(kāi)發(fā)項(xiàng)目時(shí)struts2在頁(yè)面怎樣拿值?
從值棧中或者是ognl的上下文
###16.怎么樣用Struts2進(jìn)行文件的上傳或者下載
上傳:
1.在jsp用了s:file標(biāo)簽,把s:from的enctype 屬性設(shè)置為 multipart/form-data
2.在action里面定義三個(gè)字段 File file ,String [file]ContentType,String [file] FileName
3.用輸出流轉(zhuǎn)化成硬盤上面的文件
下載:
1.在struts.xml中配置result為stream的類型
2.在action定義四個(gè)屬性,默認(rèn)的有個(gè)是InputStream 的類型叫inputStream的,從硬盤上面讀取文件到這個(gè)流賦值即可.
contentType; contentLength; contentDisposition; inputStream;
###17.簡(jiǎn)單講下struts里面的標(biāo)簽,說(shuō)不少于5個(gè)
s:if
s:form
s:url
s:property
s:iterater
###18.默認(rèn)struts2里面的標(biāo)簽取值都是從那里取值的
默認(rèn)都是從OGNL值棧里面取值的
###19.ValueStack分為那兩部分,組成部分是什么,分別怎么訪問(wèn)
分為:
對(duì)象棧和ContextMap
訪問(wèn):
1.對(duì)象棧前臺(tái)可以直接訪問(wèn)
2.ContextMap訪問(wèn)的時(shí)候前面加#
###20.標(biāo)簽<s:property>和el表達(dá)式有什么區(qū)別,
相同:
都可以從值棧里面取值
區(qū)別:
el表達(dá)式只能取屬性有g(shù)et set方法的簡(jiǎn)單數(shù)據(jù)類型
s:property標(biāo)簽:取得數(shù)組的一些方法等復(fù)雜數(shù)據(jù)對(duì)象類型
###21.說(shuō)下重復(fù)提交的解決思路,Struts2是怎么樣解決重復(fù)提交的
1.在頁(yè)面表單域加入一個(gè)隱藏的s:token字段,然后在session里面也加入同樣的值
2.當(dāng)用戶第一次請(qǐng)求的時(shí)候,把request的值和session對(duì)比,相同就通過(guò)請(qǐng)求,執(zhí)行下面攔截器,并且移除Session里面的值
3.如果第二次請(qǐng)求時(shí)候,Session已經(jīng)沒(méi)有這個(gè)值,那么就阻斷當(dāng)前請(qǐng)求,定位重復(fù)提交 Struts2是通過(guò)s:token標(biāo)簽來(lái)完成重復(fù)提交思路的
spring的面試題部分
###1.Spring的aop你怎樣實(shí)現(xiàn)?
用動(dòng)態(tài)代理和cglib實(shí)現(xiàn),有接口的用動(dòng)態(tài)代理,無(wú)接口的用cglib
###2.Spring在SSH起什么作用
為大部分框架提供模版,常見(jiàn)的核心類提供初始化,并且整合三層框架
###3.Spring容器內(nèi)部怎么實(shí)現(xiàn)的
內(nèi)部用Map實(shí)現(xiàn),或者說(shuō)HashMap
###4.怎么樣理解IOC與AOP
IOC是一種控制反轉(zhuǎn)的思想,降低了對(duì)象的耦合度,AOP是面向切面編程,非侵入式編程,實(shí)現(xiàn)了非業(yè)務(wù)性編程(公共功能),譬如日志,權(quán)限,事務(wù)等等
###5.Spring的事務(wù),事務(wù)的作用。
Spring里面的事務(wù)分為編程式事務(wù)和聲明式事務(wù),一般用聲明式事務(wù),用來(lái)控制數(shù)據(jù)操作的完整性,一致性
###6.Spring的IOC和AOP你在項(xiàng)目中是怎么使用的?
IOC主要來(lái)解決對(duì)象之間的依賴問(wèn)題,把所有的bean的依賴關(guān)系通過(guò)配置文件或者注解關(guān)聯(lián)起來(lái),降低了耦合度,AOP一般用來(lái)整合框架時(shí)候都可以用得到,
事務(wù)用的最多,還有個(gè)別日志,權(quán)限功能也可以用到
###7Spring主要使用了什么模式?
工廠模式-->每個(gè)Bean的創(chuàng)建通過(guò)方法
單例模式-->默認(rèn)的每個(gè)Bean的作用域都是單例
代理模式-->關(guān)于AOP的實(shí)現(xiàn)是通過(guò)代理,體現(xiàn)代理模式
###8.Spring bean的作用域.
Scope作用域有4種,常見(jiàn)的有單例或者多例,默認(rèn)是單例
###9.Spring的事務(wù)是如何配置的?
1.先配置事務(wù)管理器TransactionManager,不同的框架有不同屬性
2.再配置事務(wù)通知和屬性,通過(guò)tx:advice
3.配置<aop:config>,設(shè)置那些方法或者類需要加入事務(wù)
###10.Spring的配置文件最好使用什么文件?
xml,因?yàn)樗亲詈?jiǎn)單,最流行的數(shù)據(jù)格式
###11.你使用過(guò)Spring中的哪些技術(shù)?
bean的管理,AOP技術(shù),IOC技術(shù) ,事務(wù)等
###12.為什么要用Spring
降低對(duì)象耦合度,讓代碼更加清晰,提供一些常見(jiàn)的模版
###13.說(shuō)下Spring的注解
1.bean的標(biāo)記注解
@Component 通用注解 @Repository 持久層注解 @Service 業(yè)務(wù)層注解 @Controller:表現(xiàn)層注解
2.bean的自動(dòng)裝配注解
稱
@AutoWired 默認(rèn)是按照類型裝配,如果有多個(gè)類型實(shí)現(xiàn)可以用Qualifier來(lái)指定名
@Resource 默認(rèn)是按照名稱來(lái)裝配,是JDK里面自帶的注解,默認(rèn)情況下用@AutoWired注解
###15.寫過(guò)類似Spring AOP的操作嗎?
簡(jiǎn)單的寫過(guò),譬如前置通知,后置通知的方法,環(huán)繞通知,事務(wù)就是典型的AOP的實(shí)現(xiàn)
###16.Spring中的AOP在你項(xiàng)目中是怎么使用的,用在哪里?
Struts2和Hibernate整合時(shí)候都可以用得到, 事務(wù)用的最多,還有個(gè)別日志,權(quán)限功能也可以用到
###17.Spring的事務(wù)(傳播屬性,隔離級(jí)別)。
七大傳播屬性,四大隔離級(jí)別
###19.Spring DI的幾種方式
setter注入和構(gòu)造器注入,一般用setter注入
###20.依賴注入的原理
就是通過(guò)反射機(jī)制生成想要的對(duì)象注入
###21.說(shuō)一下整合Spring的核心監(jiān)聽(tīng)器。
這個(gè)是在SSH整合的時(shí)候使用,是整個(gè)WEB項(xiàng)目啟動(dòng)的時(shí)候初始化Spring的容器. 具體是在web.xml里面配置的ContextLoaderListener
Spring配置文件中的核心是個(gè)監(jiān)聽(tīng)器,是用來(lái)初始化Spring的容器
###22.Spring你們?yōu)槭裁从门渲梦募皇褂米⒔?
配置文件耦合度低,容易維護(hù),尤其是在切面或者事務(wù)的時(shí)候,只配置一次就可以讓很多代碼擁有事務(wù),
###23.Spring和Hibernate的事務(wù)有什么區(qū)別?
Spring的事務(wù)提供了統(tǒng)一的事務(wù)處理機(jī)制,包含了JDBC,Hibernate,IBatis等事務(wù)實(shí)現(xiàn),而Hibernate只處理自己事務(wù)
###24.Struts2與Spring整合先啟動(dòng)那個(gè)容器。
先啟動(dòng)監(jiān)聽(tīng)器,因?yàn)橄纫跏蓟萜?初始化容器了以后Action才能從容器里面獲得
###26.讓你寫Spring的容器,你是怎樣實(shí)現(xiàn)的?
我們可以寫一個(gè)HashMap,如果并發(fā)考慮的話要寫并發(fā)的Map,把bean的名字放在map的key,bean的實(shí)現(xiàn)map的value
###27.談?wù)凷pring的IOC和AOP,如果不用Spring,怎么去實(shí)現(xiàn)這兩個(gè)技術(shù)。
ioc用反射實(shí)現(xiàn) ,AOP用動(dòng)態(tài)代理實(shí)現(xiàn)
###28.Spring事務(wù)和Hibernate事務(wù)的操作上面的區(qū)別?
hibernate的事務(wù)只能手動(dòng)顯示代碼的方式控制創(chuàng)建事務(wù)與提交事務(wù)以及回滾。
Spring可以通過(guò)配置文件設(shè)定一類class事務(wù)的創(chuàng)建與提交以及回滾,也可以顯示代碼方式控制。
###29.講下Spring的七大事務(wù)傳播
有七個(gè),常用有兩個(gè)REQUIERD, REQUIRED_NEW,REQUIERD表示兩個(gè)事務(wù)的方法調(diào)用的時(shí)候,前面的時(shí)候和后面的合并成一個(gè)事務(wù),REQUIRED_NEW是重啟一個(gè)事務(wù),各干各的
###30.在同一進(jìn)程里,有A,B兩個(gè)方法都對(duì)不同的表進(jìn)行更新數(shù)據(jù),假如A方法出異常了,若要B方法執(zhí)行,怎樣配置事務(wù)級(jí)別,若不要B方法執(zhí)行,又該怎樣配置?
前者用REQUIRED_NEW,后者用REQUIRED
###31.事務(wù)并發(fā)會(huì)引起什么問(wèn)題,怎么解決
事務(wù)并發(fā)會(huì)引起臟讀,幻讀,不可重復(fù)讀等問(wèn)題,設(shè)定事務(wù)的隔離級(jí)別就可以解決
###32.事務(wù)的隔離級(jí)別
Spring定義有四種,但是常見(jiàn)的是READ_COMMIT,Oralce有兩種實(shí)現(xiàn),MySQL有四種
###33.Spring的IOC容器與工廠類有什么區(qū)別?
IOC(Inversion of Control)對(duì)Bean的控制能力更強(qiáng),能控制對(duì)象自動(dòng)注入,還可以控制生命周期,而工廠類只是簡(jiǎn)單的創(chuàng)建一個(gè)對(duì)象,沒(méi)有什么控制能力
###34.事務(wù)的安全問(wèn)題:鎖機(jī)制的實(shí)現(xiàn)原理及在項(xiàng)目中的使用
鎖有悲觀鎖和樂(lè)觀鎖,悲觀鎖一般假設(shè)每個(gè)人都會(huì)修改數(shù)據(jù),默認(rèn)情況下把數(shù)據(jù)都鎖住,影響性能,但安全性高.
樂(lè)觀鎖是假設(shè)每個(gè)人都只讀下數(shù)據(jù),不會(huì)修改數(shù)據(jù),性能比較高,但是安全性較低,一般通過(guò)增加類似于版本控制里面版本號(hào)來(lái)解決問(wèn)題
###35.講下BeanFactory和ApplicationContext的區(qū)別
BeanFactory是Spring容器頂級(jí)核心接口,比較早,但功能比較少,getBean就是BeanFactory定義的,
ApplicationContext是Spring里面的另外一個(gè)容器頂級(jí)接口,它繼承于BeanFactory,但是提供的功能譬如校驗(yàn),國(guó)際化,監(jiān)聽(tīng),
對(duì)Bean的管理功能比較多,一般使用ApplicationContext
###f-sm-1. 講下SpringMvc和Struts1,Struts2的比較的優(yōu)勢(shì)
性能上Struts1>SpringMvc>Struts2 開(kāi)發(fā)速度上SpringMvc和Struts2差不多,比Struts1要高
###f-sm-2. 講下SpringMvc的核心入口類是什么,Struts1,Struts2的分別是什么
SpringMvc的是DispatchServlet,Struts1的是ActionServlet,Struts2的是StrutsPrepareAndExecuteFilter
###f-sm-3. SpringMvc的控制器是不是單例模式,如果是,有什么問(wèn)題,怎么解決
是單例模式,所以在多線程訪問(wèn)的時(shí)候有線程安全問(wèn)題,不要用同步,會(huì)影響性能的,解決方案是在控制器里面不能寫字段
###f-sm-4. SpingMvc中的控制器的注解一般用那個(gè),有沒(méi)有別的注解可以替代
一般用@Controller注解,表示是表現(xiàn)層,不能用用別的注解代替.
###f-sm-5. @RequestMapping注解用在類上面有什么作用
用于類上,表示類中的所有響應(yīng)請(qǐng)求的方法都是以該地址作為父路徑。
###f-sm-6. 怎么樣把某個(gè)請(qǐng)求映射到特定的方法上面
直接在方法上面加上注解@RequestMapping,并且在這個(gè)注解里面寫上要攔截的路徑 ###f-sm-7. 如果在攔截請(qǐng)求中,我想攔截get方式提交的方法,怎么配置
springMVC模式的面試題部分
可以在@RequestMapping注解里面加上method=RequestMethod.GET
###f-sm-8. 如果在攔截請(qǐng)求中,我想攔截提交參數(shù)中包含"type=test"字符串,怎么配置
可以在@RequestMapping注解里面加上params="type=test"
###f-sm-9. 我想在攔截的方法里面得到從前臺(tái)傳入的參數(shù),怎么得到
直接在形參里面聲明這個(gè)參數(shù)就可以,但必須名字和傳過(guò)來(lái)的參數(shù)一樣
###f-sm-10. 如果前臺(tái)有很多個(gè)參數(shù)傳入,并且這些參數(shù)都是一個(gè)對(duì)象的,那么怎么樣快速得到這個(gè)對(duì)象
直接在方法中聲明這個(gè)對(duì)象,SpringMvc就自動(dòng)會(huì)把屬性賦值到這個(gè)對(duì)象里面 ###f-sm-11. 怎么樣在方法里面得到Request,或者Session
直接在方法的形參中聲明request,SpringMvc就自動(dòng)把request對(duì)象傳入
###f-sm-12. SpringMvc中函數(shù)的返回值是什么.
返回值可以有很多類型,有String, ModelAndView,List,Set等,一般用String比較好,如果是Ajax請(qǐng)求,返回的可以是一個(gè)集合
###f-sm-13. SpringMvc怎么處理返回值的
SpringMvc根據(jù)配置文件中InternalResourceViewResolver(內(nèi)部資源視圖解析器)的前綴和后綴,用前綴+返回值+后綴組成完整的返回值
###f-sm-14. SpringMVC怎么樣設(shè)定重定向和轉(zhuǎn)發(fā)的
在返回值前面加"forward:"就可以讓結(jié)果轉(zhuǎn)發(fā),譬如"forward:user.do?name=method4" 在返回值前面加"redirect:"就可以讓返回值重定向,譬如"redirect:http://www.uu456.com" ###f-sm-15. SpringMvc用什么對(duì)象從后臺(tái)向前臺(tái)傳遞數(shù)據(jù)的
通過(guò)ModelMap對(duì)象,可以在這個(gè)對(duì)象里面用addAttribute()方法,把對(duì)象加到里面,前臺(tái)就可以通過(guò)el表達(dá)式拿到
###f-sm-16. SpringMvc中有個(gè)類把視圖和數(shù)據(jù)都合并的一起的,叫什么
ModelAndView
###f-sm-17. 怎么樣把數(shù)據(jù)放入Session里面
可以聲明一個(gè)request,或者session先拿到session,然后就可以放入數(shù)據(jù),或者可以在類上面加上@SessionAttributes注解,
里面包含的字符串就是要放入session里面的key
###f-sm-18. SpringMvc怎么和AJAX相互調(diào)用的
通過(guò)Jackson框架就可以把java里面的對(duì)象直接轉(zhuǎn)化成Js可以識(shí)別的Json對(duì)象 具體步驟如下 :
1.加入Jackson.jar
2.在配置文件中配置json的映射
3.在接受Ajax方法里面可以直接返回Object,List等,但方法前面要加上@ResponseBody注解
###f-sm-19. 當(dāng)一個(gè)方法向AJAX返回特殊對(duì)象,譬如Object,List等,需要做什么處理
要加上@ResponseBody注解
###f-sm-20. SpringMvc里面攔截器是怎么寫的
有兩種寫法,一種是實(shí)現(xiàn)接口,另外一種是繼承適配器類,然后在SpringMvc的配置文件中配置攔截器即可:
<!-- 配置SpringMvc的攔截器 --> <mvc:interceptors> <!-- 配置一個(gè)攔截器的Bean就可以了 默認(rèn)是對(duì)所有請(qǐng)求都攔截 -->
<bean id="myInterceptor" class="com.et.action.MyHandlerInterceptor"></bean>
<!-- 只針對(duì)部分請(qǐng)求攔截 --> <mvc:interceptor> <mvc:mapping path="/modelMap.do" /> <bean class="com.et.action.MyHandlerInterceptorAdapter" /> </mvc:interceptor> </mvc:interceptors>
###f-sm-21. 講下SpringMvc的執(zhí)行流程
系統(tǒng)啟動(dòng)的時(shí)候根據(jù)配置文件創(chuàng)建spring的容器, 首先是發(fā)送http請(qǐng)求到核心控制器DispatcherServlet,spring容器通過(guò)映射器去尋找業(yè)務(wù)控制器,
使用適配器找到相應(yīng)的業(yè)務(wù)類,在進(jìn)業(yè)務(wù)類時(shí)進(jìn)行數(shù)據(jù)封裝,在封裝前可能會(huì)涉及到類型轉(zhuǎn)換,執(zhí)行完業(yè)務(wù)類后使用ModelAndView進(jìn)行視圖轉(zhuǎn)發(fā),
數(shù)據(jù)放在model中,用map傳遞數(shù)據(jù)進(jìn)行頁(yè)面顯示。
### 1.講下MyBatis和Hibernate的區(qū)別?
MyBatis是JDBC的輕量級(jí)封裝,把Sql和java代碼獨(dú)立出來(lái),性能相對(duì)比較高,寫SQL語(yǔ)句相對(duì)于比較靈活,并且容易調(diào)試,一般用在大型項(xiàng)目中.
Hibernate是JDBC的重量級(jí)封裝,開(kāi)發(fā)速度比較快,但是性能比較低,調(diào)試不方便,一般適合對(duì)進(jìn)度要求的比較高的中小型項(xiàng)目
###2.什么是MyBatis的接口綁定,有什么好處
接口映射就是在IBatis中任意定義接口,然后把接口里面的方法和SQL語(yǔ)句綁定,我們直接調(diào)用接口方法就可以,
這樣比起原來(lái)了SqlSession提供的方法我們可以有更加靈活的選擇和設(shè)置.
###3.接口綁定有幾種實(shí)現(xiàn)方式,分別是怎么實(shí)現(xiàn)的?
接口綁定有兩種實(shí)現(xiàn)方式,一種是通過(guò)注解綁定,就是在接口的方法上面加上@Select MyBatis的面試題部分
@Update等注解里面包含Sql語(yǔ)句來(lái)綁定,另外一種就是通過(guò)xml里面寫SQL來(lái)綁定,在這種情況下,
要指定xml映射文件里面的namespace必須為接口的全路徑名.
###4.什么情況下用注解綁定,什么情況下用xml綁定
當(dāng)Sql語(yǔ)句比較簡(jiǎn)單時(shí)候,用注解綁定,當(dāng)SQL語(yǔ)句比較復(fù)雜時(shí)候,用xml綁定,一般用xml綁定的比較多
###5.MyBatis實(shí)現(xiàn)一對(duì)一有幾種方式?具體怎么操作的
有聯(lián)合查詢和嵌套查詢,聯(lián)合查詢是幾個(gè)表聯(lián)合查詢,只查詢一次,通過(guò)在resultMap里面配置association節(jié)點(diǎn)配置一對(duì)一的類就可以完成;
嵌套查詢是先查一個(gè)表,根據(jù)這個(gè)表里面的結(jié)果的外鍵id,去再另外一個(gè)表里面查詢數(shù)據(jù),也是通過(guò)association配置,但另外一個(gè)表的查詢通過(guò)select屬性配置
###6.如果要查詢的表名和返回的實(shí)體Bean對(duì)象不一致,那你是怎么處理的?
在MyBatis里面最主要最靈活的的一個(gè)映射對(duì)象的ResultMap,在它里面可以映射鍵值對(duì), 默認(rèn)里面有id節(jié)點(diǎn),result節(jié)點(diǎn),它可以映射表里面的列名和對(duì)象里面的字段名. 并且在一對(duì)一,一對(duì)多的情況下結(jié)果集也一定要用ResultMap
###7.MyBatis里面的動(dòng)態(tài)Sql是怎么設(shè)定的?用什么語(yǔ)法?
MyBatis里面的動(dòng)態(tài)Sql一般是通過(guò)if節(jié)點(diǎn)來(lái)實(shí)現(xiàn),通過(guò)OGNL語(yǔ)法來(lái)實(shí)現(xiàn),但是如果要寫的完整,必須配合where,trim節(jié)點(diǎn),
where節(jié)點(diǎn)是判斷包含節(jié)點(diǎn)有內(nèi)容就插入where,否則不插入,trim節(jié)點(diǎn)是用來(lái)判斷如果動(dòng)態(tài)語(yǔ)句是以and 或or開(kāi)始,那么會(huì)自動(dòng)把這個(gè)and或者or取掉
###8.MyBatis在核心處理類叫什么
MyBatis里面的核心處理類叫做SqlSession
###9.IBatis和MyBatis在細(xì)節(jié)上的不同有哪些
在sql里面變量命名有原來(lái)的#變量# 變成了#{變量} 原來(lái)的$變量$變成了${變量}, 原來(lái)在sql節(jié)點(diǎn)里面的class都換名字交type
原來(lái)的queryForObject queryForList 變成了selectOne selectList
原來(lái)的別名設(shè)置在映射文件里面放在了核心配置文件里
###10.講下MyBatis的緩存
MyBatis的緩存分為一級(jí)緩存和二級(jí)緩存,一級(jí)緩存放在session里面,默認(rèn)就有,二級(jí)緩存放在它的命名空間里,
默認(rèn)是打開(kāi)的,使用二級(jí)緩存屬性類需要實(shí)現(xiàn)Serializable序列化接口(可用來(lái)保存對(duì)象的狀態(tài)),可在它的映射文件中配置<cache/>
###11.MyBatis(IBatis)的好處是什么
ibatis把sql語(yǔ)句從Java源程序中獨(dú)立出來(lái),放在單獨(dú)的XML文件中編寫,給程序的
維護(hù)帶來(lái)了很大便利。
ibatis封裝了底層JDBC API的調(diào)用細(xì)節(jié),并能自動(dòng)將結(jié)果集轉(zhuǎn)換成Java Bean對(duì)象,大大簡(jiǎn)化了Java數(shù)據(jù)庫(kù)編程的重復(fù)工作。
因?yàn)镮batis需要程序員自己去編寫sql語(yǔ)句,程序員可以結(jié)合數(shù)據(jù)庫(kù)自身的特點(diǎn)靈活控制sql語(yǔ)句,
因此能夠?qū)崿F(xiàn)比hibernate等全自動(dòng)orm框架更高的查詢效率,能夠完成復(fù)雜查詢。 ###12.MyBatis里面怎么處理分頁(yè)
用插件分頁(yè)
###13.MyBatis里面怎么樣獲得剛插入的主鍵
把insert節(jié)點(diǎn)的useGeneratedKeys=true設(shè)置先生成主鍵,然后keyProperty="id",把生成的主鍵指向?qū)傩?
###1. 為什么要用自定義標(biāo)簽?
①Jsp中寫代碼比較混亂,難以維護(hù)
②把一些重復(fù)的功能都抽取出來(lái),方便復(fù)用。
###2. 自定義標(biāo)簽分為幾個(gè)步驟.
1.編寫標(biāo)簽處理器類(SimpleTagSupport的實(shí)現(xiàn)類)
重寫doTag()
2.編寫標(biāo)簽庫(kù)文件(WEB-INF/xxx.tld)
整個(gè)文件的定義: <short-name> <uri>
標(biāo)簽的定義: <tag>
3.在jsp頁(yè)面使用標(biāo)簽:
導(dǎo)入標(biāo)簽庫(kù)(xxx.tld/)
使用標(biāo)簽
###3. 自定義標(biāo)簽類要繼承哪個(gè)類?
SimpleTagSupport類
sim·ple tag s?'p?rt
###4. 怎么配置自定義標(biāo)簽的屬性
在.tld文件<tag>標(biāo)簽中添加<attribute>,
通過(guò)<name>標(biāo)簽設(shè)定自定義標(biāo)簽的標(biāo)簽名。 JSTL &EL的面試題部分
###5. 為什么要用EL表達(dá)式,有什么好處
1.在頁(yè)面中用js腳本和jsp表達(dá)式來(lái)獲取數(shù)據(jù)顯示比較麻煩
a:需要條件判斷
b:可能需要強(qiáng)轉(zhuǎn)
2.好處是EL表達(dá)式簡(jiǎn)單易用,默認(rèn)可訪問(wèn)所有的JSP隱藏對(duì)象。
###6. EL表達(dá)式的語(yǔ)法是什么?
美元符號(hào)加大括號(hào) ---> ${ EL表達(dá)式 }
###7. EL有哪兩種訪問(wèn)格式,有什么區(qū)別?
EL 提供“.“和“[ ]“兩種運(yùn)算符來(lái)存取數(shù)據(jù)。
當(dāng)要存取的屬性名稱中包含一些特殊字符,如 . 或 - 等并非字母或數(shù)字的符號(hào),就一定要使用“[ ]“。例如:
${ user. My-Name}應(yīng)當(dāng)改為${user["My-Name"]}
如果要?jiǎng)討B(tài)取值時(shí),就可以用“[ ]“來(lái)做,而“.“無(wú)法做到動(dòng)態(tài)取值。例如: ${sessionScope.user[data]}中data 是一個(gè)變量。
###8. EL表達(dá)式中有哪些隱藏對(duì)象,舉幾個(gè)例子?
pageContext : JSP頁(yè)面的上下文
param : 參數(shù)
paramValues : 參數(shù)值
header : 頭信息
headerValues : 頭的值
cookie : 緩存
initParam : 初始化參數(shù)
###9. EL表達(dá)式中怎么樣拿到request,session里面的值?
例 :
可以通過(guò)它的隱藏對(duì)象RequestScope來(lái)獲取到Request范圍的屬性名稱所對(duì)應(yīng)的值。 可以通過(guò)它的隱藏對(duì)象sessionScope來(lái)獲取到session范圍的屬性名稱所對(duì)應(yīng)的值。
###10. EL表達(dá)式怎么樣拿到用戶請(qǐng)求的參數(shù)?
可以用${param.name} 來(lái)獲取用戶請(qǐng)求的參數(shù)
###11. EL表達(dá)式怎么樣得到上下文路徑?
${pageContext.request.contextPath}
###12. EL表達(dá)式怎么樣拿到request?
RequestScope
###13. JSTL全稱是什么?
java服務(wù)器頁(yè)面標(biāo)準(zhǔn)標(biāo)簽庫(kù)
(JavaServer Pages Standard Tag Library)
###14. JSTL是怎么使用的?
將jstl.jar、standard.jar 復(fù)制到 Tomcat 的 WEB-INF/lib 中. 若要在 JSP 網(wǎng)頁(yè)中使用 JSTL 時(shí),一定要先做下面這行聲明: < %@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
主要提供給 Java Web 開(kāi)發(fā)人員一個(gè)標(biāo)準(zhǔn)通用的標(biāo)簽函數(shù)庫(kù)。Web 程序開(kāi)發(fā)人員能夠利用 JSTL 和 EL 來(lái)開(kāi)發(fā) Web 程序,
取代傳統(tǒng)直接在頁(yè)面上嵌入 Java 程序(Scripting)的做法,以提高程序可讀性、維護(hù)性和方便性。
###15. JSTL分為幾個(gè)標(biāo)簽庫(kù)?
①核心標(biāo)簽庫(kù)
②國(guó)際化標(biāo)簽庫(kù)
③數(shù)據(jù)庫(kù)標(biāo)簽庫(kù)
④XML標(biāo)簽庫(kù)
⑤函數(shù)標(biāo)簽庫(kù)
###16. JSTL里面判斷標(biāo)簽是什么?
1. <c:if>
2. <c:choose>
<c:when></c:when>
<c:otherwise></c:otherwise>
</c:choose>
###17. JSTL里面的屬性是否可以從EL表達(dá)式獲取?
可以${xxxScope.attribute}
###18. JSTL里面的循環(huán)標(biāo)簽有幾種,各是怎么用的?
1. <c:forEach> 用于迭代數(shù)字或集合;
2. <c:forTokens> 用于迭代字符串標(biāo)記。
###19.怎么樣得到循環(huán)標(biāo)簽里面的狀態(tài)值,譬如index,count等?
在forEach循環(huán)標(biāo)簽中加入varStatus="s",然后直接用EL表達(dá)式: <c:forEach items="${atts}" var="item" varStatus="s">
<c:if test="${s.last}">
------
</c:if>
index:${s.index}<br/> count:${s.count}<br/> first:${s.first}<br/> last:${s.last}<br/> ${item}<br/><br/> </c:forEach>
###1.為什么要用自定義標(biāo)簽
自定義標(biāo)簽其實(shí)是一個(gè)Java類,他封裝了一些標(biāo)簽代碼,形成一個(gè)
具有某個(gè)功能的新標(biāo)簽。
1.增加了可擴(kuò)展性。
2.增加了可復(fù)用性。
###2.自定義標(biāo)簽分為幾個(gè)步驟.
1.創(chuàng)建標(biāo)簽的處理類(Tag Handler Class)
2.創(chuàng)建標(biāo)簽庫(kù)描述文件(Tag Library Descrptor File)
3.在JSP文件中引入標(biāo)簽庫(kù)
###3.自定義標(biāo)簽類要繼承那個(gè)類
TagSupport
###4.怎么配置自定義標(biāo)簽的屬性
在.tld 文件里配置
集合類面試題
###1.請(qǐng)講下Java里面的容器
分兩大類,Map和Collection。而Collection又有子接口List
(數(shù)據(jù)存儲(chǔ)順序和插入順序是一樣的)、Set(里面的元素具有唯一性)
Map是存儲(chǔ)鍵值對(duì)的,里面的健不可以重復(fù),但值可以重復(fù) List主要有ArrayList和LinkedList兩種實(shí)現(xiàn)。實(shí)現(xiàn)的數(shù)據(jù)結(jié)構(gòu)不同, 所以主要的區(qū)別也都是和數(shù)據(jù)結(jié)構(gòu)相關(guān)的。 ArrayList基于數(shù)組,隨機(jī)訪問(wèn)快, 而對(duì)于中間元素的插入刪除效率比較低,而且需要考慮擴(kuò)容問(wèn)題。 LinkedList,則 基于鏈表,和ArrayList提到的正相反,隨機(jī)訪問(wèn)慢, 但對(duì)于中間元素的插入和刪除更有效率。 Set也是一種Collection,和List比起來(lái)主要體現(xiàn)在元素唯一性。
###2.請(qǐng)說(shuō)下Iterator的作用
迭代器可以實(shí)現(xiàn)Collection接口的方法,可以一個(gè)一個(gè)地獲取集合中的元素 特性:在遍歷集合時(shí) 可判斷是否有下一個(gè)元素
###3.說(shuō)下ArrayList和LinkedList的區(qū)別和聯(lián)系,并說(shuō)明什么情況下用它們
區(qū)別:ArrayList用于對(duì)象的隨機(jī)訪問(wèn)速度快,沒(méi)有順序
LinkedList實(shí)現(xiàn)機(jī)制是鏈表式的,和順序有關(guān),速度比ArrayList慢
--->聯(lián)系:ArrayList和LinkedList都是List接口的實(shí)現(xiàn)類
當(dāng)要快速獲取一個(gè)值時(shí),用ArrayList,用于順序插入操作時(shí),用LinkedList.
###4.說(shuō)下List,Set,Map三種集合各有什么特征
List集合中的元素可以重復(fù),
Set集合中的元素不可以重復(fù)
Map集合用鍵-值映射存放對(duì)象,Map容器中的鍵對(duì)象不能重復(fù),值對(duì)象可以重復(fù)
###5.HashSet和TreeSet有什么區(qū)別,什么時(shí)候用它們
區(qū)別:HashSet中的元素不能重復(fù),沒(méi)有順序
TreeSet中的元素不能重復(fù),但有順序
當(dāng)集合中的元素需要排序時(shí),用TreeSet
一般情況下用HashSet,因?yàn)椴恍枰判?速度比TreeSet快
###6.什么是泛型,怎么使用的,有什么好處?
答案
泛型又分為:方法泛型和類泛型。
定義一個(gè)集合時(shí),可以知道里面定義的是什么類型
使用:在集合類型后面加< 數(shù)據(jù)類型 >
使用泛型后,從集合中取得元素后就不用再用強(qiáng)轉(zhuǎn)
###7.什么是for each循環(huán),它可以循環(huán)那些數(shù)據(jù)類型
答案
通過(guò)對(duì)象拿到集合里的值 可以用來(lái)循環(huán)集合和數(shù)組
###8.寫一個(gè)for each循環(huán)看看
for(Object object : list){
System.out.println(object);
}
###9. 什么是強(qiáng)轉(zhuǎn)怎么寫的,有什么優(yōu)缺點(diǎn),一般要多用還是少用,為什么?
一般在繼承的基礎(chǔ)上用. Person person=new Student(); Student student=(Student)person; 把運(yùn)行期的強(qiáng)轉(zhuǎn)為編譯期的. 編譯期不會(huì)出錯(cuò).運(yùn)行期容易出錯(cuò).所以一般少用
###10.HashMap和Hashtable有什么區(qū)別,一 般情況下常用那個(gè)?
HashMap的鍵-值都可以為空(null)
Hashtable的鍵-值都不可以為空(null),線程安全 ,
一般情況下用HashMap
###11.Hashtable名字為什么沒(méi)有駝峰命名
Hashtable的由來(lái)比較古老,當(dāng)時(shí)還沒(méi)有命名規(guī)范
###12.Collections和Collection有什么區(qū)別
Collections是一個(gè)工具類,可以直接調(diào)用List和Set的方法
Collection是一個(gè)接口,是List和Set集合的父接口
###13.寫出Collections的6個(gè)方法,并詳細(xì)解釋
sort():對(duì)集合進(jìn)行排序
shuffle():打亂集合中的元素順序
addAll():將一個(gè)集合添加到另一個(gè)集合中
max():判斷集合中的最大值
min():判斷集合中的最小值
copy():將一個(gè)集合中的元素復(fù)制到另一個(gè)集合中去
fill():將一個(gè)集合中的元素全部替換成指定的元素
###14.Arrays類是做什么的,寫出它的常用6個(gè)方法
Arrays是數(shù)組的一個(gè)工具類
sort():對(duì)數(shù)組進(jìn)行排序
binarySearch():搜索數(shù)組指定元素的下標(biāo)
copyOf():復(fù)制數(shù)組中指定長(zhǎng)度的元素
deepEquals():比較兩個(gè)數(shù)組的深度
fill():把數(shù)組中的所有元素替換成指定元素
equals():比較指定兩個(gè)數(shù)組的元素是否相等
hashcode():將指定數(shù)組的指定范圍復(fù)制到一個(gè)新數(shù)組。
###15.比較下集合和數(shù)組的優(yōu)缺點(diǎn)
集合是多個(gè)對(duì)象的容器,可以將不同數(shù)據(jù)類型的多個(gè)對(duì)象組織在一起
數(shù)組類型是有相同數(shù)據(jù)類型的數(shù)據(jù)集合,數(shù)組是很多語(yǔ)言都支持的底層數(shù)據(jù)結(jié)構(gòu),性能上是最高的
###16.如何對(duì)一個(gè)對(duì)象排序,有幾種方法
把對(duì)象放入List集合中,用Collections工具類調(diào)用sort()方法進(jìn)行排序,
但是這個(gè)類必須實(shí)現(xiàn)Compareble接口才行
把對(duì)象放在Set集合中,用TreeSet()實(shí)現(xiàn)類對(duì)集合直接排序
###17.在集合里面怎么判斷兩個(gè)對(duì)象相等,要實(shí)現(xiàn)什么方法
重寫equals方法
###18.怎么樣把集合轉(zhuǎn)化成數(shù)組,或把數(shù)組轉(zhuǎn)化為集合
把集合轉(zhuǎn)為數(shù)組,可以用toArray()方法
把數(shù)組轉(zhuǎn)為集合時(shí), for each循壞,先把數(shù)組中的元素轉(zhuǎn)為String型,再放到集合里
###19.分別寫出List,Set,Map里面的5個(gè)常用方法
List:
add()新增 clear()清除 contains()判斷是否包含某個(gè)元素
indexOf()一個(gè)元素在集合中首次出現(xiàn)的位置
set()把指定下標(biāo)的元素替換成自定義元素
Set:
add()新增 clear()清除 contains()判斷是否包含某個(gè)元素
remove():把集合中指定下標(biāo)的元素刪掉 size():返回集合長(zhǎng)度 Map: containsKey()是否包含指定key containsValue()是否包含指定value keySet()返回所有key put()添加元素 Remove()移除
###20.HashMap與LinkedHashMap,和TreeMap的區(qū)別。
共同點(diǎn):HashMap,LinkedHashMap,TreeMap都屬于Map的實(shí)現(xiàn)類.
不同點(diǎn): 1.HashMap里面存入的鍵值對(duì)在取出的時(shí)候是隨機(jī)的,
TreeMap取出來(lái)的是排序后的鍵值對(duì)。但如果您要按自然順序或自定義順序遍歷鍵,那么TreeMap會(huì)更好。
LinkedHashMap 是HashMap的一個(gè)子類,如果需要輸出的順序和輸入的相同,那么用LinkedHashMap可以實(shí)現(xiàn).
###21.HashMap怎么實(shí)現(xiàn)有序
可以轉(zhuǎn)化放入TreeMap里面,或者把key放入LinkedList里面。
###22.在List里面怎么去掉重復(fù)的數(shù)?
通過(guò)把List里面的數(shù)據(jù)放入HashSet可以去除重復(fù)
###23.在List里面有幾種排序?
答:兩種:實(shí)現(xiàn)Comparable<Article>接口,實(shí)現(xiàn)里面的CompareTo方法進(jìn)行排序。 還有調(diào)用Collections.sort()方法排序!
###24.說(shuō)一下鏈表跟數(shù)組的區(qū)別
鏈表:用一組任意儲(chǔ)存單元存放線性表的數(shù)據(jù)元素,并且通過(guò)指針鏈相接結(jié)點(diǎn)的序列稱為鏈表。
是一種常見(jiàn)的數(shù)據(jù)組織形式,它采用了動(dòng)態(tài)分配內(nèi)存的形式實(shí)現(xiàn)。
需要時(shí)可以用new分配內(nèi)存空間,不需要時(shí)用delete將已分配的空間釋放, 不會(huì)造成內(nèi)存空間的浪費(fèi)。不靠數(shù)組實(shí)現(xiàn),沒(méi)有下標(biāo)。
數(shù)組必須事先定義固定的長(zhǎng)度,不能適應(yīng)數(shù)據(jù)動(dòng)態(tài)增減的情況。當(dāng)數(shù)據(jù)增加時(shí),
可能超出原先定義的元素個(gè)數(shù);當(dāng)數(shù)據(jù)減少時(shí),造成數(shù)據(jù)浪費(fèi)。在使用的時(shí)候還要數(shù)組初始化,
注意數(shù)組的下標(biāo)越界。
###25.HashSet的理解
HashSet實(shí)現(xiàn)了Set接口,HashSet不保證集合的迭代順序,允許使用Null元素。
HashSet的底層使用了HashMap,使用HashMap實(shí)列進(jìn)行對(duì)集合的元素進(jìn)行操作,然后再封裝成HashSet的操作。
###26.什么類可以實(shí)現(xiàn)有序存儲(chǔ)(除ArrayList以外)?
一種按照插入的順序排序,譬如LinkedList,LiskedHashMap,
另外一種是插入后重新排序TreeSet,TreeMap
###27.HashMap和ArrayList是不是都是線程不安全的?
ArrayList是線程不安全的;HashMap是線程不安全的; 還有我們常見(jiàn)的一些JAVA集合都是線程不安全,這樣做是為了提高性能
在JDK5以后提供了線程安全的并發(fā)包java.util.concurrent并發(fā)包,譬如里面的類CopyOnWriteArrayList,CopyOnWriteArraySet,ConcurrentHashMap等
###28.HashMap和TreeMap的區(qū)別?
TreeMap實(shí)現(xiàn)Map接口,能夠把它保存的記錄根據(jù)鍵排序,默認(rèn)是按鍵值的升序排序, 也可以指定排序的比較器,當(dāng)用Iterator 遍歷TreeMap時(shí),得到的記錄是排過(guò)序的。 hashMap最多只允許一條記錄的鍵為Null,允許多條記錄的值為Null,hashMap不支持線程的同步,
即同一時(shí)刻可以有多個(gè)線程同時(shí)寫hashMap.可能會(huì)導(dǎo)致數(shù)據(jù)的不一致。 TreeMap不僅可以保持順序,而且可以用與排序。
HashMap通過(guò)hashcode對(duì)其內(nèi)容進(jìn)行快速查找,而TreeMap中所有的元素都保持著某種固定的順序,
如果你需要得到一個(gè)有序的結(jié)果你就使用TreeMap.
###29.ArrayList集合加入1萬(wàn)條數(shù)據(jù),應(yīng)該怎么提高效率
因?yàn)锳rrayList的底層是數(shù)組實(shí)現(xiàn),并且數(shù)組的默認(rèn)值是10,如果插入10000條要不斷的擴(kuò)容,耗費(fèi)時(shí)間,
所以我們調(diào)用ArrayList的指定容量的構(gòu)造器方法ArrayList(int size) 就可以實(shí)現(xiàn)不擴(kuò)容,就提高了性能
###30.你知道HashMap底層是怎么實(shí)現(xiàn)的嗎?
簡(jiǎn)單的說(shuō)是一個(gè)數(shù)組,因?yàn)閿?shù)組的性能比較好,數(shù)組里面放的是Entry類,HashMap類有一個(gè)叫做Entry的
內(nèi)部類。這個(gè)Entry類包含了key-value作為實(shí)例變量。當(dāng)存儲(chǔ)或者獲取對(duì)象的時(shí)候, 就根據(jù)哈希算法,對(duì)象的hashCode調(diào)用得到這個(gè)下標(biāo),以便實(shí)現(xiàn)快速訪問(wèn).
###31.怎樣遍歷List Set,Map
List 和Set可以通過(guò)一般for循環(huán),迭代器循環(huán),或者增強(qiáng)型循環(huán)來(lái)遍歷, 其中一般for循環(huán)性能最快,
迭代器循環(huán)可以判斷和得到下一個(gè)值,for each增強(qiáng)型循環(huán)擴(kuò)展性強(qiáng),但性能稍低.
Map循環(huán)可以通過(guò)keySet得到Key的Set集合,然后遍歷這個(gè)集合就可以得到所有的Value
###32.Set為什么是不允許重復(fù)的。
set的實(shí)現(xiàn)機(jī)制不允許重復(fù)的
###33.ArrayList為什么要用for循環(huán),為什么要用迭代器,又有什么好處。
for循環(huán)通過(guò)對(duì)象拿到集合里的值
迭代器可以實(shí)現(xiàn)Collection接口的方法,可以一個(gè)一個(gè)地獲取集合中的元素 在遍歷集合時(shí) 可判斷是否有下一個(gè)元素
###34.你對(duì)與隊(duì) 列了解多少你是怎么用的。
答:隊(duì)列是一種數(shù)據(jù)結(jié)構(gòu),F(xiàn)IFO 先進(jìn)先出有點(diǎn)類似與棧,只是在隊(duì)列中第一個(gè)插入的數(shù)據(jù)項(xiàng)也會(huì)被最先刪除,
隊(duì)列的兩個(gè)基本操作:
一個(gè)是插入一個(gè)數(shù)據(jù)項(xiàng),即把一個(gè)數(shù)據(jù)項(xiàng)放入隊(duì)尾
另一個(gè)是移除一個(gè)數(shù)據(jù)項(xiàng),即移除隊(duì)頭的數(shù)據(jù)項(xiàng).
###35.如果我要存取很多的數(shù)據(jù),但是又不需要重復(fù)的,要選擇什么容器,說(shuō)一下為什么使用它,它是哪個(gè)的子類?
答:Set容器,它是不允許重復(fù)的,它是collection的子類
###36.哪種方法可以得到Map的Key?
keySet()方法 面向?qū)ο蟮拿嬖囶}部分
###1) 面向?qū)ο蟮膬?yōu)點(diǎn)?
答案
易擴(kuò)展 易維護(hù) 面向?qū)ο笫窍鄬?duì)面向過(guò)程的
###2) 如何聲名一個(gè)靜態(tài)塊?
答案
在類中方法外聲明 static關(guān)鍵字+代碼塊
###3) 接口與抽象類的區(qū)別?
答案
類是單繼承的,但是可以實(shí)現(xiàn)多個(gè)接口
抽象類里的方法可以有實(shí)例方法也可以有抽象方法
接口里面只能有抽象方法。
?。?!注意:關(guān)注一個(gè)事物的本質(zhì)的時(shí)候,用抽象類;當(dāng)你關(guān)注一個(gè)行為的時(shí)候,用接口。
###4) 用于類和接口的關(guān)鍵字
答案 定義類的是class,如類文件的開(kāi)頭都是:public class 類名{ } 定義接口的是interface,如public interface 接口名{ } 用于實(shí)現(xiàn)接口的是implements。
###5) 如何創(chuàng)建數(shù)組?
答案 數(shù)組是new出來(lái)的 或者直接可以聲明, 舉個(gè)例子 String[] array={"1","2"}; 或者String[] array=new String[10];
###6) 如何創(chuàng)建一個(gè)構(gòu)造方法對(duì)象的格式?要注意哪些?
答案
構(gòu)造器是為了創(chuàng)建一個(gè)類的實(shí)例Platypus p1 = new Platypus();
注意:方法名與類名一致
###7) 類的組成 和執(zhí)行順序
答案
屬性
方法
靜態(tài)塊
非靜態(tài)塊
執(zhí)行順序: 先父類,后子類,靜態(tài)塊 靜態(tài)字段 非靜態(tài)塊 非靜態(tài)字段 構(gòu)造器 方法
###8) main方法必須被什么修飾?
答案 方法名必須是main 是被public static void 修飾 傳入String數(shù)組
###9) 如何理解面向?qū)ο?/p>
答案
世間萬(wàn)物皆對(duì)象,對(duì)象有具體的的實(shí)例化,任何方法或者屬性都要寫在對(duì)象(類)里面
###10) 構(gòu)造方法可否能被重寫:
答案 構(gòu)造方法不能被繼承,因此不能重寫,但能被重載。
###11) 靜態(tài)方法中能有靜態(tài)的變量嗎?
答案
不能 靜態(tài)變量是類變量 不可以定義在方法里
###12) String與StringBuffer的區(qū)別:
答案
String 是不可變的 可以直接使用它的方法 用來(lái)創(chuàng)建字符串
而 Stringbuffer無(wú)論怎么修改都是一個(gè)對(duì)象
如果在字符串改變,或者迭代改變的情況下Stringbuffer比String運(yùn)行快
###13) 重載(overloading)與重寫(override)的區(qū)別:
答案
1.重載發(fā)生在同一個(gè)類。 重寫發(fā)生在父子類中。
2.重載參數(shù)簽名不同,而重寫相同且返回類型相同。
3.方法名相同,重寫override是父類與子類之間多態(tài)性的一種表現(xiàn),重載overload是一個(gè)類中多態(tài)性的一種表現(xiàn)。
###14) (= =)與equals()的區(qū)別:
答案
如果是基本類型比較,那么只能用==來(lái)比較,不能用 equals 對(duì)象間的比較使用equals ==比較的是對(duì)象中的地址 而equals比較的對(duì)象 的內(nèi)容
###15) Abstract與interface的區(qū)別:
答案
Abstract是用來(lái)聲明抽象類抽象方法,而interface是接口 抽象類可以有
變量,有方法的實(shí)現(xiàn),接口內(nèi)只能有常量和抽象方法
###16) StringBuilder和StringBuffer的區(qū)別:
答案 StringBuilder比StringBuffer更加快捷,但是StringBuilder線程不安全
###17) JRE,JDK,JVM分別是什么,它們有什么聯(lián)系:
答案
jre 運(yùn)行時(shí)環(huán)境,jvm虛擬機(jī) jdk java開(kāi)發(fā)工具包 jvm是jre的一部分
###18) 普通類繼承抽象類為什么一定要重寫其中的抽象方法?
答案
必須要實(shí)現(xiàn)的,也就是要重寫,如果不實(shí)現(xiàn),子類無(wú)法對(duì)象實(shí)例化。
###19) 什么是拆箱和裝箱?
答案
裝箱就是將基本類型轉(zhuǎn)換為對(duì)象類型
拆箱就是將對(duì)象類型轉(zhuǎn)換為基本類型。
###20) 繼承與實(shí)現(xiàn)的區(qū)別?
答案
繼承針對(duì)類,實(shí)現(xiàn)針對(duì)接口。
單繼承、多實(shí)現(xiàn)的。
實(shí)現(xiàn)要重寫接口里面的方法,而繼承不需要。
###21) Abstract為什么不能與,private,final,同時(shí)使用?
答案
抽象方法需要被子類重寫 所以不能夠用private final修飾
###24) 繼承最大好處?
答案 可以對(duì)父類的方法進(jìn)行重用,節(jié)省時(shí)間
###25) 寫出String類常見(jiàn)的5個(gè)方法,并詳細(xì)解釋?
答案 indexOf()返回指定字符串在該字符串出現(xiàn)的序列 startsWith()判斷該字符串是否以指定字符開(kāi)始 concat() 將指定字符串連接在該字符串的結(jié)尾 length()返回字符串的長(zhǎng)度 substring返回該字符串從索引開(kāi)始 結(jié)束于字符串末尾 或者指定索引的一個(gè)子字符串
###27) 普通方法的方法名可以與類名一致嗎?
答案
可以,構(gòu)造器就是
###28) 在什么情況下局部變量會(huì)覆蓋全局變量?
答案
當(dāng)局部變量名與全局變量名相同 類型相同
###29) static 修飾的方法可否支持多態(tài)?
答案
不支持多態(tài),如果父類聲明一個(gè)對(duì)象,子類實(shí)現(xiàn)這邊變量,那么調(diào)用static修飾的時(shí)候會(huì)調(diào)用父類的,而不是子類的.
除了工具類。用static修飾的變量會(huì)發(fā)生一處改變則全部改變。
###30) 使用數(shù)組前應(yīng)該注意的什么?
答案 數(shù)組下標(biāo)是否越界 對(duì)數(shù)組進(jìn)行初始化
###31) 如果一個(gè)類繼承了父類,父類里有一個(gè)靜態(tài)塊,子類里也有個(gè)靜態(tài)塊 ,對(duì)子類進(jìn)行實(shí)例,父類的靜態(tài)塊先執(zhí)行還是子類的先執(zhí)行?
答案
父類的靜態(tài)塊先于子類的靜態(tài)塊的執(zhí)行
###32) Java語(yǔ)言最大的特點(diǎn)?
答案 跨平臺(tái)性(一次編譯,多次執(zhí)行)
###33) 請(qǐng)你說(shuō)說(shuō)byte short char之間可以互相轉(zhuǎn)換嗎?為什么?
答案
可以通過(guò)強(qiáng)轉(zhuǎn)
###34) 請(qǐng)說(shuō)說(shuō)引用和對(duì)象?
答案
對(duì)象和引用是分不開(kāi)的,對(duì)象生成一個(gè)地址,引用則指向了這個(gè)地址
A a=new A();
a為引用 等號(hào)右邊的是對(duì)象
###35) 怎樣將一個(gè)String添加到另一個(gè)String的后面?
答案
(StringBuffer ,StringBuilder)的append方法
concat
###36) 有幾種數(shù)據(jù)類型?
答案
JAVA數(shù)據(jù)類型分基本數(shù)據(jù)類型和引用對(duì)象類型。
###37) 傳參有幾種類型?有幾種特殊類型?
答案
基本數(shù)據(jù)類型 引用對(duì)象類型
###38) 什么是匿名類,有什么好處
答案 匿名類沒(méi)有名字的類 ,封裝性好,比較安全用了一次便可以丟棄 接口不能new,但語(yǔ)法中的匿名類卻和new一個(gè)接口的的語(yǔ)法結(jié)構(gòu)很相似。
###39) jar是什么格式的文件,有什么好處
答案
它允許將許多class文件組合成一個(gè)壓縮文件,方便管理class文件
###40) java和javac,javaw各有什么作用
答案 java:運(yùn)行程序 javac:編譯java文件至class文件 javaw: 不需要打開(kāi)dos窗口就可以運(yùn)行
有興趣的可以看下 ssh的面試題
http://blog.csdn.net/my_name_nb/article/details/54866319
新聞熱點(diǎn)
疑難解答
圖片精選
網(wǎng)友關(guān)注