經(jīng)典Java面試100例,輕松搞定BAT——高頻面試題(下)

      網(wǎng)友投稿 596 2022-05-29

      JDBC

      73. 什么是 JDBC?

      JDBC 是允許用戶在不同數(shù)據(jù)庫之間做選擇的一個抽象層。 JDBC 允許開發(fā)者用 JAVA 寫數(shù)據(jù)庫應(yīng)用程序,而不需要關(guān)心底層特定數(shù)據(jù)庫的細(xì)節(jié)。

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

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

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

      這個方法用來載入跟數(shù)據(jù)庫建立連接的驅(qū)動。

      76. PreparedStatement 比 Statement 有什么優(yōu)勢?

      PreparedStatements 是預(yù)編譯的 , 因此 , 性能會更好。同時 , 不同的查詢參數(shù)值 ,

      PreparedStatement 可以重用。

      77. 什么時候使用 CallableStatement? 用來準(zhǔn)備 CallableStatement 的方法是什么?

      CallableStatement 用來執(zhí)行存儲過程。存儲過程是由數(shù)據(jù)庫存儲和提供的。存儲過程可以接受輸入?yún)?shù),也可以有返回結(jié)果。非常鼓勵使用存儲過程,因為它提供了安全性和模塊化。準(zhǔn) 備 一 個 CallableStatement 的 方 法 是 :CallableStament.prepareCall();

      78. 數(shù)據(jù)庫連接池是什么意思?

      像打開關(guān)閉數(shù)據(jù)庫連接這種和數(shù)據(jù)庫的交互可能是很費時的,尤其是當(dāng)客戶端數(shù)量增加的時候,會消耗大量的資源,成本是非常高的。可以在應(yīng)用服務(wù)器啟動的時候建立很多個數(shù)據(jù)庫連接并維護(hù)在一個池中。連接請求由池中的連接提供。在連接使用完畢以后,把連接歸還到 池中,以用于滿足將來更多的請求。

      遠(yuǎn)程方法調(diào)用(RMI)

      79. 什么是 RMI?

      Java 遠(yuǎn)程方法調(diào)用(JavaRMI)是 Java API 對遠(yuǎn)程過程調(diào)用(RPC)提供的面向?qū)ο蟮牡葍r形式,支持直接傳輸序列化的 Java 對象和分布式垃圾回收。遠(yuǎn)程方法調(diào)用可以看做是激活遠(yuǎn)程正在運行的對象上的方法的步驟。 RMI 對調(diào)用者是位置透明的,因為調(diào)用者感覺方法是執(zhí)行在本地運行的對象上的。看下 RMI 的一些注意事項。

      80. RMI 體系結(jié)構(gòu)的基本原則是什么?

      RMI 體系結(jié)構(gòu)是基于一個非常重要的行為定義和行為實現(xiàn)相分離的原則。 RMI 允許定義行為的代碼和實現(xiàn)行為的代碼相分離,并且運行在不同的 JVM 上。

      81. RMI 體系結(jié)構(gòu)分哪幾層?

      經(jīng)典Java面試100例,輕松搞定BAT——高頻面試題(下)

      RMI 體系結(jié)構(gòu)分以下幾層:

      存根和骨架層(Stub and Skeleton layer):這一層對程序員是透明的,它主要負(fù)責(zé)攔截客戶端發(fā)出的方法調(diào)用請求,然后把請求重定向給遠(yuǎn)程的 RMI 服務(wù)。

      遠(yuǎn)程引用層(Remote Reference Layer): RMI 體系結(jié)構(gòu)的第二層用來解析客戶端對服務(wù)端遠(yuǎn)程對象的引用。

      這一層解析并管理客戶端對服務(wù)端遠(yuǎn)程對象的引用。連接是點到點的。

      傳輸層(Transport layer):這一層負(fù)責(zé)連接參與服務(wù)的兩個 JVM 。這一層是建立在網(wǎng)絡(luò)上機(jī)器間的 TCP/IP 連接之上的。它提供了基本的連接服務(wù),還有一些防火墻穿透策略。

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

      遠(yuǎn)程接口用來標(biāo)識哪些方法是可以被非本地虛擬機(jī)調(diào)用的接口。遠(yuǎn)程對象必須要直接或者是間接實現(xiàn)遠(yuǎn)程接口。實現(xiàn)了遠(yuǎn)程接口的類應(yīng)該聲明被實現(xiàn)的遠(yuǎn)程接口,給每一個遠(yuǎn)程對象定義構(gòu)造函數(shù),給所有遠(yuǎn)程接口的方法提供實現(xiàn)。

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

      java.rmi.Naming 類用來存儲和獲取在遠(yuǎn)程對象注冊表里面的遠(yuǎn)程對象的引用。 Naming 類的每一個方法接收一個 URL 格式的 String 對象作為它的參數(shù)。

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

      綁定是為了查詢找遠(yuǎn)程對象而給遠(yuǎn)程對象關(guān)聯(lián)或者是注冊以后會用到的名稱的過程。遠(yuǎn)程對象可以使用Naming 類的 bind()或者 rebind()方法跟名稱相關(guān)聯(lián)。

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

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

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

      為了讓 RMI 程序能正確運行必須要包含以下幾個步驟: 編譯所有的源文件。

      使用 rmic 生成 stub。

      啟動 rmiregistry。啟動 RMI 服務(wù)器。

      運行客戶端程序。

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

      遠(yuǎn)程對象的 stub 扮演了遠(yuǎn)程對象的代表或者代理的角色。調(diào)用者在本地 stub 上調(diào)用方法,它負(fù)責(zé)在遠(yuǎn)程對象上執(zhí)行方法。當(dāng) stub 的方法被調(diào)用的時候,會經(jīng)歷以下幾個步驟:

      初始化到包含了遠(yuǎn)程對象的 JVM 的連接。序列化參數(shù)到遠(yuǎn)程的 JVM 。

      等待方法調(diào)用和執(zhí)行的結(jié)果。

      反序列化返回的值或者是方法沒有執(zhí)行成功情況下的異常。

      把值返回給調(diào)用者。

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

      DGC 叫做分布式垃圾回收。 RMI 使用 DGC 來做自動垃圾回收。因為 RMI 包含了跨虛擬機(jī)的遠(yuǎn)程對象的引用,垃圾回收是很困難的。 DGC 使用引用計數(shù)算法來給遠(yuǎn)程對象提供自動內(nèi)存管理。

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

      RMISecurityManager 使用下載好的代碼提供可被 RMI 應(yīng)用程序使用的安全管理器。如果沒有設(shè)置安全管理器, RMI 的類加載器就不會從遠(yuǎn)程下載任何的類。

      90. 解釋下 Marshalling 和 demarshalling 。

      當(dāng)應(yīng)用程序希望把內(nèi)存對象跨網(wǎng)絡(luò)傳遞到另一臺主機(jī)或者是持久化到存儲的時候,就必須要把對象在內(nèi)存里面的表示轉(zhuǎn)化成合適的格式。這個過程就叫做 Marshalling ,反之就是 demarshalling 。

      91. 解釋下 Serialization 和 Deserialization。

      Java 提供了一種叫做對象序列化的機(jī)制,他把對象表示成一連串的字節(jié),里面包含了對象的數(shù)據(jù),對象的類型信息,對象內(nèi)部的數(shù)據(jù)的類型信息等等。因此,序列化可以看成是為了把對象存儲在磁盤上或者是從磁盤上讀出來并重建對象而把對象扁平化的一種方式。反序列化是把對象從扁平狀態(tài)轉(zhuǎn)化成活動對象的相反的步驟。

      Servlet

      92. 什么是 Servlet?

      Servlet 是用來處理客戶端請求并產(chǎn)生動態(tài)網(wǎng)頁內(nèi)容的 Java 類。 Servlet 主要是用來處理或者是存儲 HTML表單提交的數(shù)據(jù),產(chǎn)生動態(tài)內(nèi)容,在無狀態(tài)的 HTTP 協(xié)議下管理狀態(tài)信息。

      93. 說一下 Servlet 的體系結(jié)構(gòu)。

      所有的 Servlet 都必須要實現(xiàn)的核心的接口是 javax.servlet.Servlet 。每一個 Servlet 都必須要直接或者是間接實現(xiàn)這個接口,或者是繼承 javax.servlet.GenericServlet 或者 javax.servlet.http.HTTPServlet 。最后, Servlet使用多線程可以并行的為多個請求服務(wù)。

      94. Applet 和 Servlet 有什么區(qū)別?

      Applet 是運行在客戶端主機(jī)的瀏覽器上的客戶端 Java 程序。而 Servlet 是運行在 web 服務(wù)器上的服務(wù)端的組件。 applet 可以使用用戶界面類,而 Servlet 沒有用戶界面,相反, Servlet 是等待客戶端的 HTTP 請求,然后為請求產(chǎn)生響應(yīng)。

      95. GenericServlet 和 HttpServlet 有什么區(qū)別?

      GenericServlet 是一個通用的協(xié)議無關(guān)的 Servlet,它實現(xiàn)了 Servlet 和 ServletConfig 接口。繼承自GenericServlet 的 Servlet 應(yīng)該要覆蓋 service()方法。最后,為了開發(fā)一個能用在網(wǎng)頁上服務(wù)于使用 HTTP 協(xié)議請求的 Servlet,你的 Servlet 必須要繼承自 HttpServlet 。這里有 Servlet 的例子。

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

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

      97. doGet()方法和 doPost()方法有什么區(qū)別?

      doGet: GET 方法會把名值對追加在請求的 URL 后面。因為 URL 對字符數(shù)目有限制,進(jìn)而限制了用在客戶端請求的參數(shù)值的數(shù)目。并且請求中的參數(shù)值是可見的,因此,敏感信息不能用這種方式傳遞。

      doPOST: POST 方法通過把請求參數(shù)值放在請求體中來克服 GET 方法的限制,因此,可以發(fā)送的參數(shù)的數(shù)目是沒有限制的。最后,通過 POST 請求傳遞的敏感信息對外部客戶端是不可見的。

      98. 什么是 Web 應(yīng)用程序?

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

      99. 什么是服務(wù)端包含(Server Side Include)?

      服務(wù)端包含(SSI)是一種簡單的解釋型服務(wù)端腳本語言,大多數(shù)時候僅用在 Web 上,用 servlet 標(biāo)簽嵌入進(jìn)來。 SSI 最常用的場景把一個或多個文件包含到 Web 服務(wù)器的一個 Web 頁面中。當(dāng)瀏覽器訪問 Web 頁面的時候, Web 服務(wù)器會用對應(yīng)的 servlet 產(chǎn)生的文本來替換 Web 頁面中的 servlet 標(biāo)簽。

      100. 什么是 Servlet 鏈(Servlet Chaining)?Servlet 鏈?zhǔn)前岩粋€ Servlet 的輸出發(fā)送給另一個 Servlet 的方法。第二個 Servlet 的輸出可以發(fā)送給第三個 Servlet,依次類推。鏈條上最后一個 Servlet 負(fù)責(zé)把響應(yīng)發(fā)送給客戶端。

      Java Servlet 數(shù)據(jù)庫

      版權(quán)聲明:本文內(nèi)容由網(wǎng)絡(luò)用戶投稿,版權(quán)歸原作者所有,本站不擁有其著作權(quán),亦不承擔(dān)相應(yīng)法律責(zé)任。如果您發(fā)現(xiàn)本站中有涉嫌抄襲或描述失實的內(nèi)容,請聯(lián)系我們jiasou666@gmail.com 處理,核實后本網(wǎng)站將在24小時內(nèi)刪除侵權(quán)內(nèi)容。

      上一篇:Kafka不只是個消息系統(tǒng)
      下一篇:華為云發(fā)布國內(nèi)首家AI模型市場,加速企業(yè)AI應(yīng)用落地
      相關(guān)文章
      亚洲精品无码aⅴ中文字幕蜜桃| 久久精品国产亚洲av日韩| 亚洲精品一区二区三区四区乱码 | 日韩色视频一区二区三区亚洲| 男人天堂2018亚洲男人天堂| 亚洲AV无码久久久久网站蜜桃| 亚洲精品自拍视频| 亚洲国产片在线观看| 亚洲成人免费网址| 亚洲国产日韩在线成人蜜芽| 亚洲国产美女精品久久| 亚洲国产理论片在线播放| 亚洲一区二区三区久久| 亚洲最大的黄色网| 亚洲色成人四虎在线观看| 狠狠色伊人亚洲综合网站色| 亚洲啪AV永久无码精品放毛片| 亚洲高清国产拍精品熟女| 亚洲а∨精品天堂在线| 国产精品亚洲二区在线| 亚洲精品99久久久久中文字幕| 亚洲中文字幕无码专区| 中文字幕亚洲一区二区va在线| 亚洲精品国产精品乱码不卡√ | 亚洲制服丝袜一区二区三区| 亚洲国产成人精品久久| 亚洲一区二区三区在线网站| 亚洲国产激情在线一区| 亚洲高清乱码午夜电影网| 亚洲国产精品无码久久青草| 久久久无码精品亚洲日韩软件| 亚洲午夜国产精品无码老牛影视| 亚洲色婷婷六月亚洲婷婷6月 | 国产亚洲精品a在线观看app| 久久精品国产亚洲| 亚洲成电影在线观看青青| 亚洲欧洲另类春色校园网站| 亚洲色大成网站www| 亚洲国产精品一区二区第四页| 国产亚洲精品一品区99热| 亚洲首页在线观看|