Java面試題全集(13)

Java面試題全集(13)

白玉 IT哈哈

121、解釋一下網絡應用的模式及其特點。

答:典型的網絡應用模式大致有三類:B/S、C/S、P2P。其中B代表瀏覽器(Browser)、C代表客戶端(Client)、S代表服務器(Server),P2P是對等模式,不區分客戶端和服務器。B/S應用模式中可以視爲特殊的C/S應用模式,只是將C/S應用模式中的特殊的客戶端換成了瀏覽器,因爲幾乎所有的系統上都有瀏覽器,那麼只要打開瀏覽器就可以使用應用,沒有安裝、配置、升級客戶端所帶來的各種開銷。P2P應用模式中,成千上萬臺彼此連接的計算機都處於對等的地位,整個網絡一般來說不依賴專用的集中服務器。網絡中的每一臺計算機既能充當網絡服務的請求者,又對其它計算機的請求作出響應,提供資源和服務。通常這些資源和服務包括:信息的共享和交換、計算資源(如CPU的共享)、存儲共享(如緩存和磁盤空間的使用)等,這種應用模式最大的阻力安全性、版本等問題,目前有很多應用都混合使用了多種應用模型,最常見的網絡視頻應用,它幾乎把三種模式都用上了。

補充:此題要跟"電子商務模式"區分開,因爲有很多人被問到這個問題的時候馬上想到的是B2B(如阿里巴巴)、B2C(如噹噹、亞馬遜、京東)、C2C(如淘寶、拍拍)、C2B(如威客)、O2O(如美團、餓了麼)。對於這類問題,可以去百度上面科普一下。

122、什麼是Web Service(Web服務)?

答:從表面上看,Web Service就是一個應用程序,它向外界暴露出一個能夠通過Web進行調用的API。這就是說,你能夠用編程的方法透明的調用這個應用程序,不需要了解它的任何細節,跟你使用的編程語言也沒有關係。例如可以創建一個提供天氣預報的Web Service,那麼無論你用哪種編程語言開發的應用都可以通過調用它的API並傳入城市信息來獲得該城市的天氣預報。之所以稱之爲Web Service,是因爲它基於HTTP協議傳輸數據,這使得運行在不同機器上的不同應用無須藉助附加的、專門的第三方軟件或硬件,就可相互交換數據或集成。

補充:這裏必須要提及的一個概念是SOA(Service-Oriented Architecture,面向服務的架構),SOA是一種思想,它將應用程序的不同功能單元通過中立的契約聯繫起來,獨立於硬件平臺、操作系統和編程語言,使得各種形式的功能單元能夠更好的集成。顯然,Web Service是SOA的一種較好的解決方案,它更多的是一種標準,而不是一種具體的技術。

123、概念解釋:SOAP、WSDL、UDDI。

答:

  • SOAP:簡單對象訪問協議(Simple Object Access Protocol),是Web Service中交換數據的一種協議規範。
  • WSDL:Web服務描述語言(Web Service Description Language),它描述了Web服務的公共接口。這是一個基於XML的關於如何與Web服務通訊和使用的服務描述;也就是描述與目錄中列出的Web服務進行交互時需要綁定的協議和信息格式。通常採用抽象語言描述該服務支持的操作和信息,使用的時候再將實際的網絡協議和信息格式綁定給該服務。
  • UDDI:統一描述、發現和集成(Universal Description, Discovery and Integration),它是一個基於XML的跨平臺的描述規範,可以使世界範圍內的企業在互聯網上發佈自己所提供的服務。簡單的說,UDDI是訪問各種WSDL的一個門面(可以參考設計模式中的門面模式)。

提示:關於Web Service的相關概念和知識可以在W3CSchool上找到相關的資料。

124、Java規範中和Web Service相關的規範有哪些?

答:Java規範中和Web Service相關的有三個:

  • JAX-WS(JSR 224):這個規範是早期的基於SOAP的Web Service規範JAX-RPC的替代版本,它並不提供向下兼容性,因爲RPC樣式的WSDL以及相關的API已經在Java EE5中被移除了。WS-MetaData是JAX-WS的依賴規範,提供了基於註解配置Web Service和SOAP消息的相關API。
  • JAXM(JSR 67):定義了發送和接收消息所需的API,相當於Web Service的服務器端。
  • JAX-RS(JSR 311 & JSR 339 & JSR 370):是Java針對REST(Representation State Transfer)架構風格制定的一套Web Service規範。REST是一種軟件架構模式,是一種風格,它不像SOAP那樣本身承載着一種消息協議, (兩種風格的Web Service均採用了HTTP做傳輸協議,因爲HTTP協議能穿越防火牆,Java的遠程方法調用(RMI)等是重量級協議,通常不能穿越防火牆),因此可以將REST視爲基於HTTP協議的軟件架構。REST中最重要的兩個概念是資源定位和資源操作,而HTTP協議恰好完整的提供了這兩個點。HTTP協議中的URI可以完成資源定位,而GET、POST、OPTION、DELETE方法可以完成資源操作。因此REST完全依賴HTTP協議就可以完成Web Service,而不像SOAP協議那樣只利用了HTTP的傳輸特性,定位和操作都是由SOAP協議自身完成的,也正是由於SOAP消息的存在使得基於SOAP的Web Service顯得笨重而逐漸被淘汰。

125、介紹一下你瞭解的Java領域的Web Service框架。

答:Java領域的Web Service框架很多,包括Axis2(Axis的升級版本)、Jersey(RESTful的Web Service框架)、CXF(XFire的延續版本)、Hessian、Turmeric、JBoss SOA等,其中絕大多數都是開源框架。

提示:面試被問到這類問題的時候一定選擇自己用過的最熟悉的作答,如果之前沒有了解過就應該在面試前花一些時間瞭解其中的兩個,並比較其優缺點,這樣才能在面試時給出一個漂亮的答案。

126、什麼是ORM?

答:對象關係映射(Object-Relational Mapping,簡稱ORM)是一種爲了解決程序的面向對象模型與數據庫的關係模型互不匹配問題的技術;簡單的說,ORM是通過使用描述對象和數據庫之間映射的元數據(在Java中可以用XML或者是註解),將程序中的對象自動持久化到關係數據庫中或者將關係數據庫表中的行轉換成Java對象,其本質上就是將數據從一種形式轉換到另外一種形式。

127、持久層設計要考慮的問題有哪些?你用過的持久層框架有哪些?

答:所謂"持久"就是將數據保存到可掉電式存儲設備中以便今後使用,簡單的說,就是將內存中的數據保存到關係型數據庫、文件系統、消息隊列等提供持久化支持的設備中。持久層就是系統中專注於實現數據持久化的相對獨立的層面。
持久層設計的目標包括:

  • 數據存儲邏輯的分離,提供抽象化的數據訪問接口。
  • 數據訪問底層實現的分離,可以在不修改代碼的情況下切換底層實現。
  • 資源管理和調度的分離,在數據訪問層實現統一的資源調度(如緩存機制)。
  • 數據抽象,提供更面向對象的數據操作。
    持久層框架有:
  • Hibernate
  • MyBatis
  • TopLink
  • Guzz
  • jOOQ
  • Spring Data
  • ActiveJDBC

128、Hibernate中SessionFactory是線程安全的嗎?Session是線程安全的嗎(兩個線程能夠共享同一個Session嗎)?

答:SessionFactory對應Hibernate的一個數據存儲的概念,它是線程安全的,可以被多個線程併發訪問。SessionFactory一般只會在啓動的時候構建。對於應用程序,最好將SessionFactory通過單例模式進行封裝以便於訪問。Session是一個輕量級非線程安全的對象(線程間不能共享session),它表示與數據庫進行交互的一個工作單元。Session是由SessionFactory創建的,在任務完成之後它會被關閉。Session是持久層服務對外提供的主要接口。Session會延遲獲取數據庫連接(也就是在需要的時候纔會獲取)。爲了避免創建太多的session,可以使用ThreadLocal將session和當前線程綁定在一起,這樣可以讓同一個線程獲得的總是同一個session。Hibernate 3中SessionFactory的getCurrentSession()方法就可以做到。

129、Hibernate中Session的load和get方法的區別是什麼?

答:主要有以下三項區別:
① 如果沒有找到符合條件的記錄,get方法返回null,load方法拋出異常。
② get方法直接返回實體類對象,load方法返回實體類對象的代理。
③ 在Hibernate 3之前,get方法只在一級緩存中進行數據查找,如果沒有找到對應的數據則越過二級緩存,直接發出SQL語句完成數據讀取;load方法則可以從二級緩存中獲取數據;從Hibernate 3開始,get方法不再是對二級緩存只寫不讀,它也是可以訪問二級緩存的。


說明:對於load()方法Hibernate認爲該數據在數據庫中一定存在可以放心的使用代理來實現延遲加載,如果沒有數據就拋出異常,而通過get()方法獲取的數據可以不存在。

130、Session的save()、update()、merge()、lock()、saveOrUpdate()和persist()方法分別是做什麼的?有什麼區別?

答:Hibernate的對象有三種狀態:瞬時態(transient)、持久態(persistent)和遊離態(detached),如第135題中的圖所示。瞬時態的實例可以通過調用save()、persist()或者saveOrUpdate()方法變成持久態;遊離態的實例可以通過調用 update()、saveOrUpdate()、lock()或者replicate()變成持久態。save()和persist()將會引發SQL的INSERT語句,而update()或merge()會引發UPDATE語句。save()和update()的區別在於一個是將瞬時態對象變成持久態,一個是將遊離態對象變爲持久態。merge()方法可以完成save()和update()方法的功能,它的意圖是將新的狀態合併到已有的持久化對象上或創建新的持久化對象。對於persist()方法,按照官方文檔的說明:① persist()方法把一個瞬時態的實例持久化,但是並不保證標識符被立刻填入到持久化實例中,標識符的填入可能被推遲到flush的時間;② persist()方法保證當它在一個事務外部被調用的時候並不觸發一個INSERT語句,當需要封裝一個長會話流程的時候,persist()方法是很有必要的;③ save()方法不保證第②條,它要返回標識符,所以它會立即執行INSERT語句,不管是在事務內部還是外部。至於lock()方法和update()方法的區別,update()方法是把一個已經更改過的脫管狀態的對象變成持久狀態;lock()方法是把一個沒有更改過的脫管狀態的對象變成持久狀態。

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