Java面試2018常考題目彙總(二)
1、servlet執行流程
客戶端發出http請求,web伺服器將請求轉發到servlet容器,servlet容器解析url並根據web.xml找到相對應的servlet,並將request、response物件傳遞給找到的servlet,servlet根據request就可以知道是誰發出的請求,請求資訊及其他資訊,當servlet處理完業務邏輯後會將資訊放入到response並響應到客戶端。
2、springMVC的執行流程
springMVC是由dispatchservlet為核心的分層控制框架。首先客戶端發出一個請求web伺服器解析請求url並去匹配dispatchservlet的對映url,如果匹配上就將這個請求放入到dispatchservlet,dispatchservlet根據mapping對映配置去尋找相對應的handel,然後把處理權交給找到的handel,handel封裝了處理業務邏輯的程式碼,當handel處理完後會返回一個邏輯檢視modelandview給dispatchservlet,此時的modelandview是一個邏輯檢視不是一個正式檢視,所以dispatchservlet會通過viewresource檢視資源去解析modelandview,然後將解析後的引數放到view中返回到客戶端並展現。
3、給定一個txt檔案,如何得到某字串出現的次數
?12345678910 | File file = new File( ); 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) 冒泡
?12345678910111213 | 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)二分查詢
?1234567891011121314151617 | public static int ef( int a[], int tag) { int first = 0 ; int end = a.length;
|