Java面試題 - 02
前言:
接著《Java面試題 - 01》,繼續聊聊剩下的內容。
一、JavaWeb高階:
1. 什麼叫監聽器(listener)?
答:監聽器主要是用來監聽特定物件的建立或銷燬、屬性的變化的,是一個實現特定介面的普通java類。具體實現哪個介面,要看你監聽什麼內容,比如要監聽Request物件的建立或銷燬,就實現ServletRequestListener 介面。它是隨web應用的啟動而啟動,只初始化一次,隨web應用的停止而銷燬。
2. 什麼叫過濾器(filter)?
答:就是對servlet請求起到過濾的作用,它在監聽器之後,作用在servlet之前。比如編碼過濾器,就是經過了該過濾器的請求都會設定成過濾器中指定的編碼。過濾器是隨web應用啟動而啟動,只初始化一次,只有當web應用停止或重新部署的時候才銷燬。
3. 什麼叫攔截器(interceptor)?
答:攔截器類似於fileter ,也是攔截使用者的請求。不同的是,它不需要在web.xml中配置,不隨WEB應用的啟動而啟動,是基於JAVA的反射機制和動態代理實現的。只有呼叫相應的方法時才會呼叫,在面向切面程式設計中應用的。
4. servlet請求的執行過程是怎樣的?
答:過程是這樣的:context-param(初始化配置) --> listener --> filter --> servlet --> interceptor --> 頁面。
5. 談談你對Ajax的認識。
答:Asynchronous JavaScript and XML的縮寫,是一種建立互動式網頁應用的的網頁開發技術。通過非同步提交的方式,可以實現區域性重新整理,在不更新整個頁面的前提下維護資料,提升使用者體驗度。
二、資料庫:
1. select語句的執行順序怎樣的?
答:SQL語言不同於其他程式語言的最明顯特徵是處理程式碼的執行順序。在大多資料庫語言中,程式碼按順序執行,但是SQL語言執行順序如下:
from --> where --> group by分組 --> 聚合函式 --> having篩選分組 --> 計算所有的表示式 --> select的欄位 --> order by排序。
2. 你知道聚合函式嗎?
答:聚合函式是對一組值進行計算並返回單一的值的函式,它經常與select 語句中的 group by 子句一同使用。 比如求平均值的聚合函式是avg()。
3. 你知道連線查詢嗎?
答:連線查詢分為內連線和外連線,內連線顯示錶之間有連線匹配的所有行。外連線又分為左外連線、右外連線和全連線。左外連線就是以左表作為基準進行查詢,左表資料會全部顯示出來,右表如果和左表匹配的資料則顯示相應欄位的資料,如果不匹配則顯示為null。 右連線是以右表作為基準進行查詢,右表資料會全部顯示出來,左表如果和右表匹配的資料則顯示相應欄位的資料,如果不匹配則顯示為null。 全連線是先以左表進行左外連線,再以右表進行右外連線。
4. 事務有幾大特性?分別是什麼?
答:事務有四大特性,ACID。
- 原子性(A):整個事務中的所有操作,要麼全部完成,要麼全部不完成。
- 一致性(C):在事務開始之前和事務結束以後,資料庫的完整性約束沒有被破壞。
- 隔離性(I):如果有兩個事務,執行在相同的時間內,執行 相同的功能,事務的隔離性將確保每一事務在系統中認為只有該事務在使用系統。
- 永續性(D):在事務完成以後,該事務所對資料庫所作的更改便持久的儲存在資料庫之中,並不會被回滾。
5. mysql中的四種隔離級別是什麼?
答:四種隔離級別如下:
- 讀未提交(READ UNCOMMITTED):未提交讀也叫讀髒,就是事務可以讀取其它事務未提交的資料。
- 讀已提交(READ COMMITTED):讀已提交就是在事務未提交之前所做的修改其它事務是不可見的。 在其它資料庫系統比如SQL Server預設的隔離級別就是讀已提交。
- 可重複讀(REPEATABLE READ):保證同一個事務中的多次相同的查詢的結果是一致的,比如一個事務一開始查詢了一條記錄然後過了幾秒鐘又執行了相同的查詢,保證兩次查詢的結果是相同的,可重複讀也是mysql的預設隔離級別。
- 可序列化(SERIALIZABLE):可序列化就是保證讀取的範圍內沒有新的資料插入,比如事務第一次查詢得到某個範圍的資料,第二次查詢也同樣得到了相同範圍的資料,中間沒有新的資料插入到該範圍中。
6. 對於MySQL效能優化,你知道多少?
答:我知道的有以下幾點:
-
當只要一行資料時使用limit 1 。查詢時如果已知會得到一條資料,這種情況下加上 limit 1 會增加效能。因為 mysql 資料庫引擎會在找到一條結果停止搜尋,而不是繼續查詢下一條是否符合標準直到所有記錄查詢完畢。
-
選擇正確的資料庫引擎 。Mysql中有兩個引擎,MyISAM和InnoDB,每個引擎有利有弊。 MyISAM 適用於一些大量查詢的應用,但對於有大量寫功能的應用不是很好。InnoDB是一個非常複雜的儲存引擎,對於一些小的應用會比MyISAM還慢,但是在寫操作比較多的時候會比較優秀。並且,它支援很多的高階應用,例如:事物。
-
用not exists代替not in 。Not exists可以使用索引,not in不能使用索引。在資料量比較大的操作中不建議使用not in 這種方式。
-
對操作符的優化。儘量不採用不利於索引的操作符 ,如:in not in is null is not null <> 等 。
-
limit 的基數比較大時使用 between 。
例如:select * from admin order by admin_id limit 100000,10
優化為:select * from admin where admin_id between 100000 and 100010 order by admin_id。
-
儘量避免在列上做運算,這樣導致索引失效 。
例如:select * from admin where year(admin_time)>2014
優化為: select * from admin where admin_time> '2014-01-01′
三、框架篇:
(一)、Spring
1. 談談你對spring的理解。
答:Spring是一個輕量的開源框架,為簡化企業級應用開發而生,它的核心如下:
-
控制反轉(IOC/">IOC):傳統的java開發模式中,當需要一個物件時,我們會自己使用new或者getInstance等直接或者間接呼叫構造方法建立一個物件。而在spring開發模式中,spring容器使用了工廠模式為我們建立了所需要的物件,不需要我們自己建立了,直接呼叫spring提供的物件就可以了,這就是控制反轉的思想。 控制反轉是一種思想,而不是一種技術。
-
依賴注入(DI):,spring 使用 javaBean 物件的 set 方法或者帶引數的構造方法為我們在建立所需物件時將其屬性自動設定所需要的值,這就是依賴注入的思想。依賴注入就是使用了控制反轉這種思想的一種技術。
-
面向切面程式設計(AOP):在面向物件程式設計(oop)思想中,我們將事物縱向抽成一個個的物件。而在面向切面程式設計中,我們將一個個的物件某些類似的方面橫向抽成一個切面,對這個切面進行一些如許可權控制、事物管理,記錄日誌等公用操作處理,這就是面向切面程式設計的思想。AOP底層是動態代理,如果是介面採用的是JDK動態代理,如果是類採用的是CGLIB方式實現動態代理。
2. 你知道spring框架中使用了哪些設計模式嗎?
答:spring中使用到的部分設計模式如下:
- 單例模式:在spring的配置檔案中設定bean預設為單例模式。
- 模板方法模式:用來解決重複程式碼,JpaTemplate 、RedisTemplate等。
- 前端控制器模式:spring提供了前端控制器DispatherServlet來對請求進行分發。
- 工廠模式:Spring中使用beanFactory來建立物件的例項,就是用的工廠模式。
3. 介紹一下spring bean的生命週期。
答:bean的生命週期為 建立 --> 初始化 --> 呼叫 --> 銷燬。
4. 說一說spring有哪些核心模組?
答:主要有以下七大核心模組:

七大核心模組
-
Core模組:封裝了框架依賴的最底層部分,包括資源訪問、型別轉換及一些常用工具類。
-
Context模組:以Core和Beans為基礎,整合Beans模組功能並新增資源繫結、資料驗證、國際化、Java EE支援、容器生命週期、事件傳播等,核心介面是ApplicationContext。
-
AOP模組:面向切面程式設計,通過配置管理特性,spring AOP直接將面向切面的程式設計集中到了框架中,所以可以很容易使spring管理的物件支援AOP。
-
ORM模組:Spring的ORM模組提供了對常用ORM框架如Hibernate,Mybaties等的輔助和支援,他本身更並不實現ORM,僅僅對常見的ORM框架進行封裝並對其進行管理。
-
DAO模組:通常編寫資料庫程式碼時總要寫一些樣板似的內容,如獲取連線,建立語句,釋放連線等 ,Dao模組將這些模板抽象出來,使得資料庫程式碼變得簡單明瞭,也可以避免因為釋放資料庫資源失敗而導致的問題。
-
WEB模組:提供了基本的面向web的整合功能,例如多個檔案的上傳功能、使用servlet監聽器、面向web應用程式的上下文來初始化IOC容器,還實現了springMVC。
-
WEB MVC模組:該模組為spring提供了一套輕量級的mvc實現,他還可以支援和管理其他的mvc框架,如struts。相對於struts,spring自己的mvc框架更加簡潔和方便。
5. 請描述一下spring的事務。
答:Spring既支援程式設計式事務管理(也稱編碼式事務),也支援宣告式的事務管理。程式設計式事務就是把事務寫在業務邏輯程式碼中,宣告式事務是將事務管理程式碼從業務方法中分離出來,以宣告的方式來實現事務管理。大多數情況下比程式設計式事務管理更好用。宣告式事務可以在配置檔案中用<tx >標籤來實現,也可以在需要使用事務的方法上加@Transaction註解。
6. 如何理解spring的 IOC容器?
答:IOC就是控制反轉,這是一種思想而不是一種技術。通常建立物件是由程式設計師來new的,而"控制反轉"是指new例項的工作不由程式設計師來做,而是交給Spring容器來做。在Spring中BeanFactory是IOC容器的實際代表者。
7. ApplicationContext是幹嘛的?有哪些實現類?
答:ApplicationContext是“應用容器”,繼承自BeanFactory。Spring把Bean放在這個容器中,在需要的時候,用getBean方法取出。它的實現有以下三個:
-
FileSystemXmlApplicationContext :從指定的檔案系統路徑中尋找指定的XML配置檔案,找到並裝載完成ApplicationContext的例項化工作。
-
ClassPathXmlApplicationContext:從類路徑ClassPath中尋找指定的XML配置檔案,找到並裝載完成ApplicationContext的例項化工作。
-
XmlWebApplicationContext:從Web應用中尋找指定的XML配置檔案,找到並裝載完成ApplicationContext的例項化工作。
8. BeanFactory與AppliacationContext有什麼區別?
答:BeanFactory 是基礎型別的IOC容器,提供完整的IOC服務支援。ApplicationContext 是在 BeanFactory 的基礎上構建,是相對比較高階的容器,除了 BeanFactory 的所有支援外,ApplicationContext還提供了事件釋出、國際化支援等功能。
9. 依賴注入有哪些實現方式?
答:spring提供了以下四種依賴注入的方式:
- 使用Set方法注入
- 使用構造方法注入
- 使用靜態工廠注入
- 使用例項工廠注入
10. 什麼是spring beans?
答:spring beans 就是被spring容器初始化、配置和管理的物件。
11. 一個spring beans 的定義需要包含什麼?
答:一個 Spring Bean 的定義包含容器必知的所有配置元資料,包括如何建立一個 bean,它的生命週期詳情及它的依賴。
12. spring支援幾種類的作用域?
答:spring在配置bean的時候,可以通過scope屬性來定義作用域,scope屬性有以下5個值:
- singleton : bean在每個Spring ioc 容器中只有一個例項。 預設就是singleton,它是執行緒不安全的。
- prototype:每一次請求都會產生一個新的bean例項。
- request:request表示針對每一次HTTP請求都會產生一個新的bean,同時該bean僅在當前HTTP request內有效。
- session:作用域表示針對每一次HTTP請求都會產生一個新的bean,同時該bean僅在當前HTTP session內有效。
- global session:作用域類似於標準的HTTP Session作用域,不過它僅僅在基於portlet的web應用中才有意義。
13. 怎麼開啟spring的註解裝配?
答:spring預設是沒有開啟註解的,要使用註解,我們必須在 Spring 配置檔案中配置 <context:annotation-config/>元素。
14. 簡單的說一下AOP程式設計中的相關概念。
答:主要有如下概念:
- Joinpoint(連線點) : 類裡面可以被增強的方法,這些方法稱為連線點 。
- Pointcut(切入點):在哪些類的哪些方法上切入(where)。
- Advice(通知/增強) :攔截到Joinpoint之後所要做的事情就是通知。通知分為前置通知、後置通知、異常通知、最終通知、環繞通知。
- Aspect(切面) : 切面 = 切入點 + 通知,通俗點就是:在什麼時機,什麼地方,做什麼增強。
- Weaving(織入) :把切面加入到物件,並創建出代理物件的過程。(由 Spring 來完成)。
- Target(目標物件) :需要增強的類就是目標物件。
- Proxy(代理) :一個類被AOP織入增強後,就產生一個代理類。
(二)、SpringMVC
1. 什麼是springMVC?
答:Spring MVC是一種基於Java的實現了Web MVC設計模式的請求驅動型別的輕量級Web框架。使用了MVC架構模式的思想,將web層進行職責解耦,基於請求驅動指的就是使用請求-響應模型。框架的目的就是幫助我們簡化開發。
2. 簡單描述一下SpringMVC的工作原理。
答:工作原理如下:
- 使用者向伺服器傳送請求,請求被springMVC前端控制器DispatcherServlet捕獲;
- 由DispatcherServlet控制器找到處理請求的Controller;
- DispatcherServlet將請求提交到Controller;
- Controller呼叫業務邏輯處理後,返回ModelAndView給DispatcherServlet;
- DispatcherServlet查詢一個或多個ViewResoler檢視解析器,找到ModelAndView指定的檢視;
- ViewResoler 解析出 ModelAndView()中的引數,將檢視返回給客戶端; 。
3. springMVC有什麼優點?
答:它是基於元件技術的,全部的應用物件,無論控制器和檢視,還是業務物件之類的都是 java元件;可以任意使用各種檢視技術,而不僅僅侷限於JSP;支援各種請求資源的對映策略;它應是易於擴充套件的。
4. springMVC和struts2有什麼區別?
答:區別如下:
-
springmvc的入口是一個servlet即前端控制器(DispatcherServlet),而struts2入口是一個filter過慮器(StrutsPrepareAndExecuteFilter)。
-
springmvc是基於方法開發(一個url對應一個方法),請求引數傳遞到方法的形參,可以設計為單例或多例(建議單例),struts2是基於類開發,傳遞引數是通過類的屬性,只能設計為多例。
-
Struts採用值棧儲存請求和響應的資料,通過OGNL存取資料,springmvc通過引數解析器是將request請求內容解析,並給方法形參賦值,將資料和檢視封裝成ModelAndView物件,最後又將ModelAndView中的模型資料通過reques域傳輸到頁面。