更新時間:2019-10-15 13:41:58 來源:動力節(jié)點 瀏覽3352次
七、Java最新面試題及答案:Java 異常模塊
74、throw 和 throws 的區(qū)別?
throw:是真實拋出一個異常。
throws:是聲明可能會拋出一個異常。
75、final、finally、finalize 有什么區(qū)別?
final:是修飾符,如果修飾類,此類不能被繼承;如果修飾方法和變量,則表示此方法和此變量不能在被改變,只能使用。
finally:是 try{} catch{} finally{} 最后一部分,表示不論發(fā)生任何情況都會執(zhí)行,finally 部分可以省略,但如果 finally 部分存在,則一定會執(zhí)行 finally 里面的代碼。
finalize:是Object的protected方法,子類可以覆蓋該方法以實現(xiàn)資源清理工作,GC在回收對象之前調(diào)用該方法。
76、try-catch-finally 中哪個部分可以省略?
try-catch-finally 其中 catch 和 finally 都可以被省略,但是不能同時省略,也就是說有 try 的時候,必須后面跟一個 catch 或者 finally。
77、try-catch-finally 中,如果 catch 中 return 了,finally 還會執(zhí)行嗎?
finally 一定會執(zhí)行,即使是 catch 中 return 了,catch 中的 return 會等 finally 中的代碼執(zhí)行完之后,才會執(zhí)行。
78、常見的異常類有哪些?
NullPointerException 空指針異常
ClassNotFoundException 指定類不存在
NumberFormatException 字符串轉(zhuǎn)換為數(shù)字異常
IndexOutOfBoundsException 數(shù)組下標越界異常
ClassCastException 數(shù)據(jù)類型轉(zhuǎn)換異常
FileNotFoundException 文件未找到異常
NoSuchMethodException 方法不存在異常
IOException IO 異常
SocketException Socket 異常
八、 Java最新面試題及答案:網(wǎng)絡(luò)模塊
79、http 響應(yīng)碼 301 和 302 代表的是什么?有什么區(qū)別?
301:永久重定向;302:暫時重定向。
它們的區(qū)別是,301 對搜索引擎優(yōu)化(SEO)更加有利;302 有被提示為網(wǎng)絡(luò)攔截的風(fēng)險。
80、forward 和 redirect 的區(qū)別?
forward 是轉(zhuǎn)發(fā) 和 redirect 是重定向:
地址欄 url 顯示:foward url 不會發(fā)生改變,redirect url 會發(fā)生改變;
數(shù)據(jù)共享:forward 可以共享 request 里的數(shù)據(jù),redirect 不能共享;
效率:forward 比 redirect 效率高。
81、簡述 tcp 和 udp的區(qū)別?
tcp 和 udp 是 OSI 模型中的運輸層中的協(xié)議。tcp 提供可靠的通信傳輸,而 udp 則常被用于讓廣播和細節(jié)控制交給應(yīng)用的通信傳輸。
兩者的區(qū)別大致如下:
tcp 面向連接,udp 面向非連接即發(fā)送數(shù)據(jù)前不需要建立鏈接;
tcp 提供可靠的服務(wù)(數(shù)據(jù)傳輸),udp 無法保證;
tcp 面向字節(jié)流,udp 面向報文;
tcp 數(shù)據(jù)傳輸慢,udp 數(shù)據(jù)傳輸快;
82、tcp 為什么要三次握手,兩次不行嗎?為什么?
我們假設(shè)A和B是通信的雙方。我理解的握手實際上就是通信,發(fā)一次信息就是進行一次握手。
第一次握手:A給B打電話說,你可以聽到我說話嗎?
第二次握手:B收到了A的信息,然后對A說:我可以聽得到你說話啊,你能聽得到我說話嗎?
第三次握手:A收到了B的信息,然后說可以的,我要給你發(fā)信息啦!
在三次握手之后,A和B都能確定這么一件事:我說的話,你能聽到;你說的話,我也能聽到。這樣,就可以開始正常通信了。
注意:HTTP是基于TCP協(xié)議的,所以每次都是客戶端發(fā)送請求,服務(wù)器應(yīng)答,但是TCP還可以給其他應(yīng)用層提供服務(wù),即可能A、B在建立鏈接之后,誰都可能先開始通信。
如果采用兩次握手,那么只要服務(wù)器發(fā)出確認數(shù)據(jù)包就會建立連接,但由于客戶端此時并未響應(yīng)服務(wù)器端的請求,那此時服務(wù)器端就會一直在等待客戶端,這樣服務(wù)器端就白白浪費了一定的資源。若采用三次握手,服務(wù)器端沒有收到來自客戶端的再此確認,則就會知道客戶端并沒有要求建立請求,就不會浪費服務(wù)器的資源。
83、說一下 tcp 粘包是怎么產(chǎn)生的?
tcp 粘包可能發(fā)生在發(fā)送端或者接收端,分別來看兩端各種產(chǎn)生粘包的原因:
發(fā)送端粘包:發(fā)送端需要等緩沖區(qū)滿才發(fā)送出去,造成粘包;
接收方粘包:接收方不及時接收緩沖區(qū)的包,造成多個包接收。
84、OSI 的七層模型都有哪些?
物理層:利用傳輸介質(zhì)為數(shù)據(jù)鏈路層提供物理連接,實現(xiàn)比特流的透明傳輸。
數(shù)據(jù)鏈路層:負責(zé)建立和管理節(jié)點間的鏈路。
網(wǎng)絡(luò)層:通過路由選擇算法,為報文或分組通過通信子網(wǎng)選擇最適當?shù)穆窂健?/p>
傳輸層:向用戶提供可靠的端到端的差錯和流量控制,保證報文的正確傳輸。
會話層:向兩個實體的表示層提供建立和使用連接的方法。
表示層:處理用戶信息的表示問題,如編碼、數(shù)據(jù)格式轉(zhuǎn)換和加密解密等。
應(yīng)用層:直接向用戶提供服務(wù),完成用戶希望在網(wǎng)絡(luò)上完成的各種工作。
85、get 和 post 請求有哪些區(qū)別?
get 請求會被瀏覽器主動緩存,而 post 不會。
get 傳遞參數(shù)有大小限制,而 post 沒有。
post 參數(shù)傳輸更安全,get 的參數(shù)會明文限制在 url 上,post 不會。
86、如何實現(xiàn)跨域?
實現(xiàn)跨域有以下幾種方案:
服務(wù)器端運行跨域 設(shè)置 CORS 等于 *;
在單個接口使用注解 @CrossOrigin 運行跨域;
使用 jsonp 跨域;
87、說一下 JSONP 實現(xiàn)原理?
jsonp:JSON with Padding,它是利用script標簽的 src 連接可以訪問不同源的特性,加載遠程返回的“JS 函數(shù)”來執(zhí)行的。
九、 Java最新面試題及答案:設(shè)計模式模塊
88、說一下你熟悉的設(shè)計模式?
單例模式:保證被創(chuàng)建一次,節(jié)省系統(tǒng)開銷。
工廠模式(簡單工廠、抽象工廠):解耦代碼。
觀察者模式:定義了對象之間的一對多的依賴,這樣一來,當一個對象改變時,它的所有的依賴者都會收到通知并自動更新。
外觀模式:提供一個統(tǒng)一的接口,用來訪問子系統(tǒng)中的一群接口,外觀定義了一個高層的接口,讓子系統(tǒng)更容易使用。
模版方法模式:定義了一個算法的骨架,而將一些步驟延遲到子類中,模版方法使得子類可以在不改變算法結(jié)構(gòu)的情況下,重新定義算法的步驟。
狀態(tài)模式:允許對象在內(nèi)部狀態(tài)改變時改變它的行為,對象看起來好像修改了它的類。
89、簡單工廠和抽象工廠有什么區(qū)別?
簡單工廠:用來生產(chǎn)同一等級結(jié)構(gòu)中的任意產(chǎn)品,對于增加新的產(chǎn)品,無能為力。
工廠方法:用來生產(chǎn)同一等級結(jié)構(gòu)中的固定產(chǎn)品,支持增加任意產(chǎn)品。
抽象工廠:用來生產(chǎn)不同產(chǎn)品族的全部產(chǎn)品,對于增加新的產(chǎn)品,無能為力;支持增加產(chǎn)品族。
十、Java最新面試題及答案:Spring/Spring MVC模塊
90、為什么要使用 spring?
spring 提供 ioc 技術(shù),容器會幫你管理依賴的對象,從而不需要自己創(chuàng)建和管理依賴對象了,更輕松的實現(xiàn)了程序的解耦。
spring 提供了事務(wù)支持,使得事務(wù)操作變的更加方便。
spring 提供了面向切片編程,這樣可以更方便的處理某一類的問題。
更方便的框架集成,spring 可以很方便的集成其他框架,比如 MyBatis、hibernate 等。
91、解釋一下什么是 aop?
aop 是面向切面編程,通過預(yù)編譯方式和運行期動態(tài)代理實現(xiàn)程序功能的統(tǒng)一維護的一種技術(shù)。
簡單來說就是統(tǒng)一處理某一“切面”(類)的問題的編程思想,比如統(tǒng)一處理日志、異常等。
92、解釋一下什么是 ioc?
ioc:Inversionof Control(中文:控制反轉(zhuǎn))是 spring 的核心,對于 spring 框架來說,就是由 spring 來負責(zé)控制對象的生命周期和對象間的關(guān)系。
簡單來說,控制指的是當前對象對內(nèi)部成員的控制權(quán);控制反轉(zhuǎn)指的是,這種控制權(quán)不由當前對象管理了,由其他(類,第三方容器)來管理。
93、spring 有哪些主要模塊?
spring core:框架的最基礎(chǔ)部分,提供 ioc 和依賴注入特性。
spring context:構(gòu)建于 core 封裝包基礎(chǔ)上的 context 封裝包,提供了一種框架式的對象訪問方法。
spring dao:Data Access Object 提供了JDBC的抽象層。
spring aop:提供了面向切面的編程實現(xiàn),讓你可以自定義攔截器、切點等。
spring Web:提供了針對 Web 開發(fā)的集成特性,例如文件上傳,利用 servlet listeners 進行 ioc 容器初始化和針對 Web 的 ApplicationContext。
spring Web mvc:spring 中的 mvc 封裝包提供了 Web 應(yīng)用的 Model-View-Controller(MVC)的實現(xiàn)。
94、spring 常用的注入方式有哪些?
setter 屬性注入
構(gòu)造方法注入
注解方式注入
95、spring 中的 bean 是線程安全的嗎?
spring 中的 bean 默認是單例模式,spring 框架并沒有對單例 bean 進行多線程的封裝處理。
實際上大部分時候 spring bean 無狀態(tài)的(比如 dao 類),所有某種程度上來說 bean 也是安全的,但如果 bean 有狀態(tài)的話(比如 view model 對象),那就要開發(fā)者自己去保證線程安全了,最簡單的就是改變 bean 的作用域,把“singleton”變更為“prototype”,這樣請求 bean 相當于 new Bean()了,所以就可以保證線程安全了。
有狀態(tài)就是有數(shù)據(jù)存儲功能。
無狀態(tài)就是不會保存數(shù)據(jù)。
96、spring 支持幾種 bean 的作用域?
spring 支持 5 種作用域,如下:
singleton:spring ioc 容器中只存在一個 bean 實例,bean 以單例模式存在,是系統(tǒng)默認值;
prototype:每次從容器調(diào)用 bean 時都會創(chuàng)建一個新的示例,既每次 getBean()相當于執(zhí)行 new Bean()操作;
request:每次 http 請求都會創(chuàng)建一個 bean;
session:同一個 http session 共享一個 bean 實例;
global-session:用于 portlet 容器,因為每個 portlet 有單獨的 session,globalsession 提供一個全局性的 http session。
注意:使用 prototype 作用域需要慎重的思考,因為頻繁創(chuàng)建和銷毀 bean 會帶來很大的性能開銷。
97、spring 自動裝配 bean 有哪些方式?
no:默認值,表示沒有自動裝配,應(yīng)使用顯式 bean 引用進行裝配。
byName:它根據(jù) bean 的名稱注入對象依賴項。
byType:它根據(jù)類型注入對象依賴項。
構(gòu)造函數(shù):通過構(gòu)造函數(shù)來注入依賴項,需要設(shè)置大量的參數(shù)。
autodetect:容器首先通過構(gòu)造函數(shù)使用 autowire 裝配,如果不能,則通過 byType 自動裝配。
98、spring 事務(wù)實現(xiàn)方式有哪些?
聲明式事務(wù):聲明式事務(wù)也有兩種實現(xiàn)方式,基于 xml 配置文件的方式和注解方式(在類上添加 @Transaction 注解)。
編碼方式:提供編碼的形式管理和維護事務(wù)。
99、說一下 spring 的事務(wù)隔離?
spring 有五大隔離級別,默認值為 ISOLATION_DEFAULT(使用數(shù)據(jù)庫的設(shè)置),其他四個隔離級別和數(shù)據(jù)庫的隔離級別一致:
ISOLATION_DEFAULT:用底層數(shù)據(jù)庫的設(shè)置隔離級別,數(shù)據(jù)庫設(shè)置的是什么我就用什么;
ISOLATIONREADUNCOMMITTED:未提交讀,最低隔離級別、事務(wù)未提交前,就可被其他事務(wù)讀取(會出現(xiàn)幻讀、臟讀、不可重復(fù)讀);
ISOLATIONREADCOMMITTED:提交讀,一個事務(wù)提交后才能被其他事務(wù)讀取到(會造成幻讀、不可重復(fù)讀),SQL server 的默認級別;
ISOLATIONREPEATABLEREAD:可重復(fù)讀,保證多次讀取同一個數(shù)據(jù)時,其值都和事務(wù)開始時候的內(nèi)容是一致,禁止讀取到別的事務(wù)未提交的數(shù)據(jù)(會造成幻讀),MySQL 的默認級別;
ISOLATION_SERIALIZABLE:序列化,代價最高最可靠的隔離級別,該隔離級別能防止臟讀、不可重復(fù)讀、幻讀。
臟讀 :表示一個事務(wù)能夠讀取另一個事務(wù)中還未提交的數(shù)據(jù)。比如,某個事務(wù)嘗試插入記錄 A,此時該事務(wù)還未提交,然后另一個事務(wù)嘗試讀取到了記錄 A。
不可重復(fù)讀 :是指在一個事務(wù)內(nèi),多次讀同一數(shù)據(jù)。
幻讀 :指同一個事務(wù)內(nèi)多次查詢返回的結(jié)果集不一樣。比如同一個事務(wù) A 第一次查詢時候有 n 條記錄,但是第二次同等條件下查詢卻有 n+1 條記錄,這就好像產(chǎn)生了幻覺。發(fā)生幻讀的原因也是另外一個事務(wù)新增或者刪除或者修改了第一個事務(wù)結(jié)果集里面的數(shù)據(jù),同一個記錄的數(shù)據(jù)內(nèi)容被修改了,所有數(shù)據(jù)行的記錄就變多或者變少了。
100、說一下 spring mvc 運行流程?
spring mvc 先將請求發(fā)送給 DispatcherServlet。
DispatcherServlet 查詢一個或多個 HandlerMapping,找到處理請求的 Controller。
DispatcherServlet 再把請求提交到對應(yīng)的 Controller。
Controller 進行業(yè)務(wù)邏輯處理后,會返回一個ModelAndView。
Dispathcher 查詢一個或多個 ViewResolver 視圖解析器,找到 ModelAndView 對象指定的視圖對象。
視圖對象負責(zé)渲染返回給客戶端。
101、spring mvc 有哪些組件?
前置控制器 DispatcherServlet。
映射控制器 HandlerMapping。
處理器 Controller。
模型和視圖 ModelAndView。
視圖解析器 ViewResolver。
102、@RequestMapping 的作用是什么?
將 http 請求映射到相應(yīng)的類/方法上。
103、@Autowired 的作用是什么?
@Autowired 它可以對類成員變量、方法及構(gòu)造函數(shù)進行標注,完成自動裝配的工作,通過@Autowired 的使用來消除 set/get 方法。
十一、Java最新面試題及答案: Spring Boot/Spring Cloud模塊
104、什么是 spring boot?
spring boot 是為 spring 服務(wù)的,是用來簡化新 spring 應(yīng)用的初始搭建以及開發(fā)過程的。
105、為什么要用 spring boot?
配置簡單
獨立運行
自動裝配
無代碼生成和 xml 配置
提供應(yīng)用監(jiān)控
易上手
提升開發(fā)效率
106、spring boot 核心配置文件是什么?
spring boot 核心的兩個配置文件:
bootstrap (. yml 或者 . properties):boostrap 由父 ApplicationContext 加載的,比 applicaton 優(yōu)先加載,且 boostrap 里面的屬性不能被覆蓋;
application (. yml 或者 . properties):用于 spring boot 項目的自動化配置。
107、spring boot 配置文件有哪幾種類型?它們有什么區(qū)別?
配置文件有 . properties 格式和 . yml 格式,它們主要的區(qū)別是書法風(fēng)格不同。
properties 配置如下:
spring. RabbitMQ. port=5672
yml 配置如下:
spring:
RabbitMQ:
port: 5672
yml 格式不支持 @PropertySource 注解導(dǎo)入。
108、spring boot 有哪些方式可以實現(xiàn)熱部署?
使用 devtools 啟動熱部署,添加 devtools 庫,在配置文件中把 spring. devtools. restart. enabled 設(shè)置為 true;
使用 Intellij Idea 編輯器,勾上自動編譯或手動重新編譯。
109、jpa 和 hibernate 有什么區(qū)別?
jpa 全稱 Java Persistence API,是 Java 持久化接口規(guī)范,hibernate 屬于 jpa 的具體實現(xiàn)。
110、什么是 spring cloud?
spring cloud 是一系列框架的有序集合。它利用 spring boot 的開發(fā)便利性巧妙地簡化了分布式系統(tǒng)基礎(chǔ)設(shè)施的開發(fā),如服務(wù)發(fā)現(xiàn)注冊、配置中心、消息總線、負載均衡、斷路器、數(shù)據(jù)監(jiān)控等,都可以用 spring boot 的開發(fā)風(fēng)格做到一鍵啟動和部署。
111、spring cloud 斷路器的作用是什么?
在分布式架構(gòu)中,斷路器模式的作用也是類似的,當某個服務(wù)單元發(fā)生故障(類似用電器發(fā)生短路)之后,通過斷路器的故障監(jiān)控(類似熔斷保險絲),向調(diào)用方返回一個錯誤響應(yīng),而不是長時間的等待。這樣就不會使得線程因調(diào)用故障服務(wù)被長時間占用不釋放,避免了故障在分布式系統(tǒng)中的蔓延。
112、spring cloud 的核心組件有哪些?
Eureka:服務(wù)注冊于發(fā)現(xiàn)。
Feign:基于動態(tài)代理機制,根據(jù)注解和選擇的機器,拼接請求 url 地址,發(fā)起請求。
Ribbon:實現(xiàn)負載均衡,從一個服務(wù)的多臺機器中選擇一臺。
Hystrix:提供線程池,不同的服務(wù)走不同的線程池,實現(xiàn)了不同服務(wù)調(diào)用的隔離,避免了服務(wù)雪崩的問題。
Zuul:網(wǎng)關(guān)管理,由 Zuul 網(wǎng)關(guān)轉(zhuǎn)發(fā)請求給對應(yīng)的服務(wù)。
十二、Java最新面試題及答案: Hibernate模塊
113、為什么要使用 hibernate?
hibernate 是對 jdbc 的封裝,大大簡化了數(shù)據(jù)訪問層的繁瑣的重復(fù)性代碼。
hibernate 是一個優(yōu)秀的 ORM 實現(xiàn),很多程度上簡化了 DAO 層的編碼功能。
可以很方便的進行數(shù)據(jù)庫的移植工作。
提供了緩存機制,是程序執(zhí)行更改的高效。
114、什么是 ORM 框架?
ORM(Object Relation Mapping)對象關(guān)系映射,是把數(shù)據(jù)庫中的關(guān)系數(shù)據(jù)映射成為程序中的對象。
使用 ORM 的優(yōu)點:提高了開發(fā)效率降低了開發(fā)成本、開發(fā)更簡單更對象化、可移植更強。
115、hibernate 中如何在控制臺查看打印的 SQL 語句?
在 Config 里面把 hibernate. show_SQL 設(shè)置為 true 就可以。但不建議開啟,開啟之后會降低程序的運行效率。
116、hibernate 有幾種查詢方式?
三種:hql、原生 SQL、條件查詢 Criteria。
117、hibernate 實體類可以被定義為 final 嗎?
實體類可以定義為 final 類,但這樣的話就不能使用 hibernate 代理模式下的延遲關(guān)聯(lián)提供性能了,所以不建議定義實體類為 final。
118、在 hibernate 中使用 Integer 和 int 做映射有什么區(qū)別?
Integer 類型為對象,它的值允許為 null,而 int 屬于基礎(chǔ)數(shù)據(jù)類型,值不能為 null。
119、hibernate 是如何工作的?
讀取并解析配置文件。
讀取并解析映射文件,創(chuàng)建 SessionFactory。
打開 Session。
創(chuàng)建事務(wù)。
進行持久化操作。
提交事務(wù)。
關(guān)閉 Session。
關(guān)閉 SessionFactory。
120、get()和 load()的區(qū)別?
數(shù)據(jù)查詢時,沒有 OID 指定的對象,get() 返回 null;load() 返回一個代理對象。
load()支持延遲加載;get() 不支持延遲加載。
121、說一下 hibernate 的緩存機制?
hibernate 常用的緩存有一級緩存和二級緩存:
一級緩存:也叫 Session 緩存,只在 Session 作用范圍內(nèi)有效,不需要用戶干涉,由 hibernate 自身維護,可以通過:evict(object)清除 object 的緩存;clear()清除一級緩存中的所有緩存;flush()刷出緩存;
二級緩存:應(yīng)用級別的緩存,在所有 Session 中都有效,支持配置第三方的緩存,如:EhCache。
122、hibernate 對象有哪些狀態(tài)?
臨時/瞬時狀態(tài):直接 new 出來的對象,該對象還沒被持久化(沒保存在數(shù)據(jù)庫中),不受 Session 管理。
持久化狀態(tài):當調(diào)用 Session 的 save/saveOrupdate/get/load/list 等方法的時候,對象就是持久化狀態(tài)。
游離狀態(tài):Session 關(guān)閉之后對象就是游離狀態(tài)。
123、在 hibernate 中 getCurrentSession 和 openSession 的區(qū)別是什么?
getCurrentSession 會綁定當前線程,而 openSession 則不會。
getCurrentSession 事務(wù)是 Spring 控制的,并且不需要手動關(guān)閉,而 openSession 需要我們自己手動開啟和提交事務(wù)。
124、hibernate 實體類必須要有無參構(gòu)造函數(shù)嗎?為什么?
hibernate 中每個實體類必須提供一個無參構(gòu)造函數(shù),因為 hibernate 框架要使用 reflection api,通過調(diào)用 ClassnewInstance() 來創(chuàng)建實體類的實例,如果沒有無參的構(gòu)造函數(shù)就會拋出異常。
由于“最常見的208道Java最新面試題及答案”內(nèi)容太多,本文已滿,請看下文鏈接:
1~30道Java最新面試題及答案請看鏈接:http://m.ilovecolors.com.cn/javazixun/2143.html
31~73道Java最新面試題及答案請看鏈接:http://m.ilovecolors.com.cn/javazixun/2145.html
125~170道Java最新面試題及答案請看鏈接:http://m.ilovecolors.com.cn/javazixun/2148.html
171~208道Java最新面試題及答案請看鏈接:http://m.ilovecolors.com.cn/javazixun/2149.html
相關(guān)閱讀