2018年java技術(shù)面試題整理
1、servlet執(zhí)行流程
客戶(hù)端發(fā)出http請(qǐng)求,web服務(wù)器將請(qǐng)求轉(zhuǎn)發(fā)到servlet容器,servlet容器解析url并根據(jù)web.xml找到相對(duì)應(yīng)的servlet,并將request、response對(duì)象傳遞給找到的servlet,servlet根據(jù)request就可以知道是誰(shuí)發(fā)出的請(qǐng)求,請(qǐng)求信息及其他信息,當(dāng)servlet處理完業(yè)務(wù)邏輯后會(huì)將信息放入到response并響應(yīng)到客戶(hù)端。
2、springMVC的執(zhí)行流程
springMVC是由dispatchservlet為核心的分層控制框架。首先客戶(hù)端發(fā)出一個(gè)請(qǐng)求web服務(wù)器解析請(qǐng)求url并去匹配dispatchservlet的映射url,如果匹配上就將這個(gè)請(qǐng)求放入到dispatchservlet,dispatchservlet根據(jù)mapping映射配置去尋找相對(duì)應(yīng)的handel,然后把處理權(quán)交給找到的handel,handel封裝了處理業(yè)務(wù)邏輯的代碼,當(dāng)handel處理完后會(huì)返回一個(gè)邏輯視圖modelandview給dispatchservlet,此時(shí)的modelandview是一個(gè)邏輯視圖不是一個(gè)正式視圖,所以dispatchservlet會(huì)通過(guò)viewresource視圖資源去解析modelandview,然后將解析后的參數(shù)放到view中返回到客戶(hù)端并展現(xiàn)。
3、給定一個(gè)txt文件,如何得到某字符串出現(xiàn)的次數(shù)
File file = new File("E://test.txt"); InputStream is = new FileInputStream(file); byte b[] = new byte[1024]; int a = is.read(b); String str[] = new String(b,0,a).split(""); int count = 0; for(int i = 0;i<str.length;i++){ if("a".equals(str[i]))count++; } System.out.println(count);
4、Java設(shè)計(jì)模式思想(單列模式,工廠(chǎng)模式,策略模式,共23種設(shè)計(jì)模式)
a) 單例模式:?jiǎn)卫J胶诵闹恍枰猲ew一個(gè)實(shí)例對(duì)象的模式,比如數(shù)據(jù)庫(kù)連接,在線(xiàn)人數(shù)等,一些網(wǎng)站上看到的在線(xiàn)人數(shù)統(tǒng)計(jì)就是通過(guò)單例模式實(shí)現(xiàn)的,把一個(gè)計(jì)時(shí)器存放在數(shù)據(jù)庫(kù)或者內(nèi)存中,當(dāng)有人登陸的時(shí)候取出來(lái)加一再放回去,有人退出登陸的時(shí)候取出來(lái)減一再放回去,但是當(dāng)有兩個(gè)人同時(shí)登陸的時(shí)候,會(huì)同時(shí)取出計(jì)數(shù)器,同時(shí)加一,同時(shí)放回去,這樣的話(huà)數(shù)據(jù)就會(huì)錯(cuò)誤,所以需要一個(gè)全局變量的對(duì)象給全部人使用,只需要new出一個(gè)實(shí)例對(duì)象,這就是單例模式的應(yīng)用,并且單例模式節(jié)省資源,因?yàn)樗刂屏藢?shí)例對(duì)象的個(gè)數(shù),并有利于gc回收。
b) 策略模式:就是將幾個(gè)類(lèi)中公共的方法提取到一個(gè)新的類(lèi)中,從而使擴(kuò)展更容易,保證代碼的可移植性,可維護(hù)性強(qiáng)。比如有個(gè)需求是寫(xiě)鴨子對(duì)象,鴨子有叫,飛,外形這三種方法,如果每個(gè)鴨子類(lèi)都寫(xiě)這三個(gè)方法會(huì)出現(xiàn)代碼的冗余,這時(shí)候我們可以把鴨子中的叫,飛,外形這三個(gè)方法提取出來(lái),放到鴨父類(lèi)中,讓每個(gè)鴨子都繼承這個(gè)鴨父類(lèi),重寫(xiě)這三個(gè)方法,這樣封裝的代碼可移植性強(qiáng),當(dāng)用戶(hù)提出新的需求比如鴨子會(huì)游泳,那么對(duì)于我們oo程序員來(lái)講就非常簡(jiǎn)單了我們只需要在鴨父類(lèi)中加一個(gè)游泳的方法,讓會(huì)游泳的鴨子重寫(xiě)游泳方法就可以了。
c) 工廠(chǎng)模式:簡(jiǎn)單的工廠(chǎng)模式主要是統(tǒng)一提供實(shí)例對(duì)象的引用,通過(guò)工廠(chǎng)模式接口獲取實(shí)例對(duì)象的引用。比如一個(gè)登陸功能,后端有三個(gè)類(lèi),controller類(lèi),interface類(lèi),實(shí)現(xiàn)接口的實(shí)現(xiàn)類(lèi)。當(dāng)客戶(hù)端發(fā)出一個(gè)請(qǐng)求,當(dāng)請(qǐng)求傳到controller類(lèi)中時(shí),controller獲取接口的引用對(duì)象,而實(shí)現(xiàn)接口的實(shí)現(xiàn)類(lèi)中封裝好了登陸的業(yè)務(wù)邏輯代碼。當(dāng)你需要加一個(gè)注冊(cè)需求的時(shí)候只需要在接口類(lèi)中加一個(gè)注冊(cè)方法,實(shí)現(xiàn)類(lèi)中實(shí)現(xiàn)方法,controller獲取接口的引用對(duì)象即可,不需要改動(dòng)原來(lái)的代碼,這種做法是的可拓展性強(qiáng)。
5、冒泡排序、二分查找
a) 冒泡
public static void mp(int a[]) { int swap = 0; for (int i = 0; i < a.length; i++) { for (int j = i; j < a.length; j++) { if (a[j] > a[i]) { swap = a[i]; a[i] = a[j]; a[j] = swap; } } } System.out.println(Arrays.toString(a)); }
b)二分查找
public static int ef(int a[], int tag) { int first = 0; int end = a.length; for (int i = 0; i < a.length; i++) { int middle = (first + end) / 2; if (tag == a[middle]) { return middle; } if (tag > a[middle]) { first = middle + 1; } if (tag < a[middle]) { end = middle - 1; } } return 0; }
6-8、對(duì)ajax的理解
a) Ajax為異步請(qǐng)求,即局部刷新技術(shù),在傳統(tǒng)的頁(yè)面中,用戶(hù)需要點(diǎn)擊按鈕或者事件觸發(fā)請(qǐng)求,到刷新頁(yè)面,而異步技術(shù)為不需要點(diǎn)擊即可觸發(fā)事件,這樣使得用戶(hù)體驗(yàn)感增強(qiáng),比如商城購(gòu)物車(chē)的異步加載,當(dāng)你點(diǎn)擊商品時(shí)無(wú)需請(qǐng)求后臺(tái)而直接動(dòng)態(tài)修改參數(shù)。
9、父類(lèi)與子類(lèi)之間的調(diào)用順序(打印結(jié)果)
a) 父類(lèi)靜態(tài)代碼塊
b) 子類(lèi)靜態(tài)代碼塊
c) 父類(lèi)構(gòu)造方法
d) 子類(lèi)構(gòu)造方法
e) 子類(lèi)普通方法
f) 重寫(xiě)父類(lèi)的方法,則打印重寫(xiě)后的方法
10、內(nèi)部類(lèi)與外部類(lèi)的調(diào)用
a) 內(nèi)部類(lèi)可以直接調(diào)用外部類(lèi)包括private的成員變量,使用外部類(lèi)引用的this.關(guān)鍵字調(diào)用即可
b) 而外部類(lèi)調(diào)用內(nèi)部類(lèi)需要建立內(nèi)部類(lèi)對(duì)象
11、多線(xiàn)程
a)一個(gè)進(jìn)程是一個(gè)獨(dú)立的運(yùn)行環(huán)境,可以看做是一個(gè)程序,而線(xiàn)程可以看做是進(jìn)程的一個(gè)任務(wù),比如QQ是一個(gè)進(jìn)程,而一個(gè)QQ窗口是一個(gè)線(xiàn)程。
b)在多線(xiàn)程程序中,多線(xiàn)程并發(fā)可以提高程序的效率,cpu不會(huì)因?yàn)槟硞€(gè)線(xiàn)程等待資源而進(jìn)入空閑狀態(tài),它會(huì)把資源讓給其他的線(xiàn)程。
c)用戶(hù)線(xiàn)程就是我們開(kāi)發(fā)程序是創(chuàng)建的線(xiàn)程,而守護(hù)線(xiàn)程為系統(tǒng)線(xiàn)程,如JVM虛擬中的GC
d)線(xiàn)程的優(yōu)先級(jí)別:每一個(gè)線(xiàn)程都有優(yōu)先級(jí)別,有限級(jí)別高的可以先獲取CPU資源使該線(xiàn)程從就緒狀態(tài)轉(zhuǎn)為運(yùn)行狀態(tài)。也可以自定義線(xiàn)程的有限級(jí)別
e)死鎖:至少兩個(gè)以上線(xiàn)程爭(zhēng)取兩個(gè)以上cpu資源,避免死鎖就避免使用嵌套鎖,只需要在他們需要同步的地方加鎖和避免無(wú)限等待
12、AOP與IOC的概念(即spring的核心)
a) IOC:Spring是開(kāi)源框架,使用框架可以使我們減少工作量,提高工作效率并且它是分層結(jié)構(gòu),即相對(duì)應(yīng)的層處理對(duì)應(yīng)的業(yè)務(wù)邏輯,減少代碼的耦合度。而spring的核心是IOC控制反轉(zhuǎn)和AOP面向切面編程。IOC控制反轉(zhuǎn)主要強(qiáng)調(diào)的是程序之間的關(guān)系是由容器控制的,容器控制對(duì)象,控制了對(duì)外部資源的獲取。而反轉(zhuǎn)即為,在傳統(tǒng)的編程中都是由我們創(chuàng)建對(duì)象獲取依賴(lài)對(duì)象,而在IOC中是容器幫我們創(chuàng)建對(duì)象并注入依賴(lài)對(duì)象,正是容器幫我們查找和注入對(duì)象,對(duì)象是被獲取,所以叫反轉(zhuǎn)。
b) AOP:面向切面編程,主要是管理系統(tǒng)層的業(yè)務(wù),比如日志,權(quán)限,事物等。AOP是將封裝好的對(duì)象剖開(kāi),找出其中對(duì)多個(gè)對(duì)象產(chǎn)生影響的公共行為,并將其封裝為一個(gè)可重用的模塊,這個(gè)模塊被命名為切面(aspect),切面將那些與業(yè)務(wù)邏輯無(wú)關(guān),卻被業(yè)務(wù)模塊共同調(diào)用的邏輯提取并封裝起來(lái),減少了系統(tǒng)中的重復(fù)代碼,降低了模塊間的耦合度,同時(shí)提高了系統(tǒng)的可維護(hù)性。
13、hibernate的核心思想
a) Hibernate的核心思想是ROM對(duì)象關(guān)系映射機(jī)制。它是將表與表之間的操作映射成對(duì)象與對(duì)象之間的操作。也就是從數(shù)據(jù)庫(kù)中提取的信息會(huì)自動(dòng)按照你設(shè)置的映射要求封裝成特定的對(duì)象。所以hibernate就是通過(guò)將數(shù)據(jù)表實(shí)體類(lèi)的映射,使得對(duì)對(duì)象的修改對(duì)應(yīng)數(shù)據(jù)行的修改。
14、Struts1與Struts2的區(qū)別
15、最優(yōu)刪除謀字符串的某個(gè)字符
16-17、Arraylist與linkedlist的區(qū)別
a) 都是實(shí)現(xiàn)list接口的列表,arraylist是基于數(shù)組的數(shù)據(jù)結(jié)構(gòu),linkedlist是基于鏈表的數(shù)據(jù)結(jié)構(gòu),當(dāng)獲取特定元素時(shí),ArrayList效率比較快,它通過(guò)數(shù)組下標(biāo)即可獲取,而linkedlist則需要移動(dòng)指針。當(dāng)存儲(chǔ)元素與刪除元素時(shí)linkedlist效率較快,只需要將指針移動(dòng)指定位置增加或者刪除即可,而arraylist需要移動(dòng)數(shù)據(jù)。
18、數(shù)據(jù)庫(kù)優(yōu)化
a) 選擇合適的字段,比如郵箱字段可以設(shè)為char(6),盡量把字段設(shè)置為notnull,這樣查詢(xún)的時(shí)候數(shù)據(jù)庫(kù)就不需要比較null值
b) 使用關(guān)聯(lián)查詢(xún)( left join on)查詢(xún)代替子查詢(xún)
c) 使用union聯(lián)合查詢(xún)手動(dòng)創(chuàng)建臨時(shí)表
d) 開(kāi)啟事物,當(dāng)數(shù)據(jù)庫(kù)執(zhí)行多條語(yǔ)句出現(xiàn)錯(cuò)誤時(shí),事物會(huì)回滾,可以維護(hù)數(shù)據(jù)庫(kù)的完整性
e) 使用外鍵,事物可以維護(hù)數(shù)據(jù)的完整性但是它卻不能保證數(shù)據(jù)的關(guān)聯(lián)性,使用外鍵可以保證數(shù)據(jù)的關(guān)聯(lián)性
f) 使用索引,索引是提高數(shù)據(jù)庫(kù)性能的常用方法,它可以令數(shù)據(jù)庫(kù)服務(wù)器以比沒(méi)有索引快的多的速度檢索特定的行,特別是對(duì)于max,min,order by查詢(xún)時(shí),效果更明顯
g) 優(yōu)化的查詢(xún)語(yǔ)句,絕大多數(shù)情況下,使用索引可以提高查詢(xún)的速度,但如果sql語(yǔ)句使用不恰當(dāng)?shù)脑?huà),索引無(wú)法發(fā)揮它的特性。
19、Tomcat服務(wù)器優(yōu)化(內(nèi)存,并發(fā)連接數(shù),緩存)
a) 內(nèi)存優(yōu)化:主要是對(duì)Tomcat啟動(dòng)參數(shù)進(jìn)行優(yōu)化,我們可以在Tomcat啟動(dòng)腳本中修改它的最大內(nèi)存數(shù)等等。
b) 線(xiàn)程數(shù)優(yōu)化:Tomcat的并發(fā)連接參數(shù),主要在Tomcat配置文件中server.xml中配置,比如修改最小空閑連接線(xiàn)程數(shù),用于提高系統(tǒng)處理性能等等。
c) 優(yōu)化緩存:打開(kāi)壓縮功能,修改參數(shù),比如壓縮的輸出內(nèi)容大小默認(rèn)為2KB,可以適當(dāng)?shù)男薷摹?br />
20、HTTP協(xié)議
a) 常用的請(qǐng)求方法有g(shù)et、post
b) Get與post的區(qū)別:傳送數(shù)據(jù),get攜帶參數(shù)與訪(fǎng)問(wèn)地址傳送,用戶(hù)可以看見(jiàn),這的話(huà)信息會(huì)不安全,導(dǎo)致信息泄露。而post則將字段與對(duì)應(yīng)值封裝在實(shí)體中傳送,這個(gè)過(guò)程用戶(hù)是不可見(jiàn)的。Get傳遞參數(shù)有限制,而post無(wú)限制。
21、TCP/UDP協(xié)議
22、Java集合類(lèi)框架的基本接口有哪些
a) Collection集合接口,List、set實(shí)現(xiàn)Collection接口,arraylist、linkedlist,vector實(shí)現(xiàn)list接口,stack繼承vector,Map接口,hashtable、hashmap實(shí)現(xiàn)map接口
23、類(lèi)加載的過(guò)程
a) 遇到一個(gè)新的類(lèi)時(shí),首先會(huì)到方法區(qū)去找class文件,如果沒(méi)有找到就會(huì)去硬盤(pán)中找class文件,找到后會(huì)返回,將class文件加載到方法區(qū)中,在類(lèi)加載的時(shí)候,靜態(tài)成員變量會(huì)被分配到方法區(qū)的靜態(tài)區(qū)域,非靜態(tài)成員變量分配到非靜態(tài)區(qū)域,然后開(kāi)始給靜態(tài)成員變量初始化,賦默認(rèn)值,賦完默認(rèn)值后,會(huì)根據(jù)靜態(tài)成員變量書(shū)寫(xiě)的位置賦顯示值,然后執(zhí)行靜態(tài)代碼。當(dāng)所有的靜態(tài)代碼執(zhí)行完,類(lèi)加載才算完成。
24、對(duì)象的創(chuàng)建
a) 遇到一個(gè)新類(lèi)時(shí),會(huì)進(jìn)行類(lèi)的加載,定位到class文件
b) 對(duì)所有靜態(tài)成員變量初始化,靜態(tài)代碼塊也會(huì)執(zhí)行,而且只在類(lèi)加載的時(shí)候執(zhí)行一次
c) New 對(duì)象時(shí),jvm會(huì)在堆中分配一個(gè)足夠大的存儲(chǔ)空間
d) 存儲(chǔ)空間清空,為所有的變量賦默認(rèn)值,所有的對(duì)象引用賦值為null
e) 根據(jù)書(shū)寫(xiě)的位置給字段一些初始化操作
f) 調(diào)用構(gòu)造器方法(沒(méi)有繼承)
25、jvm的優(yōu)化
a) 設(shè)置參數(shù),設(shè)置jvm的最大內(nèi)存數(shù)
b) 垃圾回收器的選擇
26、高并發(fā)處理
a) 了解一點(diǎn)高并發(fā)性問(wèn)題,比如一W人搶一張票時(shí),如何保證票在沒(méi)買(mǎi)走的情況下所有人都能看見(jiàn)這張票,顯然是不能用同步機(jī)制,因?yàn)閟ynchronize是鎖同步一次只能一個(gè)人進(jìn)行。這時(shí)候可以用到鎖機(jī)制,采用樂(lè)觀鎖可以解決這個(gè)問(wèn)題。樂(lè)觀鎖的簡(jiǎn)單意思是在不鎖定表的情況下,利用業(yè)務(wù)的控制來(lái)解決并發(fā)問(wèn)題,這樣即保證數(shù)據(jù)的可讀性,又保證保存數(shù)據(jù)的排他性,保證性能的同時(shí)解決了并發(fā)帶來(lái)的臟讀數(shù)據(jù)問(wèn)題。
27、事物的理解
a) 事物具有原子性,一致性,持久性,隔離性
b) 原子性:是指在一個(gè)事物中,要么全部執(zhí)行成功,要么全部失敗回滾。
c) 一致性:事物執(zhí)行之前和執(zhí)行之后都處于一致性狀態(tài)
d) 持久性:事物多數(shù)據(jù)的操作是永久性
e) 隔離性:當(dāng)一個(gè)事物正在對(duì)數(shù)據(jù)進(jìn)行操作時(shí),另一個(gè)事物不可以對(duì)數(shù)據(jù)進(jìn)行操作,也就是多個(gè)并發(fā)事物之間相互隔離。
28、Struts工作流程
a) 客戶(hù)端發(fā)出一個(gè)請(qǐng)求到servlet容器
b) 請(qǐng)求經(jīng)過(guò)一些列過(guò)濾被filterdispatcher調(diào)用,filterdispatch通過(guò)actionMapper去找相對(duì)應(yīng)的action。
c) Actionmapper找到對(duì)應(yīng)的action返回給filterdispatch,dispatch把處理權(quán)交給actionproxy
d) Actionproxy通過(guò)配置文件找到對(duì)應(yīng)的action類(lèi)
e) Actionproxy創(chuàng)建一個(gè)actionIinvocation的實(shí)例處理業(yè)務(wù)邏輯
f) 一旦action處理完畢,actioninvocation負(fù)責(zé)根據(jù)stuts.xml的配置找到對(duì)應(yīng)的返回結(jié)果。返回結(jié)果通常是jsp頁(yè)面。
- 15個(gè)高級(jí)Java多線(xiàn)程面試題及回答
- 探討Java中最常見(jiàn)的十道面試題(超經(jīng)典)
- 最有價(jià)值的50道java面試題 適用于準(zhǔn)入職Java程序員
- JAVA實(shí)現(xiàn)鏈表面試題
- 關(guān)于Java集合框架面試題(含答案)上
- Java中類(lèi)的加載順序剖析(常用于面試題)
- Java常見(jiàn)數(shù)據(jù)結(jié)構(gòu)面試題(帶答案)
- java 多態(tài)性詳解及常見(jiàn)面試題
- Java實(shí)現(xiàn)棧和隊(duì)列面試題
- 2018版java多線(xiàn)程面試題集合及答案
相關(guān)文章
MyBatisPlus 查詢(xún)selectOne方法實(shí)現(xiàn)
本文主要介紹了MyBatisPlus 查詢(xún)selectOne方法實(shí)現(xiàn),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2023-01-01IDEA Debug啟動(dòng)tomcat報(bào)60659端口占用錯(cuò)誤的解決
工作中將開(kāi)發(fā)工具由Eclipse轉(zhuǎn)為IntelliJ IDEA,在使用過(guò)程中遇到許多問(wèn)題,其中60659端口占用錯(cuò)誤對(duì)于不熟悉IDEA的開(kāi)發(fā)者來(lái)說(shuō)或許會(huì)比較頭痛,本文就來(lái)解決一下這個(gè)問(wèn)題2018-11-11通過(guò)實(shí)例了解Java Integer類(lèi)和int的區(qū)別
這篇文章主要介紹了通過(guò)實(shí)例了解Java Integer類(lèi)和int的區(qū)別,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-03-03SpringBoot中@EnableAsync和@Async注解的使用小結(jié)
在SpringBoot中,可以通過(guò)@EnableAsync注解來(lái)啟動(dòng)異步方法調(diào)用的支持,通過(guò)@Async注解來(lái)標(biāo)識(shí)異步方法,讓方法能夠在異步線(xiàn)程中執(zhí)行,本文就來(lái)介紹一下,感興趣的可以了解一下2023-11-11詳解spring batch的使用和定時(shí)器Quart的使用
spring Batch是一個(gè)基于Spring的企業(yè)級(jí)批處理框架,它通過(guò)配合定時(shí)器Quartz來(lái)輕易實(shí)現(xiàn)大批量的數(shù)據(jù)讀取或插入,并且全程自動(dòng)化,無(wú)需人員管理2017-08-08Java EE項(xiàng)目中的異常處理總結(jié)(一篇不得不看的文章)
什么是異常?運(yùn)行時(shí)發(fā)生的可被捕獲和處理的錯(cuò)誤。這篇文章主要介紹了Java EE項(xiàng)目中的異常處理總結(jié),有需要的可以了解一下。2016-11-11