面試:
1、說(shuō)一說(shuō)軟件測(cè)試的過(guò)程或流程?(軟件測(cè)試P28)
軟件測(cè)試按照階段劃分,一般分為5個(gè)階段:?jiǎn)卧獪y(cè)試、集成測(cè)試、確認(rèn)測(cè)試、系統(tǒng)測(cè)試和驗(yàn)收測(cè)試。
軟件測(cè)試的工作范疇可以分為兩個(gè)層次:
? 軟件測(cè)試工作的組織與管理:制定測(cè)試策略、測(cè)試計(jì)劃,確認(rèn)所采用的測(cè)試方法與規(guī)范,控制測(cè)試進(jìn)度,管理測(cè)試資源。
? 軟件測(cè)試工作的實(shí)施:編制符合標(biāo)準(zhǔn)的測(cè)試文檔,搭建測(cè)試環(huán)境,開發(fā)測(cè)試腳本,與開發(fā)組織協(xié)作實(shí)現(xiàn)各階段的測(cè)試活動(dòng)。

? 測(cè)試組織和管理:
o 建立測(cè)試隊(duì)伍,設(shè)立不同功能或執(zhí)行不同任務(wù)的測(cè)試小組,并對(duì)測(cè)試用例、軟件缺陷、測(cè)試執(zhí)行、測(cè)試文檔等管理。
? 測(cè)試計(jì)劃:
o 確定測(cè)試目標(biāo)和測(cè)試范圍,分析哪些功能要測(cè)試,哪些功能不要測(cè)試,識(shí)別測(cè)試風(fēng)險(xiǎn),對(duì)測(cè)試工作量進(jìn)行預(yù)估,已決定人力資源和做出合理的進(jìn)度安排,一般,開發(fā)組負(fù)責(zé)編制單元測(cè)試計(jì)劃和說(shuō)明,而測(cè)試組負(fù)責(zé)編制功能、系統(tǒng)等其他階段的測(cè)試和說(shuō)明。
? 測(cè)試用例設(shè)計(jì):
o 需要考慮各種軟件的使用場(chǎng)景和操作路徑,設(shè)計(jì)出最優(yōu)可能發(fā)現(xiàn)缺陷的用例。
? 測(cè)試實(shí)施:
o 按測(cè)試計(jì)劃和測(cè)試說(shuō)明的定義對(duì)測(cè)試對(duì)象進(jìn)行相應(yīng)的測(cè)試,填寫測(cè)試報(bào)告中相應(yīng)的表格。
? 測(cè)試結(jié)果分析:
o 對(duì)測(cè)試結(jié)果進(jìn)行定量和定性的分析,以檢查測(cè)試工作的執(zhí)行狀態(tài)
? 測(cè)試評(píng)審和報(bào)告:
o 根據(jù)軟件測(cè)試評(píng)審準(zhǔn)則在各個(gè)測(cè)試階段評(píng)審時(shí)提交類型完整測(cè)試文檔。
2、白盒測(cè)試和黑盒測(cè)試是什么?說(shuō)一說(shuō)什么時(shí)候選用白盒測(cè)試,什么時(shí)候選用黑盒測(cè)試?(P30)
? 概念
白盒測(cè)試是已知產(chǎn)品的內(nèi)部工作過(guò)程,清楚最終生成軟件產(chǎn)品的計(jì)算機(jī)程序結(jié)構(gòu)及語(yǔ)句,按照程序內(nèi)部的結(jié)構(gòu)測(cè)試程序,檢驗(yàn)程序中的每條通路是否都能按預(yù)定要求正確工作。
? 白盒測(cè)試是基于覆蓋的測(cè)試,具體方法有:
? 邏輯覆蓋
? 語(yǔ)句覆蓋
? 判定覆蓋
? 條件覆蓋
? 判定/條件覆蓋
? 條件組合覆蓋
? 循環(huán)覆蓋
? 基本路徑覆蓋
? 白盒測(cè)試主要用于單元測(cè)試。
黑盒測(cè)試也稱功能測(cè)試在測(cè)試過(guò)程中,把程序看成一個(gè)不能打開的黑盒子,在完全不考慮程序內(nèi)部結(jié)構(gòu)和內(nèi)部特性的情況下,只依靠被測(cè)試程序的輸入和輸出之間關(guān)系或程序的功能來(lái)設(shè)計(jì)測(cè)試用例。
? 黑盒測(cè)試的方法:
? 等價(jià)類劃分
? 邊界值分析
? 錯(cuò)誤推測(cè)法
? 因果圖法
? 優(yōu)缺點(diǎn)比較:
o 黑盒測(cè)試 優(yōu)點(diǎn):較為簡(jiǎn)單,能知道軟件中有哪些功能,在自動(dòng)化測(cè)試時(shí)較為方便;
缺點(diǎn):覆蓋率低、復(fù)用性低
o 白盒測(cè)試
優(yōu)點(diǎn):覆蓋率高,能發(fā)現(xiàn)隱含問(wèn)題,提高代碼質(zhì)量;
缺點(diǎn):不可能測(cè)試所有路徑,系統(tǒng)龐大時(shí)開銷大,只能知道測(cè)試開發(fā)人員做的對(duì)不對(duì),而不能知道設(shè)計(jì)是否正確,可能會(huì)漏掉一些功能需求
? 應(yīng)用
? 白盒測(cè)試方法可以在更早的時(shí)候進(jìn)行,只要有一段程序被完成就可以進(jìn)行,而黑盒測(cè)試必須等到一個(gè)單元全部完成或等到整個(gè)系統(tǒng)完成后才能進(jìn)行。
? 黑盒測(cè)試人員偏重于業(yè)務(wù)方面,而白盒測(cè)試人員側(cè)重于實(shí)現(xiàn)方式;黑盒測(cè)試注重整體,而白盒測(cè)試則更注重局部。
? 白盒測(cè)試是對(duì)過(guò)程的測(cè)試,黑盒測(cè)試是對(duì)結(jié)果的測(cè)試。
? 在一個(gè)項(xiàng)目中測(cè)試工程師還是以黑盒測(cè)試為主,白盒測(cè)試為輔。因?yàn)槟闶紫纫煤诤袦y(cè)試來(lái)驗(yàn)證結(jié)果是否正確,或者說(shuō)目標(biāo)是否正確,如果結(jié)果正確,然后再用白盒測(cè)試來(lái)驗(yàn)證,這個(gè)正確的結(jié)果是不是由于正確的過(guò)程產(chǎn)生的。如果結(jié)果不正確,那么用白盒測(cè)試來(lái)找到過(guò)程中錯(cuò)誤的地方。只有先做好黑盒測(cè)試,然后用白盒測(cè)試驗(yàn)證,這個(gè)測(cè)試才能說(shuō)做的完整了。
3、集成測(cè)試、功能測(cè)試、回歸測(cè)試,功能測(cè)試和回歸測(cè)試的區(qū)別,為什么要有回歸測(cè)試?
測(cè)試 概念 測(cè)試階段 依據(jù)
集成
測(cè)試 是將已分別通過(guò)測(cè)試的單元按照設(shè)計(jì)要求組合起來(lái)在進(jìn)行的測(cè) 試,以檢查這些單元之間的接口是否存在問(wèn)題。一般由若干個(gè)不同測(cè)試組成。 在單元測(cè)試之后 需求規(guī)格說(shuō)明書、概要設(shè)計(jì)文檔、詳細(xì)設(shè)計(jì)說(shuō)明書
功能
測(cè)試 根據(jù)產(chǎn)品規(guī)格說(shuō)明書,來(lái)檢驗(yàn)被測(cè)系統(tǒng)是否滿足各方面功能的使用要求。 可在單元測(cè)試、系統(tǒng)測(cè)試、集成測(cè)試中 產(chǎn)品規(guī)格說(shuō)明書
回歸
測(cè)試 是指修改了舊代碼之后,重新進(jìn)行的測(cè)試以及確認(rèn)沒有引入新的錯(cuò)誤或?qū)е缕渌a產(chǎn)生錯(cuò)誤,不需要全面測(cè)試,只需根據(jù)修改進(jìn)行有效測(cè)試。 所做的修改達(dá)到了預(yù)定目的,新功能得到了實(shí)現(xiàn);不影響軟件原有功能的正確性
4、說(shuō)出一個(gè)你寫過(guò)的軟件測(cè)試的case,它是用來(lái)測(cè)什么的,屬于哪種測(cè)試類型?
曾經(jīng)寫過(guò)的軟件測(cè)試的case,用來(lái)測(cè)試job-service,分為兩種,分別為normal-tests和error-tests,大致過(guò)程是,在其中的一個(gè)TestCase中添加多個(gè)Step,用來(lái)創(chuàng)建各種類型的Job,其中有ondemand、Schedule等,之后創(chuàng)個(gè)多個(gè)TestCase,進(jìn)行g(shù)etJob,updateJob,triggerJob,getInstance,getResult,deleteInstance,DeleteJob等操作。主要用這些測(cè)試Case中的步驟測(cè)試Jobservice中創(chuàng)建Job,并進(jìn)行運(yùn)行、修改、觸發(fā)、和獲取、刪除時(shí)的結(jié)果能夠達(dá)到預(yù)期效果。
? 每個(gè)testSuite中有多個(gè)TestCase,之下又有多個(gè)Step,不知道能不能看做一個(gè)集成測(cè)試。
? 進(jìn)行job更新后,有triggerJob,不知道能不能看作回歸測(cè)試。
5、描述一下實(shí)習(xí)的測(cè)試架構(gòu)?
Jenkins創(chuàng)建一個(gè)Pipeline的project,在github中有一個(gè)Groovy的庫(kù),用來(lái)存儲(chǔ)所有的運(yùn)行接口,在每個(gè)項(xiàng)目中有一個(gè).ci文件夾,其下有Jenkinsfile、release、docker和kubernates相關(guān)配置,數(shù)據(jù)庫(kù)信息等,jenkinsfile中存儲(chǔ)了各個(gè)階段的運(yùn)行,通過(guò)運(yùn)行項(xiàng)目中的soapui.xml中的case進(jìn)行測(cè)試。
6、java屬于object的類有哪些?
Hashcode(),equals(),wait(),notify(),botifyall(),finalize(),clone(),toString(),getClass()
equals()返回boolean型,hashcode返回int型
7、”==“ 和equals的區(qū)別,hashcode,為什么要用hashcode,equals和hashcode都是返回什么類型?
? ==
Java中的數(shù)據(jù)類型,可分為兩類:
1)基本數(shù)據(jù)類型,也稱原始數(shù)據(jù)類型
byte,short,char,int,long,float,double,boolean 他們之間的比較,應(yīng)用雙等號(hào)(==),比較的是他們的值。
2)引用類型(類、接口、數(shù)組)
? 當(dāng)他們用(==)進(jìn)行比較的時(shí)候,比較的是他們?cè)趦?nèi)存中的存放地址,所以,除非是同一個(gè)new出來(lái)的對(duì)象,他們的比較后的結(jié)果為true,否則比較后結(jié)果為false。
? 對(duì)象是放在堆中的,棧中存放的是對(duì)象的引用(地址)。由此可見'=='是對(duì)棧中的值進(jìn)行比較的。如果要比較堆中對(duì)象的內(nèi)容是否相同,那么就要重寫equals方法了。
? equals() 返回boolean
1)、默認(rèn)情況(沒有覆蓋equals方法)下equals方法都是調(diào)用Object類的equals方法,而Object的equals方法主要用于判斷對(duì)象的內(nèi)存地址引用是不是同一個(gè)地址(是不是同一個(gè)對(duì)象), 定義的equals與==是等效的。
2)、要是類中覆蓋了equals方法,那么就要根據(jù)具體的代碼來(lái)確定equals方法的作用了,覆蓋后一般都是通過(guò)對(duì)象的內(nèi)容是否相等來(lái)判斷對(duì)象是否相等。
? hashCode() 返回int
用來(lái)判斷兩個(gè)對(duì)象是否相等,Object中的hashcode方法返回對(duì)象在內(nèi)存地址地址轉(zhuǎn)換成一個(gè)int值,所以未重寫之前,所有的hashcode值是不相等的。
? Java采用了哈希表的原理。這樣一來(lái),當(dāng)集合要添加新的元素時(shí),先調(diào)用這個(gè)元素的hashCode方法,就一下子能定位到它應(yīng)該放置的物理位置上。 如果這個(gè)位置上沒有元素,它就可以直接存儲(chǔ)在這個(gè)位置上,不用再進(jìn)行任何比較了;如果這個(gè)位置上已經(jīng)有元素了,就調(diào)用它的equals方法與新元素進(jìn)行比較,相同的話就不存,不相同就散列其它的地址。所以這里存在一個(gè)沖突解決的問(wèn)題。這樣一來(lái)實(shí)際調(diào)用equals方法的次數(shù)就大大降低了,幾乎只需要一兩次.
? hashcode和equals比較:
1)、如果兩個(gè)對(duì)象equals,Java運(yùn)行時(shí)環(huán)境會(huì)認(rèn)為他們的hashcode一定相等。
2)、如果兩個(gè)對(duì)象不equals,他們的hashcode有可能相等。
3)、如果兩個(gè)對(duì)象hashcode相等,他們不一定equals。
4)、如果兩個(gè)對(duì)象hashcode不相等,他們一定不equals。
? 覆蓋
在每個(gè)覆蓋了equals方法的類中,也必須覆蓋hashCode方法。如果不這樣做的話,就會(huì)違反Object.hashCode的通用約定,從而導(dǎo)致該類無(wú)法結(jié)合所有基于散列的集合一起正常運(yùn)作,這樣的集合包括HashMap、HashSet和Hashtable。
8、描述一下hash表?
? 定義:Hash表也稱散列表,也有直接譯作哈希表,Hash表是一種特殊的數(shù)據(jù)結(jié)構(gòu),它同數(shù)組、鏈表以及二叉排序樹等相比較有很明顯的區(qū)別,它能夠快速定位到想要查找的記錄,而不是與表中存在的記錄的關(guān)鍵字進(jìn)行比較來(lái)進(jìn)行查找。這個(gè)源于Hash表設(shè)計(jì)的特殊性,它采用了函數(shù)映射的思想將記錄的存儲(chǔ)位置與記錄的關(guān)鍵字關(guān)聯(lián)起來(lái),從而能夠很快速地進(jìn)行查找。
? 查找復(fù)雜度直接降到O(1)
? 構(gòu)建hash函數(shù),解決hash沖突
? 開放定址法、鏈地址法
? Hash表的優(yōu)缺點(diǎn):Hash表存在的優(yōu)點(diǎn)顯而易見,能夠在常數(shù)級(jí)的時(shí)間復(fù)雜度上進(jìn)行查找,并且插入數(shù)據(jù)和刪除數(shù)據(jù)比較容易。但是它也有某些缺點(diǎn),比如不支持排序,一般比用線性表存儲(chǔ)需要更多的空間,并且記錄的關(guān)鍵字不能重復(fù)。
9、List和Array的區(qū)別?若開發(fā)過(guò)程中Array空間不夠用,該怎么擴(kuò)展?
Array和List都屬于順序表。
Array
連續(xù)的存儲(chǔ)結(jié)構(gòu),int[] i=new int[3]
i其實(shí)記錄的是數(shù)組的首地址,而i[1]其實(shí)相當(dāng)于在i的地址的基礎(chǔ)上加上1個(gè)整數(shù)的地址偏移,然后再取這塊地址中的值。
基于索引(index)的數(shù)據(jù)結(jié)構(gòu),它使用索引在數(shù)組中搜索和讀取數(shù)據(jù)是很快的。但是要?jiǎng)h除數(shù)據(jù)卻是開銷很大的,因?yàn)檫@需要重排數(shù)組中的所有數(shù)據(jù)。
數(shù)組必須要在初始化時(shí)分配固定的大小,比如說(shuō)int[] a=new int[3];如果我們僅僅寫int[] a=new int[];編譯器就會(huì)無(wú)情地給我們報(bào)錯(cuò)。
List
不連續(xù)的存儲(chǔ)結(jié)構(gòu),
List的每個(gè)節(jié)點(diǎn)都有著一個(gè)Next屬性,這個(gè)屬性則記錄著他的下一個(gè)節(jié)點(diǎn)的地址。
List—是一個(gè)有序的集合,可以包含重復(fù)的元素,提供了按索引訪問(wèn)的方式,它繼承Collection。
List由于空間不必連續(xù),所以無(wú)須指定初始大小
? 總結(jié):
array為定長(zhǎng)的數(shù)組,不確定大小時(shí)最好用List
當(dāng)需要大量的查找操作時(shí),最好使用Array
10、協(xié)議有哪些?Http的構(gòu)成,Http的協(xié)議類型有哪些?post和put有何區(qū)別?head是做什么的?1xx,2xx,3xx,4xx,5xx的意思?
o Http協(xié)議、soap協(xié)議、rest是架構(gòu)不是協(xié)議。
o Http協(xié)議:
http(超文本傳輸協(xié)議)是一個(gè)基于請(qǐng)求與響應(yīng)模式的、無(wú)狀態(tài)的、應(yīng)用層的協(xié)議,?;赥CP的連接方式,HTTP1.1版本中給出一種持續(xù)連接的機(jī)制,絕大多數(shù)的Web開發(fā),都是構(gòu)建在HTTP協(xié)議之上的Web應(yīng)用。
o http請(qǐng)求由四部分組成,分別是:請(qǐng)求行、消息報(bào)頭、空行、請(qǐng)求正文
? 請(qǐng)求行
? 請(qǐng)求行由請(qǐng)求方法字段、URL字段和HTTP協(xié)議版本字段3個(gè)字段組成,它們用空格分隔。例如,GET /index.html HTTP/1.1。
? HTTP協(xié)議的請(qǐng)求方法有GET、POST、HEAD、PUT、DELETE、OPTIONS、TRACE、CONNECT。
? 請(qǐng)求頭部
? 請(qǐng)求頭部由關(guān)鍵字/值對(duì)組成,每行一對(duì),關(guān)鍵字和值用英文冒號(hào)“:”分隔。請(qǐng)求頭部通知服務(wù)器有關(guān)于客戶端請(qǐng)求的信息,典型的請(qǐng)求頭有:
User-Agent:產(chǎn)生請(qǐng)求的瀏覽器類型。
Accept:客戶端可識(shí)別的內(nèi)容類型列表。
Host:請(qǐng)求的主機(jī)名,允許多個(gè)域名同處一個(gè)IP地址,即虛擬主機(jī)。
? 請(qǐng)求數(shù)據(jù)
? 請(qǐng)求數(shù)據(jù)不在GET方法中使用,而是在POST方法中使用。POST方法適用于需要客戶填寫表單的場(chǎng)合。與請(qǐng)求數(shù)據(jù)相關(guān)的最常使用的請(qǐng)求頭是Content-Type和Content-Length。
o Http響應(yīng)類型:
? 1xx:指示信息--表示請(qǐng)求已接收,繼續(xù)處理。
? 2xx:成功--表示請(qǐng)求已被成功接收、理解、接受。
? 3xx:重定向--要完成請(qǐng)求必須進(jìn)行更進(jìn)一步的操作。
? 4xx:客戶端錯(cuò)誤--請(qǐng)求有語(yǔ)法錯(cuò)誤或請(qǐng)求無(wú)法實(shí)現(xiàn)。
? 5xx:服務(wù)器端錯(cuò)誤--服務(wù)器未能實(shí)現(xiàn)合法的請(qǐng)求。
o Http請(qǐng)求方法的介紹:
o GET(獲取資源):GET用于信息獲取,而且應(yīng)該是安全的和冪等的。get的請(qǐng)求參數(shù)是明文傳遞的,可在地址欄中看到,其安全性不高,用來(lái)獲取響應(yīng)內(nèi)容;
o POST(傳輸實(shí)體文本):向指定資源提交數(shù)據(jù)進(jìn)行處理請(qǐng)求(例如提交表單或者上傳文件)。數(shù)據(jù)被包含在請(qǐng)求體中。POST請(qǐng)求可能會(huì)導(dǎo)致新的資源的建立和/或已有資源的修改。
1、GET方法用于信息獲取,它是安全的(安全:指非修改信息,如數(shù)據(jù)庫(kù)方面的信息),而POST方法是用于修改服務(wù)器上資源的請(qǐng)求;
2、GET請(qǐng)求的數(shù)據(jù)會(huì)附在URL之后,而POST方法提交的數(shù)據(jù)則放置在HTTP報(bào)文實(shí)體的主體里,所以POST方法的安全性比GET方法要高;
3、GET方法傳輸?shù)臄?shù)據(jù)量一般限制在2KB,其原因在于:GET是通過(guò)URL提交數(shù)據(jù),而URL本身對(duì)于數(shù)據(jù)沒有限制,但是不同的瀏覽器對(duì)于URL是有限制的,比如IE瀏覽器對(duì)于URL的限制為2KB,而Chrome,F(xiàn)ireFox瀏覽器理論上對(duì)于URL是沒有限制的,它真正的限制取決于操作系統(tǒng)本身;POST方法對(duì)于數(shù)據(jù)大小是無(wú)限制的,真正影響到數(shù)據(jù)大小的是服務(wù)器處理程序的能力.
o HEAD(獲得報(bào)文首部): HEAD方法和GET方法一樣,知識(shí)不返回豹紋的主體部分,用于確認(rèn)URI的有效性及資源更新的日期時(shí)間等。
具體來(lái)說(shuō):1、判斷類型; 2、查看響應(yīng)中的狀態(tài)碼,看對(duì)象是否存在(響應(yīng):請(qǐng)求執(zhí)行成功了,但無(wú)數(shù)據(jù)返回); 3、測(cè)試資源是否被修改過(guò)
HEAD方法和GET方法的區(qū)別: GET方法有實(shí)體,HEAD方法無(wú)實(shí)體。
o PUT(傳輸文件):把消息本體中的消息發(fā)送到一個(gè)URL,跟POST類似,但不常用。
通常用于向服務(wù)器發(fā)送請(qǐng)求,如果URI不存在,則要求服務(wù)器根據(jù)請(qǐng)求創(chuàng)建資源,如果存在,服務(wù)器就接受請(qǐng)求內(nèi)容,并修改URI資源的原始版本。
? PUT是冪等的,POST不是冪等的。POST在請(qǐng)求的時(shí)候,服務(wù)器會(huì)每次都創(chuàng)建一個(gè)文件,但是在PUT方法的時(shí)候只是簡(jiǎn)單地更新,而不是去重新創(chuàng)建。因此PUT是冪等的。
冪等(idempotent、idempotence)是一個(gè)抽象代數(shù)的概念。在計(jì)算機(jī)中,可以這么理解,一個(gè)冪等操作的特點(diǎn)就是其任意多次執(zhí)行所產(chǎn)生的影響均與依次一次執(zhí)行的影響相同。
11、Spring的注解@Autowired,它有什么作用,它注入的類是在什么時(shí)候進(jìn)行加載的?
o @Autowired 注釋,它可以對(duì)類成員變量、方法及構(gòu)造函數(shù)進(jìn)行標(biāo)注,完成自動(dòng)裝配的工作。 通過(guò) @Autowired的使用來(lái)消除 set ,get方法。
o 使用@Autowired進(jìn)行自動(dòng)注入:
Spring通過(guò)@Autowired實(shí)現(xiàn)依賴注入,@Autowired默認(rèn)使用類型匹配的方式,在容器中查找匹配的Bean,當(dāng)且僅有一個(gè)匹配的Bean時(shí),Spring將其注入到@Autowired標(biāo)注的變量中??墒褂聾Qualifier制定注入Bean的名稱。
o 對(duì)方法進(jìn)行標(biāo)注:
@Autowired可對(duì)類成員變量及方法的入?yún)⑦M(jìn)行標(biāo)注。
o 注入時(shí)間:
o 使用@Autowired默認(rèn)是啟動(dòng)時(shí)進(jìn)行對(duì)應(yīng)類的注入的,若設(shè)置了@Lazy注解,項(xiàng)目啟動(dòng)時(shí)不加載,僅僅在注解被掃描到時(shí)才生成一個(gè)實(shí)例。
o @Autowired和@Resource的區(qū)別:
@Autowired是Spring的注解默認(rèn)按類型裝配(這個(gè)注解是屬業(yè)spring的),默認(rèn)情況下必須要求依賴對(duì)象必須存在,如果要允許null值,可以設(shè)置它的required屬性為false;
@Resource 是J2EE的注解,默認(rèn)按照名稱進(jìn)行裝配,若未提供名稱,則可按類型進(jìn)行裝配。
o Spring的注解:@Component、@Autowired、@Controller、@Service、@Repository
@Scope注解,@Scope("prototype")表示將Action的范圍聲明為原型,可以利用容器的scope="prototype"來(lái)保證每一個(gè)請(qǐng)求有一個(gè)單獨(dú)的Action來(lái)處理,避免struts中Action的線程安全問(wèn)題。spring 默認(rèn)scope 是單例模式(scope="singleton"),這樣只會(huì)創(chuàng)建一個(gè)Action對(duì)象,每次訪問(wèn)都是同一Action對(duì)象,數(shù)據(jù)不安全,struts2 是要求每次次訪問(wèn)都對(duì)應(yīng)不同的Action,scope="prototype" 可以保證當(dāng)有請(qǐng)求的時(shí)候都創(chuàng)建一個(gè)Action對(duì)象
12、描述一下springboot,它是spring的一個(gè)分支嗎?還是獨(dú)立于spring,它的思想是什么?
Springboot不是spring的一部分,是一個(gè)在Spring 的基礎(chǔ)上搭建的全新的微框架,其目的是簡(jiǎn)化Spring的搭建和開發(fā)過(guò)程。
? 直接嵌入Tomcat, Jetty或者Undertow作為Servlet container。
? 自動(dòng)進(jìn)行Spring框架的配置,節(jié)省程序員大量的時(shí)間和精力,能夠讓程序員專注在業(yè)務(wù)邏輯代碼的編寫上不需要任何第三方系統(tǒng)。
? 直接啟動(dòng)應(yīng)用程序,不需要部署。
? 不需要一堆xml配置文件。
13、垃圾回收的方法,垃圾回收中的stop world是什么意思?是在什么時(shí)候進(jìn)行垃圾回收?
14、在實(shí)習(xí)時(shí),開發(fā)的過(guò)程中,你是如何定義一個(gè)rest接口的,需要提供什么參數(shù)?
15、二叉樹的鏡像,如果用遞歸實(shí)現(xiàn),樹的深度過(guò)大會(huì)出現(xiàn)什么異常,該怎么解決?
樹深度不大時(shí)用遞歸的方式,若樹的深度過(guò)大會(huì)造成棧的溢出。
二叉樹鏡像的非遞歸方式:可以使用隊(duì)列進(jìn)行二叉樹的層次遍歷,首先根節(jié)點(diǎn)入隊(duì),若對(duì)不為空,則將對(duì)中元素一次取出,每次訪問(wèn)取出的元素時(shí),將它的左右字?jǐn)?shù)進(jìn)行鏡像翻轉(zhuǎn)。
10、一個(gè)無(wú)序的數(shù)組,每個(gè)元素可能出現(xiàn)多次,找出出現(xiàn)次數(shù)最多的前k個(gè)。
首先使用hashmap統(tǒng)計(jì)每個(gè)數(shù)字出現(xiàn)的次數(shù),key為數(shù)組中的元素,value為次數(shù)。
求前k個(gè)最大值。。。
17、Java的多態(tài)是什么意思?實(shí)現(xiàn)機(jī)制是什么?覆蓋時(shí)加載那個(gè)方法,什么時(shí)候進(jìn)行加載?
http://www.importnew.com/20079.html
Java實(shí)現(xiàn)多態(tài)有三個(gè)必要條件:繼承、重寫、向上轉(zhuǎn)型。繼承:在多態(tài)中必須存在有繼承關(guān)系的子類和父類。重寫:子類對(duì)父類中某些方法進(jìn)行重新定義,在調(diào)用這些方法時(shí)就會(huì)調(diào)用子類的方法。向上轉(zhuǎn)型:在多態(tài)中需要將子類的引用賦給父類對(duì)象,只有這樣該引用才能夠具備技能調(diào)用父類的方法和子類的方法。
? 多態(tài)有兩種形式:重載和覆蓋;
o 重載:發(fā)生在同一個(gè)類中;
o 覆蓋:發(fā)生在子類與父類之間;
? 靠的是父類或接口定義的引用變量可以指向子類或具體實(shí)現(xiàn)類的實(shí)例對(duì)象,而程序調(diào)用的方法在運(yùn)行期才動(dòng)態(tài)綁定,就是引用變量所指向的具體實(shí)例對(duì)象的方法,也就是內(nèi)存里正在運(yùn)行的那個(gè)對(duì)象的方法,而不是引用變量的類型中定義的方法。
18、String、StringBuffer和SpringBuilder的關(guān)系和異同,什么情況下StringBuilder線程不安全?
String,StringBuffer,StringBuilder 效率StringBuilder>StringBuffer>String
都是final類,都不能被繼承;
String長(zhǎng)度不可變,是不可變類,StringBuffer、StringBuilder長(zhǎng)度可變;
StringBuffer線程安全,StringBuilder非線程安全
SpringBuffer的append()、insert()的方法上有synchronized標(biāo)識(shí)符。
String不變性的理解:
? String類是被final修飾的,不能被繼承;用+鏈接字符串相當(dāng)于StringBuilder的append()方法,會(huì)創(chuàng)建新的字符串,效率較低,盡量使用StringBuffer或者StringBuilder構(gòu)建新的字符串;
? String s=new String("Hello World");可能創(chuàng)建兩個(gè)對(duì)象或一個(gè)對(duì)象,若靜態(tài)區(qū)中有“Hello World”字符串常量,則僅在堆中進(jìn)行創(chuàng)建對(duì)象,否則,在堆中和靜態(tài)區(qū)都要?jiǎng)?chuàng)建對(duì)象;
19、異常的處理方式有哪些?異常拋出后,接下來(lái)的代碼怎么執(zhí)行,會(huì)跳到哪一步?
異常處理機(jī)制為:拋出異常,捕捉異常。
//代碼1
public static void test() throws Exception {
throw new Exception("參數(shù)越界");
System.out.println("異常后"); //編譯錯(cuò)誤,「無(wú)法訪問(wèn)的語(yǔ)句」
}
//代碼2 try{ throw new Exception("參數(shù)越界"); }catch(Exception e) { e.printStackTrace(); } System.out.println("異常后");//可以執(zhí)行
//代碼3 if(true) { throw new Exception("參數(shù)越界"); } System.out.println("異常后"); //拋出異常,不會(huì)執(zhí)行
若一段代碼前有異常拋出,并且這個(gè)異常沒有被捕獲,這段代碼將產(chǎn)生編譯時(shí)錯(cuò)誤「無(wú)法訪問(wèn)的語(yǔ)句」。
若一段代碼前有異常拋出,并且這個(gè)異常被try...catch所捕獲,若此時(shí)catch語(yǔ)句中沒有拋出新的異常,則這段代碼能夠被執(zhí)行,否則,同第1條。
若在一個(gè)條件語(yǔ)句中拋出異常,則程序能被編譯,但后面的語(yǔ)句不會(huì)被執(zhí)行。
20、什么是平衡二叉樹,它的查找時(shí)間復(fù)雜度是多少?
(1)完全二叉樹——只有最下面的兩層結(jié)點(diǎn)度小于2,并且最下面一層的結(jié)點(diǎn)都集中在該層最左邊的若干位置的二叉樹;
(2)滿二叉樹——除了葉結(jié)點(diǎn)外每一個(gè)結(jié)點(diǎn)都有左右子葉且葉結(jié)點(diǎn)都處在最底層的二叉樹,。
(3)平衡二叉樹——當(dāng)且僅當(dāng)兩個(gè)子樹的高度差不超過(guò)1時(shí),這個(gè)樹是平衡二叉樹。(二叉排序樹)
平衡二叉樹,又稱AVL樹。它或者是一棵空樹,或者是具有下列性質(zhì)的二叉樹:它的左子樹和右子樹都是平衡二叉樹,且左子樹和右子樹的高度之差之差的絕對(duì)值不超過(guò)1.。
(4)二叉排序樹/二叉查找樹(Binary Search Tree),或者是一棵空樹,或者是具有下列性質(zhì)的二叉樹:
若它的左子樹不空,則左子樹上所有結(jié)點(diǎn)的值均小于它的根結(jié)點(diǎn)的值;
若它的右子樹不空,則右子樹上所有結(jié)點(diǎn)的值均大于它的根結(jié)點(diǎn)的值;
它的左、右子樹也分別為二叉排序樹。

21、Ajax用過(guò)嗎?它有什么特點(diǎn)?平時(shí)怎么用?
? 什么是AJAX?
AJAX全稱為“Asynchronous JavaScript and XML”(異步JavaScript和XML),是一種創(chuàng)建交互式網(wǎng)頁(yè)應(yīng)用的網(wǎng)頁(yè)開發(fā)技術(shù)。
? AJAX的工作原理
Ajax的工作原理相當(dāng)于在用戶和服務(wù)器之間加了—個(gè)中間層(AJAX引擎),使用戶操作與服務(wù)器響應(yīng)異步化。并不是所有的用戶請(qǐng)求都提交給服務(wù)器,像—些數(shù)據(jù)驗(yàn)證和數(shù)據(jù)處理等都交給Ajax引擎自己來(lái)做, 只有確定需要從服務(wù)器讀取新數(shù)據(jù)時(shí)再由Ajax引擎代為向服務(wù)器提交請(qǐng)求。
o Ajax的一個(gè)最大的特點(diǎn)是無(wú)需刷新頁(yè)面便可向服務(wù)器傳輸或讀寫數(shù)據(jù)(又稱無(wú)刷新更新頁(yè)面),這一特點(diǎn)主要得益于XMLHTTP組件XMLHTTPRequest對(duì)象。
o 無(wú)刷新更新數(shù)據(jù)、異步與服務(wù)器通信、前后端負(fù)載平衡、基于標(biāo)準(zhǔn)被廣泛支持、界面與應(yīng)用分離。
22、代碼調(diào)試都是怎么做的?怎們看是哪那個(gè)類調(diào)用了當(dāng)前方法?
單步調(diào)式
查看被調(diào)用的類可以右鍵Prferences->project查看
23、怎么區(qū)分線程是哪一個(gè)?java能獲取當(dāng)前線程的ID嗎
可以使用getThreadId獲取一個(gè)線程的ID,可以獲取當(dāng)前線程的Name,等線程信息
24、類加載機(jī)制,什么時(shí)候加載?jvm加載?
筆試:
1、給定一個(gè)n,求最少有幾個(gè)平方數(shù)的和是n, (遞歸)
平方數(shù)為1,4,9,16,。。。
N = 1時(shí):n=1;
N=12 時(shí),n=4+4+4;
N=13時(shí),n=9+4;
…
2、判斷一顆二叉排序樹
3、一個(gè)矩陣中的元素有正有負(fù),求這個(gè)矩陣子矩陣的最大和
答案:http://blog.csdn.net/beiyeqingteng/article/details/7056687
4、給定一個(gè)字符串,判斷其是不是一個(gè)整數(shù),整數(shù)的標(biāo)志是由0-9組成,可包含【、】,-;
如[123]]為123
第一題:http://blog.csdn.net/big_c_god/article/details/52344934
int MixFuntion(int n)
{
int i = sqrt(n);
if (ii == n)
return 1;
int minLen = INT_MAX;
for(;ii >= n/2;i--)
{
int len = 1 + MinExpressionInteger(n - i*i);
if (minLen > len)
minLen = len;
}
return minLen;
}