120個java最常見的面試題(下)

43. Java 中的兩種異常類型是什麼?他們有什麼區別?

Java 中有兩種異常:受檢查的(checked)異常和不受檢查的(unchecked)異常。不受檢查的異常不需要在方法或者是構造函數上聲明,就算方法或者是構造函數的執行可能會拋出這樣的異常,並且不受檢查的異常可以傳播到方法或者是構造函數的外面。相反,受檢查的異常必須 要用 throws語句在方法或者是構造函數上聲明。這裏有 Java 異常處理的一些小建議。

44.Java 中 Exception 和 Error 有什麼區別?

Exception 和 Error 都是 Throwable 的子類。
Exception: 用於用戶程序可以捕獲的異常情況。
Error: 定義了不期望被用戶程序捕獲的異常。

45.throw 和 throws 有什麼區別?

throw 關鍵字用來在程序中明確的拋出異常,相反,throws 語句用來表明方法不能處理的異 常。每一個方法都必須要指定哪些異常不能處理,所以方法的調用者才能夠確保處理可能發生的異常,多個異常是用逗號分隔的。

46.異常處理的時候,finally 代碼塊的重要性是什麼?

無論是否拋出異常,finally 代碼塊總是會被執行。就算是沒有 catch 語句同時又拋出異常的情況下,finally 代碼塊仍然會被執行。最後要說的是,finally 代碼塊主要用來釋放資源,比如:I/O 緩衝區,數據庫連接。

47.異常處理完成以後,Exception 對象會發生什麼變化?

Exception 對象會在下一個垃圾回收過程中被回收掉。

48.finally 代碼塊和 finalize()方法有什麼區別?

無論是否拋出異常,finally 代碼塊都會執行,它主要是用來釋放應用佔用的資源。finalize()方法是 Object 類的一個 protected 方法,它是在對象被垃圾回收之前由 Java 虛擬機來調用的。

49.什麼是 Applet?

java applet 是能夠被包含在 HTML 頁面中並且能被啓用了 java 的客戶端瀏覽器執行的程序。Applet 主要用來創建動態交互的 web 應用程序。

50.解釋一下 Applet 的生命週期

applet 可以經歷下面的狀態:
Init:每次被載入的時候都會被初始化。
Start: 開始執行applet 。
Stop: 結束執行applet 。
Destroy:卸載 applet 之前,做最後的清理工作。

51.當 applet 被載入的時候會發生什麼?

首先,創建 applet 控制類的實例,然後初始化 applet,最後開始運行。

52.Applet 和普通的 Java 應用程序有什麼區別?

applet 是運行在啓用了 java 的瀏覽器中,Java 應用程序是可以在瀏覽器之外運行的獨立的Java 程序。但是,它們都需要有 Java 虛擬機。進一步來說,Java 應用程序需要一個有特定方法簽名的 main 函數來開始執行。Java applet 不需要這樣的函數來開始執行。最後,Java applet 一般會使用很嚴格的安全策略,Java 應用一般使用比較寬鬆的安全策略。

53.Java applet 有哪些限制條件?

主要是由於安全的原因,給 applet 施加了以下的限制:
applet 不能夠載入類庫或者定義本地方法。 applet 不能在宿主機上讀寫文件。
applet 不能讀取特定的系統屬性。
applet 不能發起網絡連接,除非是跟宿主機。
applet 不能夠開啓宿主機上其他任何的程序。

54.什麼是不受信任的 applet?

不受信任的 applet 是不能訪問或是執行本地系統文件的 Java applet,默認情況下,所有下載的 applet 都是不受信任的。

55.從網絡上加載的 applet 和從本地文件系統加載的 applet 有什麼區別?

當 applet 是從網絡上加載的時候,applet 是由 applet 類加載器載入的,它受 applet 安全管 理器的限制。當 applet 是從客戶端的本地磁盤載入的時候,applet 是由文件系統加載器載入的。從文件系統載入的 applet 允許在客戶端讀文件,寫文件,加載類庫,並且也允許執行其他程序,但是,卻通不過字節碼校驗。

56.applet 類加載器是什麼?它會做哪些工作?

當 applet 是從網絡上加載的時候,它是由 applet 類加載器載入的。類加載器有自己的 java名稱空間等級結構。類加載器會保證來自文件系統的類有唯一的名稱空間,來自網絡資源的 類有唯一的名稱空間。

當瀏覽器通過網絡載入 applet 的時候,applet 的類被放置於和 applet 的源相關聯的私有的名 稱空間中。然後,那些被類加載器載入進來的類都是通過了驗證器驗證的。驗證器會檢查類 文件格式是否遵守Java 語言規範,確保不會出現堆棧溢出(stack overflow) 或者下溢(underflow),傳遞給字節碼指令的參數是正確的。

57.applet 安全管理器是什麼?它會做哪些工作?

applet 安全管理器是給 applet 施加限制條件的一種機制。瀏覽器可以只有一個安全管理器。安全管理器在啓動的時候被創建,之後不能被替換覆蓋或者是擴展。

58.彈出式選擇菜單(Choice)和列表(List)有什麼區別

Choice 是以一種緊湊的形式展示的,需要下拉才能看到所有的選項。Choice 中一次只能選中一個選項。List 同時可以有多個元素可見,支持選中一個或者多個元素。

59.什麼是佈局管理器?

佈局管理器用來在容器中組織組件。

60.滾動條(Scrollbar)和滾動面板(JScrollPane)有什麼區別?

Scrollbar 是一個組件,不是容器。而 ScrollPane 是容器。ScrollPane 自己處理滾動事件。

61.哪些 Swing 的方法是線程安全的?

只有 3 個線程安全的方法: repaint(), revalidate(), and invalidate()。

62.說出三種支持重繪(painting)的組件。

Canvas, Frame, Panel,和 Applet 支持重繪。

63.什麼是裁剪(clipping)?

限制在一個給定的區域或者形狀的繪圖操作就做裁剪。

64.MenuItem 和 CheckboxMenuItem 的區別是什麼?

CheckboxMenuItem 類繼承自 MenuItem 類,支持菜單選項可以選中或者不選中。

65.邊緣佈局(BorderLayout)裏面的元素是如何佈局的?

BorderLayout 裏面的元素是按照容器的東西南北中進行佈局的。

66.網格包佈局(GridBagLayout)裏面的元素是如何佈局的?

GridBagLayout 裏面的元素是按照網格進行佈局的。不同大小的元素可能會佔據網格的多於 1 行或一列。因此,行數和列數可以有不同的大小。

67.Window 和 Frame 有什麼區別?

Frame 類繼承了 Window 類,它定義了一個可以有菜單欄的主應用窗口。

68.裁剪(clipping)和重繪(repainting)有什麼聯繫?

當窗口被 AWT 重繪線程進行重繪的時候,它會把裁剪區域設置成需要重繪的窗口的區域。

69.事件監聽器接口(event-listener interface)和事件適配器(event-adapter)有什麼關係?

事件監聽器接口定義了對特定的事件,事件處理器必須要實現的方法。事件適配器給事件監聽器接口提供了默認的實現。

70.GUI 組件如何來處理它自己的事件?

GUI 組件可以處理它自己的事件,只要它實現相對應的事件監聽器接口,並且把自己作爲事件監聽器。

71.Java 的佈局管理器比傳統的窗口系統有哪些優勢?

Java 使用佈局管理器以一種一致的方式在所有的窗口平臺上擺放組件。因爲佈局管理器不會和組件的絕對大小和位置相綁定,所以他們能夠適應跨窗口系統的特定平臺的不同。

72.Java 的 Swing 組件使用了哪種設計模式?

Java 中的 Swing 組件使用了 MVC(視圖-模型-控制器)設計模式。

73.什麼是 JDBC?

JDBC 是允許用戶在不同數據庫之間做選擇的一個抽象層。JDBC 允許開發者用 JAVA 寫數據庫應用程序,而不需要關心底層特定數據庫的細節。

74.解釋下驅動(Driver)在 JDBC 中的角色。

JDBC 驅動提供了特定廠商對 JDBC API 接口類的實現,驅動必須要提供 java.sql 包下面這些類的實現:Connection, Statement, PreparedStatement,CallableStatement, ResultSet 和 Driver。

75.Class.forName()方法有什麼作用?

這個方法用來載入跟數據庫建立連接的驅動。

76.PreparedStatement 比 Statement 有什麼優勢?

PreparedStatements 是預編譯的 , 因此 , 性能會更好。同時 , 不同的查詢參數值 ,
PreparedStatement 可以重用。

77.什麼時候使用 CallableStatement?用來準備 CallableStatement 的方法是什麼?

CallableStatement 用來執行存儲過程。存儲過程是由數據庫存儲和提供的。存儲過程可以接受輸入參數,也可以有返回結果。非常鼓勵使用存儲過程,因爲它提供了安全性和模塊化。準 備 一 個 CallableStatement 的 方 法 是 :
CallableStament.prepareCall();

78.數據庫連接池是什麼意思?

像打開關閉數據庫連接這種和數據庫的交互可能是很費時的,尤其是當客戶端數量增加的時候,會消耗大量的資源,成本是非常高的。可以在應用服務器啓動的時候建立很多個數據庫連接並維護在一個池中。連接請求由池中的連接提供。在連接使用完畢以後,把連接歸還到 池中,以用於滿足將來更多的請求。

79.什麼是 RMI?

Java 遠程方法調用(JavaRMI)是 Java API 對遠程過程調用(RPC)提供的面向對象的等價形式, 支持直接傳輸序列化的 Java 對象和分佈式垃圾回收。遠程方法調用可以看做是激活遠程正在運行的對象上的方法的步驟。RMI 對調用者是位置透明的,因爲調用者感覺方法是執行在本地運行的對象上的。看下 RMI 的一些注意事項。

80.RMI 體系結構的基本原則是什麼?

RMI 體系結構是基於一個非常重要的行爲定義和行爲實現相分離的原則。RMI 允許定義行爲的代碼和實現行爲的代碼相分離,並且運行在不同的 JVM 上。

81.RMI 體系結構分哪幾層?

RMI 體系結構分以下幾層:

  1. 存根和骨架層(Stub and Skeleton layer):這一層對程序員是透明的,它主要負責攔截客戶端發出的方法調用請求,然後把請求重定向給遠程的 RMI 服務。
  2. 遠程引用層(Remote Reference Layer):RMI 體系結構的第二層用來解析客戶端對服務端遠程對象的引用。這一層解析並管理客戶端對服務端遠程對象的引用。連接是點到點的。
  3. 傳輸層(Transport layer):這一層負責連接參與服務的兩個 JVM 。這一層是建立在網絡上機器間的 TCP/IP 連接之上的。它提供了基本的連接服務,還有一些防火牆穿透策略。

82.RMI 中的遠程接口(Remote Interface)扮演了什麼樣的角色?

遠程接口用來標識哪些方法是可以被非本地虛擬機調用的接口。遠程對象必須要直接或者是間接實現遠程接口。實現了遠程接口的類應該聲明被實現的遠程接口,給每一個遠程對象定義構造函數,給所有遠程接口的方法提供實現。

83.java.rmi.Naming 類扮演了什麼樣的角色?

java.rmi.Naming 類用來存儲和獲取在遠程對象註冊表裏面的遠程對象的引用。Naming 類的每一個方法接收一個 URL 格式的 String 對象作爲它的參數。

84.RMI 的綁定(Binding)是什麼意思?

綁定是爲了查詢找遠程對象而給遠程對象關聯或者是註冊以後會用到的名稱的過程。遠程對象可以使用
Naming 類的 bind()或者 rebind()方法跟名稱相關聯。

85.Naming 類的 bind()和 rebind()方法有什麼區別?

bind()方法負責把指定名稱綁定給遠程對象,rebind()方法負責把指定名稱重新綁定到一個新的遠程對象。如果那個名稱已經綁定過了,先前的綁定會被替換掉。

86.讓 RMI 程序能正確運行有哪些步驟?

爲了讓 RMI 程序能正確運行必須要包含以下幾個步驟: 編譯所有的源文件。
使用 rmic 生成 stub。
啓動 rmiregistry。
啓動 RMI 服務器。
運行客戶端程序。

87.RMI 的 stub 扮演了什麼樣的角色?

遠程對象的 stub 扮演了遠程對象的代表或者代理的角色。調用者在本地 stub 上調用方法,它負責在遠程對象上執行方法。當 stub 的方法被調用的時候,會經歷以下幾個步驟:初始化到包含了遠程對象的 JVM 的連接。
序列化參數到遠程的 JVM 。等待方法調用和執行的結果。反序列化返回的值或者是方法沒有執行成功情況下的異常。把值返回給調用者。

88.什麼是分佈式垃圾回收(DGC)?它是如何工作的?

DGC 叫做分佈式垃圾回收。RMI 使用 DGC 來做自動垃圾回收。因爲 RMI 包含了跨虛擬機的
遠程對象的引用,垃圾回收是很困難的。DGC 使用引用計數算法來給遠程對象提供自動內存管理。

89.RMI 中使用 RMI 安全管理器(RMISecurityManager)的目的是什麼?

RMISecurityManager 使用下載好的代碼提供可被 RMI 應用程序使用的安全管理器。如果沒有設置安全管理器,RMI 的類加載器就不會從遠程下載任何的類。

90.解釋下 Marshalling 和 demarshalling 。

當應用程序希望把內存對象跨網絡傳遞到另一臺主機或者是持久化到存儲的時候,就必須要把對象在內存裏面的表示轉化成合適的格式。這個過程就叫做 Marshalling ,反之就是 demarshalling 。

91.解釋下 Serialization 和 Deserialization。

Java 提供了一種叫做對象序列化的機制,他把對象表示成一連串的字節,裏面包含了對象的數據,對象的類型信息,對象內部的數據的類型信息等等。因此,序列化可以看成是爲了把對象存儲在磁盤上或者是從磁盤上讀出來並重建對象而把對象扁平化的一種方式。反序列化是把對象從扁平狀態轉化成活動對象的相反的步驟。

92.什麼是 Servlet?

Servlet 是用來處理客戶端請求併產生動態網頁內容的 Java 類。Servlet 主要是用來處理或者是存儲 HTML
表單提交的數據,產生動態內容,在無狀態的 HTTP 協議下管理狀態信息。

93.說一下 Servlet 的體系結構。

所有的 Servlet 都必須要實現的核心的接口是 javax.servlet.Servlet 。每一個 Servlet 都必須要直接或者是間接實現這個接口,或者是繼承 javax.servlet.GenericServlet 或者 javax.servlet.http.HTTPServlet 。最後,Servlet 使用多線程可以並行的爲多個請求服務。

94.Applet 和 Servlet 有什麼區別?

Applet 是運行在客戶端主機的瀏覽器上的客戶端 Java 程序。而 Servlet 是運行在 web 服務器上的服務端的組件。applet 可以使用用戶界面類,而 Servlet 沒有用戶界面,相反,Servlet 是等待客戶端的 HTTP 請求, 然後爲請求產生響應。

95.GenericServlet 和 HttpServlet 有什麼區別?

GenericServlet 是一個通用的協議無關的 Servlet , 它實現了 Servlet 和 ServletConfig 接口。繼承自
GenericServlet 的 Servlet 應該要覆蓋 service()方法。最後,爲了開發一個能用在網頁上
服務於使用 HTTP 協議請求的 Servlet,你的 Servlet 必須要繼承自 HttpServlet 。這裏有 Servlet 的例子。

96.解釋下 Servlet 的生命週期。

對每一個客戶端的請求,Servlet 引擎載入 Servlet,調用它的 init()方法,完成 Servlet 的初始化。然後,
Servlet 對象通過爲每一個請求單獨調用 service()方法來處理所有隨後來自客戶端的請求,最後,調用
Servlet(譯者注:這裏應該是 Servlet 而不是 server)的 destroy()方法把 Servlet 刪除掉。

97.doGet()方法和 doPost()方法有什麼區別?

doGet:GET 方法會把名值對追加在請求的 URL 後面。因爲 URL 對字符數目有限制,進而限制了用在客戶端請求的參數值的數目。並且請求中的參數值是可見的,因此,敏感信息不能用這種方式傳遞。
doPOST:POST 方法通過把請求參數值放在請求體中來克服 GET 方法的限制,因此,可以發送的參數的數目是沒有限制的。最後,通過 POST 請求傳遞的敏感信息對外部客戶端是不可見的。

98.什麼是 Web 應用程序?

Web 應用程序是對 Web 或者是應用服務器的動態擴展。有兩種類型的 Web 應用:面向表現的和麪向服務的。面向表現的 Web 應用程序會產生包含了很多種標記語言和動態內容的交互的 web 頁面作爲對請求的響應。而面向服務的 Web 應用實現了 Web 服務的端點(endpoint)。一般來說,一個 Web 應用可以看成是一組安裝在服務器 URL 名稱空間的特定子集下面的 Servlet 的集合。

99.什麼是服務端包含(Server Side Include)?

服務端包含(SSI)是一種簡單的解釋型服務端腳本語言,大多數時候僅用在 Web 上,用 servlet 標籤嵌入進來。SSI 最常用的場景把一個或多個文件包含到 Web 服務器的一個 Web 頁面中。當瀏覽器訪問 Web 頁面的時候,Web 服務器會用對應的 servlet 產生的文本來替換 Web 頁面中的 servlet 標籤。

100.什麼是 Servlet 鏈(Servlet Chaining)?

Servlet 鏈是把一個 Servlet 的輸出發送給另一個 Servlet 的方法。第二個 Servlet 的輸出可以發送給第三個 Servlet,依次類推。鏈條上最後一個 Servlet 負責把響應發送給客戶端。

101.如何知道是哪一個客戶端的機器正在請求你的 Servlet?

ServletRequest 類可以找出客戶端機器的 IP 地址或者是主機名。getRemoteAddr()方法獲取客戶端主機的 IP
地址,getRemoteHost()可以獲取主機名。看下這裏的例子。

102.HTTP 響應的結構是怎麼樣的?

HTTP 響應由三個部分組成:
狀態碼(Status Code):描述了響應的狀態。可以用來檢查是否成功的完成了請求。請求失敗的情況下,狀態 碼 可 用 來 找 出 失 敗 的 原 因 。 如 果 Servlet 沒 有 返 回 狀 態 碼 , 默 認 會 返 回 成 功 的 狀 態 碼
HttpServletResponse.SC_OK。
HTTP 頭部(HTTP Header):它們包含了更多關於響應的信息。比如:頭部可以指定認爲響應過期的過期日期,或者是指定用來給用戶安全的傳輸實體內容的編碼格式。如何在 Serlet 中檢索 HTTP 的頭部看這裏。
主體(Body):它包含了響應的內容。它可以包含 HTML 代碼,圖片,等等。主體是由傳輸在
HTTP 消息中緊跟在頭部後面的數據字節組成的。

103.什麼是 cookie?session 和 cookie 有什麼區別?

cookie 是 Web 服務器發送給瀏覽器的一塊信息。瀏覽器會在本地文件中給每一個 Web 服務器存儲 cookie。以後瀏覽器在給特定的 Web 服務器發請求的時候,同時會發送所有爲該服務器存儲的 cookie。下面列出了 session 和 cookie 的區別: 無論客戶端瀏覽器做怎麼樣的設置,session 都應該能正常工作。客戶端可以選擇禁用 cookie,但是,session 仍然是能夠工作的,因爲客戶端無法禁用服務端的 session。在存儲的數據量方面session 和cookies 也是不一樣的。session 能夠存儲任意的Java 對象,cookie 只能存儲String 類型的對象。

104.瀏覽器和 Servlet 通信使用的是什麼協議?

瀏覽器和 Servlet 通信使用的是 HTTP 協議。

105.什麼是 HTTP 隧道?

HTTP 隧道是一種利用 HTTP 或者是 HTTPS 把多種網絡協議封裝起來進行通信的技術。因此,HTTP 協議扮演了一個打通用於通信的網絡協議的管道的包裝器的角色。把其他協議的請求掩蓋成 HTTP 的請求就是 HTTP 隧道。

106.sendRedirect()和 forward()方法有什麼區別?

sendRedirect()方法會創建一個新的請求,而 forward()方法只是把請求轉發到一個新的目標上。重定向(redirect) 以後,之前請求作用域範圍以內的對象就失效了,因爲會產生一個新的請求,而轉發(forwarding)以後,之前請求作用域範圍以內的對象還是能訪問的。一般認爲 sendRedirect()比 forward()要慢。

107.什麼是 URL 編碼和 URL 解碼?

URL 編碼是負責把 URL 裏面的空格和其他的特殊字符替換成對應的十六進制表示,反之就是解碼。

108.什麼是 JSP 頁面?

JSP 頁面是一種包含了靜態數據和 JSP 元素兩種類型的文本的文本文檔。靜態數據可以用任何基於文本的格式來表示,比如:HTML 或者 XML 。JSP 是一種混合了靜態內容和動態產生的內容的技術。這裏看下 JSP 的例子。

109.JSP 請求是如何被處理的?

瀏覽器首先要請求一個以.jsp 擴展名結尾的頁面,發起 JSP 請求,然後,Web 服務器讀取這個請求,使用
JSP 編譯器把 JSP 頁面轉化成一個 Servlet 類。需要注意的是,只有當第一次請求頁面或者是 JSP 文件發
生改變的時候 JSP 文件纔會被編譯,然後服務器調用 servlet 類,處理瀏覽器的請求。一旦請求執行結束,
servlet 會把響應發送給客戶端。這裏看下如何在 JSP 中獲取請求參數。

110.JSP 有什麼優點?

下面列出了使用 JSP 的優點:
JSP 頁面是被動態編譯成 Servlet 的,因此,開發者可以很容易的更新展現代碼。
JSP 頁面可以被預編譯。
JSP 頁面可以很容易的和靜態模板結合,包括:HTML 或者 XML,也可以很容易的和產生動態內容的代碼結合起來。開發者可以提供讓頁面設計者以類 XML 格式來訪問的自定義的 JSP 標籤庫。開發者可以在組件層做邏輯上的改變,而不需要編輯單獨使用了應用層邏輯的頁面。

111.什麼是 JSP 指令(Directive)?JSP 中有哪些不同類型的指令?

Directive 是當 JSP 頁面被編譯成 Servlet 的時候,JSP 引擎要處理的指令。Directive 用來設置頁面級別的 指 令 , 從 外 部 文 件 插 入 數 據 , 指 定 自 定 義 的 標 籤 庫 。 Directive 是 定 義 在 <%@ 和%>之間的。下面列出了不同類型的 Directive:
包含指令(Include directive):用來包含文件和合並文件內容到當前的頁面。
頁面指令(Page directive):用來定義 JSP 頁面中特定的屬性,比如錯誤頁面和緩衝區。
Taglib 指令:用來聲明頁面中使用的自定義的標籤庫。

112.什麼是 JSP 動作(JSP action)?

JSP 動作以 XML 語法的結構來控制 Servlet 引擎的行爲。當 JSP 頁面被請求的時候,JSP 動作
會被執行。它們可以被動態的插入到文件中,重用 JavaBean 組件,轉發用戶到其他的頁面,或者是給 Java
插件產生 HTML 代碼。下面列出了可用的動作:
jsp:include-當 JSP 頁面被請求的時候包含一個文件。
jsp:useBean-找出或者是初始化 Javabean 。
jsp:setProperty-設置 JavaBean 的屬性。
jsp:getProperty-獲取 JavaBean 的屬性。
jsp:forward-把請求轉發到新的頁面。
jsp:plugin-產生特定瀏覽器的代碼。

113.什麼是 Scriptlets ?

JSP 技術中,scriptlet 是嵌入在 JSP 頁面中的一段 Java 代碼。scriptlet 是位於標籤內部的所有的東西,在標籤與標籤之間,用戶可以添加任意有效的 scriplet 。

114.聲明(Decalaration)在哪裏?

聲明跟 Java 中的變量聲明很相似,它用來聲明隨後要被表達式或者 scriptlet 使用的變量。添加的聲明必須要用開始和結束標籤包起來。

115.什麼是表達式(Expression)?

JSP 表達式是 Web 服務器把腳本語言表達式的值轉化成一個 String 對象,插入到返回給客戶端的數據流中。表達式是在<%=和%>這兩個標籤之間定義的。

116.隱含對象是什麼意思?有哪些隱含對象?

JSP 隱含對象是頁面中的一些 Java 對象,JSP 容器讓這些 Java 對象可以爲開發者所使用。開發者不用明確的聲明就可以直接使用他們。JSP 隱含對象也叫做預定義變量。下面列出了 JSP 頁面中的隱含對象:
application
page
request
response
session
exception
out
config
pageContext

擴展連接:更多請點擊這裏

博主公衆號程序員小羊 只發面試相關推文
在這裏插入圖片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章