2017 最新java面試題(技術面試)

1、servlet執行流程

客戶端發出http請求,web服務器將請求轉發到servlet容器,servlet容器解析url並根據web.xml找到相對應的servlet,並將requestresponse對象傳遞給找到的servletservlet根據request就可以知道是誰發出的請求,請求信息及其他信息,當servlet處理完業務邏輯後會將信息放入到response並響應到客戶端。

2、springMVC的執行流程

springMVC是由dispatchservlet爲核心的分層控制框架。首先客戶端發出一個請求web服務器解析請求url並去匹配dispatchservlet的映射url,如果匹配上就將這個請求放入到dispatchservletdispatchservlet根據mapping映射配置去尋找相對應的handel,然後把處理權交給找到的handelhandel封裝了處理業務邏輯的代碼,當handel處理完後會返回一個邏輯視圖modelandviewdispatchservlet,此時的modelandview是一個邏輯視圖不是一個正式視圖,所以dispatchservlet會通過viewresource視圖資源去解析modelandview,然後將解析後的參數放到view中返回到客戶端並展現。

3、給定一個txt文件,如何得到某字符串出現的次數

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設計模式思想(單列模式,工廠模式,策略模式,共23種設計模式)

a) 單例模式:單例模式核心只需要new一個實例對象的模式,比如數據庫連接,在線人數等,一些網站上看到的在線人數統計就是通過單例模式實現的,把一個計時器存放在數據庫或者內存中,當有人登陸的時候取出來加一再放回去,有人退出登陸的時候取出來減一再放回去,但是當有兩個人同時登陸的時候,會同時取出計數器,同時加一,同時放回去,這樣的話數據就會錯誤,所以需要一個全局變量的對象給全部人使用,只需要new出一個實例對象,這就是單例模式的應用,並且單例模式節省資源,因爲它控制了實例對象的個數,並有利於gc回收。

b) 策略模式:就是將幾個類中公共的方法提取到一個新的類中,從而使擴展更容易,保證代碼的可移植性,可維護性強。比如有個需求是寫鴨子對象,鴨子有叫,飛,外形這三種方法,如果每個鴨子類都寫這三個方法會出現代碼的冗餘,這時候我們可以把鴨子中的叫,飛,外形這三個方法提取出來,放到鴨父類中,讓每個鴨子都繼承這個鴨父類,重寫這三個方法,這樣封裝的代碼可移植性強,當用戶提出新的需求比如鴨子會游泳,那麼對於我們oo程序員來講就非常簡單了我們只需要在鴨父類中加一個游泳的方法,讓會游泳的鴨子重寫游泳方法就可以了。

c) 工廠模式:簡單的工廠模式主要是統一提供實例對象的引用,通過工廠模式接口獲取實例對象的引用。比如一個登陸功能,後端有三個類,controller類,interface類,實現接口的實現類。當客戶端發出一個請求,當請求傳到controller類中時,controller獲取接口的引用對象,而實現接口的實現類中封裝好了登陸的業務邏輯代碼。當你需要加一個註冊需求的時候只需要在接口類中加一個註冊方法,實現類中實現方法,controller獲取接口的引用對象即可,不需要改動原來的代碼,這種做法是的可拓展性強。

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、ajax的理解

a) Ajax爲異步請求,即局部刷新技術,在傳統的頁面中,用戶需要點擊按鈕或者事件觸發請求,到刷新頁面,而異步技術爲不需要點擊即可觸發事件,這樣使得用戶體驗感增強,比如商城購物車的異步加載,當你點擊商品時無需請求後臺而直接動態修改參數。

9、父類與子類之間的調用順序(打印結果)

a) 父類靜態代碼塊

b) 子類靜態代碼塊

c) 父類構造方法

d) 子類構造方法

e) 子類普通方法

f) 重寫父類的方法,則打印重寫後的方法

10、內部類與外部類的調用

a) 內部類可以直接調用外部類包括private的成員變量,使用外部類引用的this.關鍵字調用即可

b) 而外部類調用內部類需要建立內部類對象

11、多線程

a)一個進程是一個獨立的運行環境,可以看做是一個程序,而線程可以看做是進程的一個任務,比如QQ是一個進程,而一個QQ窗口是一個線程。

b)在多線程程序中,多線程併發可以提高程序的效率,cpu不會因爲某個線程等待資源而進入空閒狀態,它會把資源讓給其他的線程。

c)用戶線程就是我們開發程序是創建的線程,而守護線程爲系統線程,如JVM虛擬中的GC

d)線程的優先級別:每一個線程都有優先級別,有限級別高的可以先獲取CPU資源使該線程從就緒狀態轉爲運行狀態。也可以自定義線程的有限級別

e)死鎖:至少兩個以上線程爭取兩個以上cpu資源,避免死鎖就避免使用嵌套鎖,只需要在他們需要同步的地方加鎖和避免無限等待

12、AOPIOC的概念(即spring的核心)

a) IOCSpring是開源框架,使用框架可以使我們減少工作量,提高工作效率並且它是分層結構,即相對應的層處理對應的業務邏輯,減少代碼的耦合度。而spring的核心是IOC控制反轉和AOP面向切面編程。IOC控制反轉主要強調的是程序之間的關係是由容器控制的,容器控制對象,控制了對外部資源的獲取。而反轉即爲,在傳統的編程中都是由我們創建對象獲取依賴對象,而在IOC中是容器幫我們創建對象並注入依賴對象,正是容器幫我們查找和注入對象,對象是被獲取,所以叫反轉。

b) AOP:面向切面編程,主要是管理系統層的業務,比如日誌,權限,事物等。AOP是將封裝好的對象剖開,找出其中對多個對象產生影響的公共行爲,並將其封裝爲一個可重用的模塊,這個模塊被命名爲切面(aspect),切面將那些與業務邏輯無關,卻被業務模塊共同調用的邏輯提取並封裝起來,減少了系統中的重複代碼,降低了模塊間的耦合度,同時提高了系統的可維護性。

13、hibernate的核心思想

a) Hibernate的核心思想是ROM對象關係映射機制。它是將表與表之間的操作映射成對象與對象之間的操作。也就是從數據庫中提取的信息會自動按照你設置的映射要求封裝成特定的對象。所以hibernate就是通過將數據表實體類的映射,使得對對象的修改對應數據行的修改。

14、Struts1Struts2的區別

15、最優刪除謀字符串的某個字符

16、Arraylistlinkedlist的區別

a) 都是實現list接口的列表,arraylist是基於數組的數據結構,linkedlist是基於鏈表的數據結構,當獲取特定元素時,ArrayList效率比較快,它通過數組下標即可獲取,而linkedlist則需要移動指針。當存儲元素與刪除元素時linkedlist效率較快,只需要將指針移動指定位置增加或者刪除即可,而arraylist需要移動數據。

17、mybatiesibatise的區別

18、數據庫優化

a) 選擇合適的字段,比如郵箱字段可以設爲char6),儘量把字段設置爲notnull,這樣查詢的時候數據庫就不需要比較null

b) 使用關聯查詢( left join on)查詢代替子查詢

c) 使用union聯合查詢手動創建臨時表

d) 開啓事物,當數據庫執行多條語句出現錯誤時,事物會回滾,可以維護數據庫的完整性

e) 使用外鍵,事物可以維護數據的完整性但是它卻不能保證數據的關聯性,使用外鍵可以保證數據的關聯性

f) 使用索引,索引是提高數據庫性能的常用方法,它可以令數據庫服務器以比沒有索引快的多的速度檢索特定的行,特別是對於maxminorder by查詢時,效果更明顯

g) 優化的查詢語句,絕大多數情況下,使用索引可以提高查詢的速度,但如果sql語句使用不恰當的話,索引無法發揮它的特性。

19、Tomcat服務器優化(內存,併發連接數,緩存)

a) 內存優化:主要是對Tomcat啓動參數進行優化,我們可以在Tomcat啓動腳本中修改它的最大內存數等等。

b) 線程數優化:Tomcat的併發連接參數,主要在Tomcat配置文件中server.xml中配置,比如修改最小空閒連接線程數,用於提高系統處理性能等等。

c) 優化緩存:打開壓縮功能,修改參數,比如壓縮的輸出內容大小默認爲2KB,可以適當的修改。

20、HTTP協議

a) 常用的請求方法有getpost

b) Getpost的區別:傳送數據,get攜帶參數與訪問地址傳送,用戶可以看見,這的話信息會不安全,導致信息泄露。而post則將字段與對應值封裝在實體中傳送,這個過程用戶是不可見的。Get傳遞參數有限制,而post無限制。

21、TCP/UDP協議

22、Java集合類框架的基本接口有哪些

a) Collection集合接口,Listset實現Collection接口,arraylistlinkedlistvector實現list接口,stack繼承vectorMap接口,hashtablehashmap實現map接口

23、類加載的過程

a) 遇到一個新的類時,首先會到方法區去找class文件,如果沒有找到就會去硬盤中找class文件,找到後會返回,將class文件加載到方法區中,在類加載的時候,靜態成員變量會被分配到方法區的靜態區域,非靜態成員變量分配到非靜態區域,然後開始給靜態成員變量初始化,賦默認值,賦完默認值後,會根據靜態成員變量書寫的位置賦顯示值,然後執行靜態代碼。當所有的靜態代碼執行完,類加載纔算完成。

24、對象的創建

a) 遇到一個新類時,會進行類的加載,定位到class文件

b) 對所有靜態成員變量初始化,靜態代碼塊也會執行,而且只在類加載的時候執行一次

c) New 對象時,jvm會在堆中分配一個足夠大的存儲空間

d) 存儲空間清空,爲所有的變量賦默認值,所有的對象引用賦值爲null

e) 根據書寫的位置給字段一些初始化操作

f) 調用構造器方法(沒有繼承)

25、jvm的優化

a) 設置參數,設置jvm的最大內存數

b) 垃圾回收器的選擇

26、高併發處理

a) 瞭解一點高併發性問題,比如一W人搶一張票時,如何保證票在沒買走的情況下所有人都能看見這張票,顯然是不能用同步機制,因爲synchronize是鎖同步一次只能一個人進行。這時候可以用到鎖機制,採用樂觀鎖可以解決這個問題。樂觀鎖的簡單意思是在不鎖定表的情況下,利用業務的控制來解決併發問題,這樣即保證數據的可讀性,又保證保存數據的排他性,保證性能的同時解決了併發帶來的髒讀數據問題。

27、事物的理解

a) 事物具有原子性,一致性,持久性,隔離性

b) 原子性:是指在一個事物中,要麼全部執行成功,要麼全部失敗回滾。

c) 一致性:事物執行之前和執行之後都處於一致性狀態

d) 持久性:事物多數據的操作是永久性

e) 隔離性:當一個事物正在對數據進行操作時,另一個事物不可以對數據進行操作,也就是多個併發事物之間相互隔離。

28、Struts工作流程

a) 客戶端發出一個請求到servlet容器

b) 請求經過一些列過濾被filterdispatcher調用,filterdispatch通過actionMapper去找相對應的action

c) Actionmapper找到對應的action返回給filterdispatchdispatch把處理權交給actionproxy

d) Actionproxy通過配置文件找到對應的action

e) Actionproxy創建一個actionIinvocation的實例處理業務邏輯

f) 一旦action處理完畢,actioninvocation負責根據stuts.xml的配置找到對應的返回結果。返回結果通常是jsp頁面。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章