【Java-frag-面試】達內-模擬技術面試

Java基礎階段面試題

1.說出你對面向對象的理解

面向對象是現實世界模型的自然延伸,這是一種“萬物皆對象”的編程思想。在現實生活中的任何物體都可以歸爲一類事物,而每一個個體都是一類事物的實例。面向對象的編程是以對象爲中心,以消息爲驅動,所以程序=對象+消息。

面向對象有三大特性封裝繼承多態

封裝,將一類事物的屬性和行爲整合爲一個獨立的整體,在暴露有限行爲的同時,儘可能隱藏該整體的內部實現細節。該方法可以使程序更容易維護(代碼複用性更高),也提高了程序代碼的安全性。
繼承,是進一步將一類事物共有的屬性和行爲抽象成一個父類,而每一個子類是一個特殊的父類–有父類的行爲和屬性,也有自己特有的行爲和屬性。這樣做擴展了已存在的代碼塊,進一步提高了代碼的複用性。
多態,如果說封裝和繼承是爲了使代碼重用,那麼多態則是爲了實現接口重用。多態的一大作用就是爲了解耦–爲了解除父子類繼承的耦合度。簡單來說,多態就是允許父類引用(或接口)指向子類(或實現類)對象。很多的設計模式都是基於面向對象的多態性設計的。

2.JVM的內存區及其GC算法

JVM內存區

根據JVM規範, JVM把內存劃分如下幾個區域:
1)方法區 2)堆區 3) 虛擬機棧 4)本地方法棧 5)程序計數器
方法區

  1. 該區主要用於存放要加載類的信息(類名,修飾符等),靜態變量,構造函數,final定義的常量,類中的字段&方法。
  2. 方法區全局共享,線程共享。
  3. 方法區超過其允許的大小時,拋出OutofMemory: PermGen Space異常。
  4. 對應持久代,一般不進行垃圾回收(GC)。
  5. 存放運行時常量池。
  6. 發生在方法區中的GC一般針對於常量池的回收和已加載類的卸載。

堆區

  1. 堆區內存放的數據所有線程共享。
  2. 在虛擬機啓動時創建,主要用於存放對象實例和數組。
  3. 所有通過new關鍵字得到的對象,均於此處生成。
  4. GC最頻繁的區域。

虛擬機棧

  1. 虛擬機棧線程私有,每個線程對應一個虛擬機棧,其生命週期與線程一致。
  2. 虛擬機棧佔用操作系統的內存。
  3. 每個方法被執行時產生一個棧幀(存儲局部變量表,動態鏈接,操作數,方法出口等信息),當方法被調用時棧幀入棧,當方法調用結束後,棧幀出棧。

本地方法棧

  1. 本地方法棧用於支持native方法的執行,存儲每個native方法的執行狀態。
  2. 本地方法棧與Java適用於不同操作系統息息相關。

程序計數器

  1. 程序計數器直接劃分在CPU上。
  2. 程序係數器線程私有。
  3. 字節碼解釋器工作時,通過改變程序計數器的值來取得下一條要執行的指令;分支,循環,跳轉的基礎功能均依賴此技術區實現。

通過對內存的管理可以分爲三塊: 新生代,舊生代,持久代

  1. 新生代: 大致分爲Eden區 和 Survivor區。
  2. 舊生代: 用於存放新生代多次GC依然存活的對象, 如緩存對象。
  3. 持久代: 方法區。
GC算法

GC算法:
主要分爲三種:GC標記-清除算法,引用計數算法,GC複製算法。

標記-清除算法:遞歸每個能訪問的對象的指針數組,將每個活動對象打上mark; 將不能活動的對象進行回收; 標記-整理算法: 標記-清除的升級版; 將標記的對象移入一側,然後清掉端邊界外的內存; (在存活率較高的情況下更爲高效, 且耗空間更小)(此兩種方法適用於存活率高的對象, 比如老年代中的對象);

引用計數法:引入計數器,用增減計數器的值來進行內存管理。在分配內存空間時,將對象的計數器+1。在更新指針的過程中,增加新應用對象的ref_cnt,減少指針原先對象的ref_cnt計數。如果ref_cnt爲0,則爲垃圾,將被立即回收。

複製算法:將堆空間等分成大小相同的兩份,執行GC時候,將from空間的活動對象複製至to空間,複製完成後,回收from空間。複製的時候先將原有對象打上copy標籤,指向新空間的對象存放在obj.forwarding中。(適用於存活率較低的對象, 比如新生代中的對象)。

參考資料
JVM內存結構     垃圾回收機制

3.集合框架下的各種接口和實現類有哪些,分別有啥特點

集合Collection(代表一組對象,每一個對象都是它的子元素): 接口: Set,Queue,List
繼承了Set接口的實現類(HashSet等)中元素不能重複, TreeSet可以排序;
繼承了List接口的實現類(ArrayList,LinkedList等)中元素可以重複,且有順序

Map: 可以將鍵(key)映射到值(value)的對象,鍵不能重複;主要有HashMap和LinkedHashMap兩個類。

參考資料
ArrayList&LinkedList

4.String類特點及常用的API

String類(直接繼承Object類)可以用來定義一個字符串,字符串是常量,它們的值在創建之後不能更改。

  1. sort(),用於對字符串進行排序。
  2. equals(),contentEquals(),用於判斷字符串是否相等。
  3. isEmpty(),用於判斷字符串是否爲空值。
  4. charAt(),用於得到指定位置上的字符。
  5. indexOf(),用於判斷字符的所在位置。
  6. substring(),剪切字符串。
  7. hashCode(),常規操作。
  8. startWith(),endWith(),判斷是以…結尾。
  9. replace(),replaceAll(),替換部分內容。

5.StringBuilder和StringBuffer的區別?

  1. String的值是不可變的,每次對String進行操作都會產生新的String對象, 效率低下,且浪費有限的內存空間,因此Java中引入StringBuffer和StringBuilder類。
  2. StringBuilder 不是線程安全的,但速度較快 (單線程在字符串緩衝區下操作大量數據)。
  3. StringBuffer 是線程安全的,但速度較慢 (多線程在字符串緩衝區下操作大量數據)。

6.線程創建的3種方式,線程阻塞的API有哪些及其之間的區別?

線程創建的三種方式
  1. 繼承Thread類來創建線程,並實現run方法(線程需要完成的功能); 構建子類對象,start()啓動線程。
  2. 實現Runnable接口來創建一個線程,實現Runnable接口中的run()方法; 將Runnable接口類的對象作爲參數傳遞給Thread類對象,並調用start()方法。
  3. 實現Callable接口來創建一個線程,先定義一個Callable的實現類,重寫call()方法, call()有返回值;兩種執行方式:
    1). 藉助FutureTask執行,創建Callable實現類的對象,並作爲參數傳遞給FutureTask, FutureTask作爲參數傳遞給Thread類的對象,並執行start()方法。
    2). 藉助線程池來執行,先創建線程池,然後調用線程池的submit方法, 並將Callable實現列作爲參數傳入。
方法一:

所有的線程啓用,都需要一個Thread類,直接編寫run方法,啓用Thread類,簡單明瞭。

方法二的好處:
  1. 可以將一個Runnable實現類作爲參數傳遞給多個線程對象,避免了代碼的重複編寫。
  2. Thread類創建線程是採用繼承的方式,而Java中只能單繼承, 如果某個子類的需要創建線程只能採用實現Runnable接口或者實現Callable接口的方式。
方法三的好處:
  1. 有返回值。
  2. call()可以拋出異常。
  3. 運行Callable任務可以得到一個Future對象,表示異步計算的結果。 它提供了檢測計算是否完成的方法(isDone())以等待計算的完成,並檢索計算的結果。
線程阻塞的API
  1. sleep()方法:該方法允許指定以ms爲單位的一段時間作爲參數, 它使得線程在指定的時間內進入阻塞狀態,不能得到CPU時間, 指定時間過後,線程重新進入可執行狀態。
  2. suspend()和resume()方法:配套使用,suspend()使得線程進入阻塞狀態,且不會自動恢復, 必須將其對應的resume()調用,纔可以使線程進入可執行狀態。
  3. yield():使得線程放棄當前分得的CPU時間, 但是不使線程阻塞, 即線程仍然處於可執行狀態;
  4. wait()和notify()方法;配套使用,若wait()有參數,相當於sleep(但可以通過notify強行喚醒),wait()沒有參數,相當於suspend(),需要通過notify喚醒。

7.抽象類和接口的區別?抽象類和結構各自的意義?

區別:
  1. 實例化過程不同,抽象類實例化(被子類繼承,並實現抽象方法);接口實例化( 被實現類實現所有接口方法)。
  2. 抽象類中可以做方法聲明,也可以做方法實現; 接口只能做方法聲明。
  3. 抽象類中的變量可以是普通的變量,接口裏定義的變量只能是公共的靜態常量。
各自存在意義:

接口是設計的結果,是一種行爲規範,抽象類是對類整體進行抽象,重構的結果。

8.冒泡排序,選擇排序,快速排序(瞭解)

冒泡排序:時間複雜度O(n^2)
依次比較相鄰兩個數據,將較大的元素後置。 第一遍遍歷後最後的數便是最大值;進行第二遍重複比較(最後一個數不比);倒數第二的數爲第二大的數;重複上述遍歷操作;以此排序。
選擇排序:時間複雜度O(n^2)
遍歷第一遍,找到最小的數,將其與第一個數交換; 遍歷第i(i<=n-1)遍, 將第i小的元素放到第i個位置上。
快速排序:時間複雜度O(nlogn~n^2)
挑出一個元素(數組中)作爲基準,遍歷,將比基準值小的元素放前面,把比基準值大的元素放後面; 遞歸排序前後兩子序列。

9.什麼是死鎖?如何避免死鎖

定義:

死鎖是指多個進程因競爭資源而造成的一種僵局(互相等待),如果沒有外力, 這些進程都無法繼續進行。

預防和避免:

系統對進程發出的每一個資源申請進行動態檢查, 根據檢查結果決定是否分配資源.(如果該申請可能引發死鎖,拒絕; 否則允許分配)。

常用預防方法:
  1. 破壞“不可剝奪”條件:一個進程不能獲得所需要的全部資源時便處於等待狀態,等待期間他佔有的資源將被隱式的釋放重新加入到系統的資源列表中,可以被其他的進程使用,而等待的進程只有重新獲得自己原有的資源以及新申請的資源纔可以重新啓動,執行。
  2. 破壞”請求與保持條件“:第一種方法靜態分配即每個進程在開始執行時就申請他所需要的全部資源。第二種是動態分配即每個進程在申請所需要的資源時他本身不佔用系統資源。
  3. 破壞“循環等待”條件:採用資源有序分配其基本思想是將系統中的所有資源順序編號,將緊缺的,稀少的採用較大的編號,在申請資源時必須按照編號的順序進行,一個進程只有獲得較小編號的資源後才能申請較大編號資源。

Java Web階段重點

1. Jsp的9大隱式對象

隱式對象:這些對象是每個頁面爲開發人員提供的Java對象,開發人員可以直接調用它們,而不用先聲明。
Jsp隱式對象也稱爲預定義變量

request 			HttpServletRequest對象			與服務端接收的請求相關聯
response			HttpServletResponse對象	        與服務端發出的響應相關聯
out					PrintWriter對象					用於將服務端的輸入發送到客戶端
session				HttpSession對象			        與服務端接收的請求相關聯
application			ServletContext對象 		        與應用程序上下文相關聯
config				ServletConfig對象			    與客戶端的頁面相關聯
pageContext			封裝了使用服務器特定的功能,如更高性能的JspWriter
page				這是一個同義詞,用於調用由翻譯的servlet類定義的方法
Exception			Exception對象允許指定Jsp訪問異常數據

2.四大域對象及其作用域

四大域對象:page, request, session, application
四大域對象的作用域:
  1. page: JSP頁面被執行,生命週期開始,JSP頁面執行完畢,生命週期結束(當前頁面有效)。
  2. request: 用戶發送一個請求,生命週期開始,服務器返回響應,請求結束,生命週期結束(一次請求)。
  3. session:用戶打開瀏覽器訪問,創建session(生命週期開始),session超時或被聲明失效,該對象生命週期結束(一次會話)。
  4. application: web應用加載的時候創建,web應用移除或服務器關閉,生命週期結束(當前web應用)

3.servlet的生命週期

  1. 類加載:servlet生命週期開始。
  2. 實例化:(視load-on-startup的值而定)服務器啓動時(1)或者第一次請求時(0),創建servlet的實例。
  3. 請求處理:處理客戶端請求。
  4. 銷燬: 服務器關閉,銷燬對象(執行destroy方法)。

4.Cookie和Session的工作原理,聯繫和區別

工作原理:
  1. 用戶第一次瀏覽某個使用Cookie的網站時,服務器啓用Session,創建一個Session, 該服務器生成一個識別碼(Cookie id),創建一個Cookie對象。
  2. 通過設置最大時效,可以使其存儲於磁盤(客戶端)上,將Cookie放入HTTP相應報頭上, 發回瀏覽器。
  3. 瀏覽器根據參數,來存儲Cookie。
  4. 下次向該網站發送請求時,瀏覽器會先掃一遍Cookies, 將對應的Cookie發送到服務器。
  5. 服務器讀取Cookie,匹配Session id並獲取信息。
聯繫:

Session是利用Cookie進行信息處理的, 用戶請求後,相當於服務器在用戶遊覽器上創建了一個Cookie(名稱爲aspsessionid); 當Session結束時,也就意味着這個Cookie過期了。

區別:
  1. 數據存放地址不同:Cookie數據存放在客戶的瀏覽器上,Session數據存放在服務器上。
  2. 安全級別不同:Cookie數據可以通過直接訪問本地Cookie進行Cookie欺騙,Session相對安全。

5. GET提交和POST提交的區別

URL可見性不同:

GET:URL可見。
POST:URL不可見。

數據傳輸方式不同:

GET:通過拼接URL進行參數傳遞。
POST:通過body體傳輸參數。

能否緩存:

GET請求可以緩存。
POST請求不可以緩存。

後退頁面反應不同:

GET:請求頁面後退時,不產生影響。
POST:請求頁面後退時,會重新提交請求。

傳輸數據的大小區別:

GET:取決於瀏覽器對URL長度的限制。
POST:請求傳輸的數據可以無限大。

6. 請求轉發和請求重定向的區別

轉發:一次請求,一次響應(服務器)。
重定向:兩次請求,兩次響應(服務器)。

7.HTTP協議的相關內容

  1. 支持客戶/服務器模式。
  2. 簡單快速。
  3. 允許傳輸任意類型的數據對象,正在傳輸的類型由Content-Type加以標記。
  4. 每次連接只處理一個請求。服務器處理完客戶的請求,並收到客戶的應答後,即斷開連接。採用這種方式可以節省傳輸時間。
  5. HTTP協議是無狀態協議。無狀態是指協議對於事務處理沒有記憶能力。缺少狀態意味着如果後續處理需要前面的信息,則它必須重傳,這樣可能導致每次連接傳送的數據量增大。另一方面,在服務器不需要先前信息進行處理時它的應答就較快。

PS:

  1. HTTP協議通常承載於TCP協議之上,有時也承載於TLS/SSL(傳輸層安全協議)協議層之上,默認的http端口是80,HTTPS的端口號爲443。
  2. HTTP協議永遠都是客戶端發起請求,服務器回送響應。限制無法在客戶端未發送請求的情況下將消息推送給客戶端。

8.如何防止表單的重複提交

重複提交的原因
  1. 網絡延遲。
  2. 頁面重新加載。
解決方法

方法一: 前端js驗證。
方法二: 後端生成令牌值,每次上傳對比令牌值。

9.js和jQuery的常用選擇器和函數

常用選擇器

js: document.getElementBy(Id/ClassName/Name/TagName)()
jQuery: jQuery的選擇器更爲簡潔。元素選擇器(’#’, ‘.’) 屬性選擇器(’[ ]’) 後代,層級選擇器等。

常用函數

普通對象爲js對象,用javaScript的原生方法
alert(); confirm, length, sort, getDate, abs, max, log, min, random。
帶有$()的爲jQuery對象,可用jQuery的方法
show(). hide(); click(), blur(), bind(), trigger(), toggle()

10.如何防止亂碼問題

數據傳輸,解析要用統一的格式和解析方法。

解決辦法:

確認亂碼位置

  1. 檢查項目編碼;
  2. 檢查數據庫編碼是否與項目編碼一致;
  3. 檢查html編碼是否…
  4. Tomcat編碼是否… conf/server.xml

Java 框架階段重點

1.SpringMVC的五大組件和請求響應流程

五大組件:

DispatcherServlet ------- 前端控制器
HandlerMapping --------- 映射處理器
Controller--------------------處理器
ModelAndView-------------處理結果和視圖名
ViewResolver---------------視圖解析器

工作過程:
  1. 請求發給DispatcherServlet,DispatcherServle會依據HandlerMapping的配置調用對應的Controller來處理。
  2. Controller將處理結果封裝成ModelAndView,然後返回給DispatcherServlet。
  3. DispatcherServlet會依據ViewResolver的解析調用對應的視圖對象來轉發到相應的頁面。

2.SpringIOC的原理(概念,如何創建和管理對象的,依賴注入的方式)

概念:

IOC (Inversion of Controller,IOC),即控制反轉,是一種設計思想。 在Java開發中意味着把設計好的對象交給容器控制,而不是在對象內部直接控制。(由Spring容器來管理組件對象的生命週期,負責組件對象的創建和組件對象之間的依賴關係,這樣可以大大降低程序各組件之間的耦合關係,符合軟件工程中低耦合高內聚的理念。)

創建對象和管理對象:
  1. 初始化Spring中的Bean工廠,Spring中的Bean工廠會基於Bean對象描述,創建bean的實例,並有選擇性的對實例對象進行管理。
  2. Spring中有兩個核心的Map對象,一個用於存儲bean的配置信息(xml,註解),一個用於存儲bean的實例信息,通過(xml,annotation的方法)描述對象;通過這兩個map對象來對bean對象進行管理。
  3. 通過依賴注入來協同資源。
依賴注入的方式:

主要有三種方式: 構造函數注入,setter方法注入與接口注入。

  1. 構造函數注入,通過類名反射得到構造函數,通過構造函數注入數據,對象構造完成後邊進入就緒狀態,可以馬上使用。但依賴對象參數較多時參數列表會較長,對相同類型的參數進行處理可能會比較困難。
  2. setter方法注入,通過setter方法處理多個對象時會比構造函數好,只是不能馬上進入就緒狀態。
  3. 接口注入:強制注入對象不必要的接口,具有較強的侵入性,性能也不見得比上兩種。

3.AOP的原理(概念,代理機制,應用場景,幾大通知的執行順序)

AOP是軟件實踐領域中的面向切面編程,是一種編程思想。它是面向對象編程的一種補充和完善。我們一般把面向對象理解爲一個靜態的過程(要分析系統由哪些模塊,一個模塊有哪些對象,對象有哪些屬性),面向切面就是一個動態過程(在對象運行過程中如何切入一些擴展功能)。
AOP應用場景: 日誌處理,權限控制,事務控制等。
通知的執行順序: @Around,@Before,@Around,@After,@AfterReturning
AOP代理機制: JDK動態代理;CGlib的動態代理。
JDK動態代理: 針對實現了接口的類產生代理(沒有實現接口的類難以應用)。
CGlib動態代理: 針對沒有實現接口的類產生代理,應用的是底層的字節碼增強技術,生成當前類的子類對象。

4.mybatis的核心對象,$和#的區別,mybatis的事務處理

mybatis的核心對象:

SqlSessionFactoryBuilder,SqlSessionFactory,SqlSession。
SqlSessionFacotryBuilder,用於建立一個工廠對象(SqlSessionFactory)。
SqlSessionFactory,是mybatis的核心對象,利用SqlSessionFactory(工廠對象)可以開啓(openSession)一個會話(SqlSession)。
SqlSession,包含了一組可運行的sql語句,是一次會話的對象。

$和#的區別:

#可以進行預編譯處理,#{}中的內容不會進行預編譯,會被當成?號。
比如,調用PreparedStatement的set方法來賦值,可以防止Sql注入。
mybatis是普通的佔位符,mybatis在處理{}時,會把的${}替換成變量的值,然後一起編譯。

mybatis的事務處理

事務處理需要具有創建(create),提交(commit),回滾(rollback),關閉(close)的功能。
mybatis將事務抽象成了Transaction接口,兩種形式: JDBC事務管理機制,MANAGED事務管理機制
JDBC事務管理機制,通過調用java.sql.Connection對象完成對事務處理的四項功能。
MANAGED事務管理機制,此機制下MyBatis自身不會實現事務管理,而是讓程序容器去實現對事務的管理。

5.Spring的常用註解及其作用

@Controller 用於處理http請求的功控制器
@ResponseBody 用於將返回的數據轉爲json格式
@RestController 上兩種的結合
@RequestMapping 配置url映射
@Conponent 最普通的組件, 可以被注入到spring容器中進行管理
@Repository 作用域持久層
@Service 作用於業務邏輯層
@Test 用於測試類

6.Spring的事務管理(聲明式,編程式)

聲明式事務管理: 大多數用戶選擇聲明式事務管理,這種方式對應用代碼的影響最小,並且最符合一個非侵入式輕量級容器的模。具體操作:爲類or方法添加@Transactional,爲配置添加@EnableTransactionManagement的註釋。
編程式事務管理: 手動將事務管理的代碼以硬編碼的形式寫入類or方法中,難以批量更改, 一般不用。

7.springboot優點(較spring)

  1. 簡化配置: springboot繼承了大量常用的第三方庫配置,在springboot應用這些第三方庫幾乎可以開箱即用,使開發者可以更加註重於業務邏輯。
  2. 簡化部署: springboot只用啓動項目即可,spring中需要先部署tomcat,然後發佈任務,以及其他的操作。

8.對RESTFUL有何理解

REST(Representational State Transfer) 表現層狀態轉換,是一種設計思想;(from Roy Fielding Ph.d)
後取代SOAP, 成爲了Web API 的標準or設計模式.
RESTful: 符合REST約束風格和原則的應用程序或設計就是RESTful風格:用戶請求地址儘可能不變,只改變請求類型
RESTful web service 是一種常見的rest的應用, 是遵守了rest風格的web服務, RESTful的Web服務是一種ROA(The Resource-Oriented Architecture, 面向資源的架構)

PS: REST架構的主要原則:

  1. 網絡上的所有事物都被抽象成爲資源
  2. 每個資源都有一個唯一的資源標識符
  3. 同一個資源具有多種表現形式(xml, json等)
  4. 對資源的各種操作不會改變資源標識符
  5. 所有的操作都是無狀態的
  6. 符合REST原則的架構方式即可稱爲RESTful
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章