Java相關面試題總結+答案(五)
【異常】
74. throw 和 throws 的區別?
- throw 是真實拋出一個異常;
- throws 是聲明可能會拋出一個異常。
75. final、finally、finalize 有什麽區別?
- final:是修飾符,可以修飾類、方法、變量,如果修飾類,此類不能被繼承;如果修飾方法,此方法不能被重寫(override);如果修飾變量,則該變量是不可修改的,即變量變成常量。
- finally:是 try-catch-finally 最後一部分,表示不論發生什麽情況都會執行(除非在finally 之前執行 System.exit()方法),常用於釋放資源或鎖。
- finalize:是Object 類的一個方法,在垃圾收集器執行的時候會調用別回收對象的該方法。finalize 機制現在已經不推薦使用。
76. try-catch-finally 中哪個部分可以省略?
try-catch-finally 其中 catch 和 finally 都可以被省略,但是不能同時省略,也就是說有 try 的時候,必須後面跟一個 catch 或者 finally。
77. try-catch-finally 中,如果 catch 中 return 了,finally 還會執行嗎?
finally 一定會執行,即使是 catch 中 return 了,catch 中的 return 會等 finally 中的代碼執行完之後,才會執行。
78. 常見的異常類有哪些?
- NullPointerException 空指針異常
- ClassNotFoundException 指定類不存在
- NumberFormatException 字符串轉換為數字異常
- IndexOutOfBoundsException 數組下標越界異常
- ClassCastException 數據類型轉換異常
- FileNotFoundException 文件未找到異常
- NoSuchMethodException 方法不存在異常
- IOException IO 異常
- SocketException Socket 異常
【網絡】
79. http 響應碼 301 和 302 代表的是什麽?有什麽區別?
301:永久重定向。
302:暫時重定向。
它們的區別是,301 對搜索引擎優化(SEO)更加有利;302 有被提示為網絡攔截的風險。
80. forward 和 redirect 的區別?
forward 是轉發,而 redirect 是重定向,它們的區別如下:
-
- 地址欄 url 顯示:foward url 不會發生改變,redirect url 會發生改變;
- 數據共享:forward 可以共享 request 裏的數據,redirect 不能共享;
- 效率:forward 比 redirect 效率高。
81. 簡述 tcp 和 udp的區別?
tcp 和 udp 是 OSI 模型中的運輸層中的協議。tcp 提供可靠的通信傳輸,而 udp 則常被用於讓廣播和細節控制交給應用的通信傳輸。
兩者的區別大致如下:
-
- tcp 面向連接,udp 面向非連接即發送數據前不需要建立鏈接;
- tcp 提供可靠的服務(數據傳輸),udp 無法保證;
- tcp 面向字節流,udp 面向報文;
- tcp 數據傳輸慢,udp 數據傳輸快;
82. tcp 為什麽要三次握手,兩次不行嗎?為什麽?
如果采用兩次握手,那麽只要服務器發出確認數據包就會建立連接,但由於客戶端此時並未響應服務器端的請求,那此時服務器端就會一直在等待客戶端,這樣服務器端就白白浪費了一定的資源。若采用三次握手,服務器端沒有收到來自客戶端的再此確認,則就會知道客戶端並沒有要求建立請求,就不會浪費服務器的資源。
83. 說一下 tcp 粘包是怎麽產生的?
TCP粘包是指發送方發送的若幹包數據到接收方接收時粘成一包,從接收緩沖區看,後一包數據的頭緊接著前一包數據的尾。
tcp 粘包可能發生在發送端或者接收端,分別來看兩端各種產生粘包的原因:
-
- 發送端粘包:發送端需要等緩沖區滿才發送出去,造成粘包;
- 接收方粘包:接收方不及時接收緩沖區的包,造成多個包接收。
84. OSI 的七層模型都有哪些?
- 物理層:利用傳輸介質為數據鏈路層提供物理連接,實現比特流的透明傳輸。
- 數據鏈路層:負責建立和管理節點間的鏈路。
- 網絡層:通過路由選擇算法,為報文或分組通過通信子網選擇最適當的路徑。
- 傳輸層:向用戶提供可靠的端到端的差錯和流量控制,保證報文的正確傳輸。
- 會話層:向兩個實體的表示層提供建立和使用連接的方法。
- 表示層:處理用戶信息的表示問題,如編碼、數據格式轉換和加密解密等。
- 應用層:直接向用戶提供服務,完成用戶希望在網絡上完成的各種工作。
85. get 和 post 請求有哪些區別?
- get 請求會被瀏覽器主動緩存,而 post 不會。
- get 傳遞參數有大小限制,而 post 沒有。
- post 參數傳輸更安全,get 的參數會明文限制在 url 上,post 不會。
86. 如何實現跨域?
實現跨域有以下幾種方案:
-
- 服務器端運行跨域 設置 CORS 等於 *;
- 在單個接口使用註解 @CrossOrigin 運行跨域;
- 使用 jsonp 跨域;
87. 說一下 JSONP 實現原理?
jsonp:JSON with Padding,它是利用script標簽的 src 連接可以訪問不同源的特性,加載遠程返回的“JS 函數”來執行的。
【設計模式】
88. 說一下你熟悉的設計模式?
- 單例模式:保證被創建一次,節省系統開銷。
- 工廠模式(簡單工廠、抽象工廠):解耦代碼。
- 觀察者模式:定義了對象之間的一對多的依賴,這樣一來,當一個對象改變時,它的所有的依賴者都會收到通知並自動更新。
- 外觀模式:提供一個統一的接口,用來訪問子系統中的一群接口,外觀定義了一個高層的接口,讓子系統更容易使用。
- 模版方法模式:定義了一個算法的骨架,而將一些步驟延遲到子類中,模版方法使得子類可以在不改變算法結構的情況下,重新定義算法的步驟。
- 狀態模式:允許對象在內部狀態改變時改變它的行為,對象看起來好像修改了它的類。
89. 簡單工廠和抽象工廠有什麽區別?
- 簡單工廠:用來生產同一等級結構中的任意產品,對於增加新的產品,無能為力。
- 工廠方法:用來生產同一等級結構中的固定產品,支持增加任意產品。
- 抽象工廠:用來生產不同產品族的全部產品,對於增加新的產品,無能為力;支持增加產品族。
Java相關面試題總結+答案(五)