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