1. 程式人生 > >2017 最新java面試題

2017 最新java面試題

以下面試題為個人在面試過程中所遇到的,僅供參考!如有錯誤,望指出。

轉載:http://blog.csdn.net/zhangcc233/article/details/77847104

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.lengthi++) {

for (int j = ij < a.lengthj++) {

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.lengthi++) {

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頁面。

最後祝各位程式設計師早日找到心儀的工作

---------------------------------------------------------------------------------------------------------------------

學習一個知識,先要知道為什麼需要,也就是問題為什麼會出現,再去解決,再怎麼運用這個知識。