java筆試題

餘二五發表於2017-11-15

v下面有關JVM記憶體,說法錯誤的是?

A.程式計數器是一個比較小的記憶體區域,用於指示當前執行緒所執行的位元組碼執行到了第幾行,是執行緒隔離的

B.Java方法執行記憶體模型,用於儲存區域性變數,運算元棧,動態連結,方法出口等資訊,是執行緒隔離的

C.方法區用於儲存JVM載入的類資訊、常量、靜態變數、即使編譯器編譯後的程式碼等資料,是執行緒隔離的

D.原則上講,所有的物件都在堆區上分配記憶體,是執行緒之間共享的

解析:方法區在JVM中也是一個非常重要的區域,它與堆一樣,是被 執行緒共享 的區域。 在方法區中,儲存了每個類的資訊(包括類的名稱、方法資訊、欄位資訊)、靜態變數、常量以及編譯器編譯後的程式碼等。

  正確答案: C

v下面有關jdbc statement的說法錯誤的是?

A.JDBC提供了Statement、PreparedStatement 和 CallableStatement三種方式來執行查詢語句,其中 Statement 用於通用查詢, PreparedStatement 用於執行引數化查詢,而 CallableStatement則是用於儲存過程

B.對於PreparedStatement來說,資料庫可以使用已經編譯過及定義好的執行計劃,由於 PreparedStatement 物件已預編譯過,所以其執行速度要快於 Statement 物件”

C.PreparedStatement中,“?” 叫做佔位符,一個佔位符可以有一個或者多個值

D.PreparedStatement可以阻止常見的SQL隱碼攻擊式攻擊

解析:JDBC statement中的PReparedStatement的佔位符對應著即將與之對應當值,並且一個佔位符只能對應一個值,如果能對應多個就會引起混淆。sql語句是確定的,那麼一個佔位符必定只能對應一個值

  正確答案: C

v下面有關servlet和cgi的描述,說法錯誤的是?

A.servlet處於伺服器程式中,它通過多執行緒方式執行其service方法

B.CGI對每個請求都產生新的程式,服務完成後就銷燬

C.servlet在易用性上強於cgi,它提供了大量的實用工具例程,例如自動地解析和解碼HTML表單資料、讀取和設定HTTP頭、處理Cookie、跟蹤會話狀態等

D.cgi在移植性上高於servlet,幾乎所有的主流伺服器都直接或通過外掛支援cgi

解析:servlet處於伺服器程式中,它通過多執行緒方式執行其service方法,一個例項可以服務於多個請求,並且其例項一般不會銷燬,而CGI對每個請求都產生新的程式,服務完成後就銷燬,所以效率上低於servlet。CGI不可移植,為某一特定平臺編寫的CGI應用只能執行於這一環境中。每一個CGI應用存在於一個由客戶端請求啟用的程式中,並且在請求被服務後被解除安裝。這種模式將引起很高的記憶體、CPU開銷,而且在同一程式中不能服務多個客戶。

  正確答案:D

v下面有關servlet service描述錯誤的是? 

A.不管是post還是get方法提交過來的連線,都會在service中處理

B.doGet/doPost 則是在 javax.servlet.GenericServlet 中實現的

C.service()是在javax.servlet.Servlet介面中定義的

D.service判斷請求型別,決定是呼叫doGet還是doPost方法

解析:doGet/doPost 則是在 javax.servlet.http.HttpServlet 中實現的

  正確答案: B 

v下列有關Servlet的生命週期,說法不正確的是?

A.在建立自己的Servlet時候,應該在初始化方法init()方法中建立Servlet例項

B.在Servlet生命週期的服務階段,執行service()方法,根據使用者請求的方法,執行相應的doGet()或是doPost()方法

C.在銷燬階段,執行destroy()方法後會釋放Servlet 佔用的資源

D.destroy()方法僅執行一次,即在伺服器停止且解除安裝Servlet時執行該方法

解析:servlet是由Servlet容器負責載入Servlet類,建立Servlet物件並例項化,然後呼叫Servlet的init方法,進行初始化,之後呼叫Service方法。例項化和初始化不同

  正確答案: A   

v下面有關servlet中init,service,destroy方法描述錯誤的是?

A.init()方法是servlet生命的起點。一旦載入了某個servlet,伺服器將立即呼叫它的init()方法

B.Service()方法處理客戶機發出的所有請求

C.destroy()方法標誌servlet生命週期的結束

D.servlet在多執行緒下使用了同步機制,因此,在併發程式設計下servlet是執行緒安全的

解析:servlet在多執行緒下其本身並不是執行緒安全的。如果在類中定義成員變數,而在service中根據不同的執行緒對該成員變數進行更改,那麼在併發的時候就會引起錯誤。最好是在方法中,定義區域性變數,而不是類變數或者物件的成員變數。由於方法中的區域性變數是在棧中,彼此各自都擁有獨立的執行空間而不會互相干擾,因此才做到執行緒安全。Servlet的執行緒安全問題只有在大量的併發訪問時才會顯現出來,並且很難發現,因此在編寫Servlet程式時要特別注意。執行緒安全問題主要是由例項變數造成的,因此在Servlet中應避免使用例項變數。如果應用程式設計無法避免使用例項變數,那麼使用同步來保護要使用的例項變數,但為保證系統的最佳效能,應該同步可用性最小的程式碼路徑。例項變數:定義在類中但在任何方法之外。

  正確答案: D 

v下面有關struts1和struts2的區別,描述錯誤的是?

A.Struts1要求Action類繼承一個抽象基類。Struts 2 Action類可以實現一個Action介面

B.Struts1 Action物件為每一個請求產生一個例項。Struts2 Action是單例模式並且必須是執行緒安全的

C.Struts1 Action 依賴於Servlet API,Struts 2 Action不依賴於容器,允許Action脫離容器單獨被測試

D.Struts1 整合了JSTL,Struts2可以使用JSTL,但是也支援OGNL

解析:

v從action類上分析:

1.Struts1要求Action類繼承一個抽象基類。Struts1的一個普遍問題是使用抽象類程式設計而不是介面。 
2. Struts 2 Action類可以實現一個Action介面,也可實現其他介面,使可選和定製的服務成為可能。Struts2提供一個ActionSupport基類去實現常用的介面。Action介面不是必須的,任何有execute標識的POJO物件都可以用作Struts2的Action物件。

v從Servlet 依賴分析: 

3. Struts1 Action 依賴於Servlet API ,因為當一個Action被呼叫時HttpServletRequest 和 HttpServletResponse 被傳遞給execute方法。 
4. Struts 2 Action不依賴於容器,允許Action脫離容器單獨被測試。如果需要,Struts2 Action仍然可以訪問初始的request和response。但是,其他的元素減少或者消除了直接訪問HttpServetRequest 和 HttpServletResponse的必要性。

v從action執行緒模式分析: 

5. Struts1 Action是單例模式並且必須是執行緒安全的,因為僅有Action的一個例項來處理所有的請求。單例策略限制了Struts1 Action能作的事,並且要在開發時特別小心。Action資源必須是執行緒安全的或同步的。 
6. Struts2 Action物件為每一個請求產生一個例項,因此沒有執行緒安全問題。(實際上,servlet容器給每個請求產生許多可丟棄的物件,並且不會導致效能和垃圾回收問題)

  正確答案: B 

vforward和redirect是最常問的兩個問題

forward,伺服器獲取跳轉頁面內容傳給使用者,使用者位址列不變
redirect,是伺服器向使用者傳送轉向的地址,redirect後位址列變成新的地址
 

v下面哪一項不是載入驅動程式的方法?

A.通過DriverManager.getConnection方法載入

B.呼叫方法 Class.forName

C.通過新增系統的jdbc.drivers屬性

D.通過registerDriver方法註冊

JDBC註冊驅動程式三種方式: http://blog.sina.com.cn/s/blog_670c5a4001017e2e.html

正確答案: A 

 

v關於sleep()和wait(),以下描述錯誤的一項是( )

A.sleep是執行緒類(Thread)的方法,wait是Object類的方法;

B.sleep不釋放物件鎖,wait放棄物件鎖

C.sleep暫停執行緒、但監控狀態仍然保持,結束後會自動恢復

D.wait後進入等待鎖定池,只有針對此物件發出notify方法後獲得物件鎖進入執行狀態

解析:

Java中的多執行緒是一種搶佔式的機制,而不是分時機制。搶佔式的機制是有多個執行緒處於可執行狀態,但是隻有一個執行緒在執行。 
共同點 : 
1. 他們都是在多執行緒的環境下,都可以在程式的呼叫處阻塞指定的毫秒數,並返回。 
2. wait()和sleep()都可以通過interrupt()方法 打斷執行緒的暫停狀態 ,從而使執行緒立刻丟擲InterruptedException。 
如果執行緒A希望立即結束執行緒B,則可以對執行緒B對應的Thread例項呼叫interrupt方法。如果此刻執行緒B正在wait/sleep/join,則執行緒B會立刻丟擲InterruptedException,在catch() {} 中直接return即可安全地結束執行緒。 
需要注意的是,InterruptedException是執行緒自己從內部丟擲的,並不是interrupt()方法丟擲的。對某一執行緒呼叫 interrupt()時,如果該執行緒正在執行普通的程式碼,那麼該執行緒根本就不會丟擲InterruptedException。但是,一旦該執行緒進入到 wait()/sleep()/join()後,就會立刻丟擲InterruptedException 。 
不同點 :  
1.每個物件都有一個鎖來控制同步訪問。Synchronized關鍵字可以和物件的鎖互動,來實現執行緒的同步。 
sleep方法沒有釋放鎖,而wait方法釋放了鎖,使得其他執行緒可以使用同步控制塊或者方法。 
2.wait,notify和notifyAll只能在同步控制方法或者同步控制塊裡面使用,而sleep可以在任何地方使用 
3.sleep必須捕獲異常,而wait(可能會產生 InterruptedException),notify和notifyAll不需要捕獲異常 
4.sleep是執行緒類(Thread)的方法,導致此執行緒暫停執行指定時間,給執行機會給其他執行緒,但是監控狀態依然保持,到時後會自動恢復。呼叫sleep不會釋放物件鎖。
5.wait是Object類的方法,對此物件呼叫wait方法導致本執行緒放棄物件鎖,進入等待此物件的等待鎖定池,只有針對此物件發出notify方法(或notifyAll)後本執行緒才進入物件鎖定池準備獲得物件鎖進入執行狀態。

正確答案: D

 

v在jdk1.5的環境下,有如下4條語句:

Integer i01 = 59;
int i02 = 59;
Integer i03 =Integer.valueOf(59);
Integer i04 = new Integer(59)。
 
A.System.out.println(i01== i02);
B.System.out.println(i01== i03);
C.System.out.println(i03== i04);
D.System.out.println(i02== i04);

解析:
VM中一個位元組以下的整型資料會在JVM啟動的時候載入進記憶體,除非用new Integer()顯式的建立物件,否則都是同一個物件,所有隻有i04是一個新物件,其他都是同一個物件。所有A,B選項為true
C選項i03和i04是兩個不同的物件,返回false,D選項i02是基本資料型別,比較的時候比較的是數值,返回true。另外Integer和int比較的時候是值,也就是Integer要進行拆箱的操作。

  正確答案: C

v關於struts專案中的類與MVC模式的對應關係,說法錯誤的是

A.Jsp檔案實現檢視View的功能

B.ActionServlet這一個類是整個struts專案的控制器

C.ActionForm、Action都屬於Model部分

D.一個struts專案只能有一個Servlet

解析:Model: MVC系統中的Model部分從概念上可以分為兩類――系統的內部狀態,和改變系統狀態的動作。Struts為Model部分提供了Action和ActionForm物件:所有的Action處理器物件都是開發者從Struts的Action類派生的子類。Action處理器物件封裝了具體的處理邏輯,呼叫業務邏輯模組,並且把響應提交到合適的View元件以產生響應。Struts提供的ActionForm元件物件,它可以通過定義屬性描述客戶端表單資料。開發者可以從它派生子類物件,利用它和Struts提供的自定義標記庫結合可以實現對客戶端的表單資料的良好封裝和支援,Action處理器物件可以直接對它進行讀寫,而不再需要和request、response物件進行資料互動。通過ActionForm元件物件實現了對View和Model之間互動的支援。Struts通常建議使用一組JavaBean表示系統的內部狀態,根據系統的複雜度也可以使用像Entity EJB 和 Session EJB等元件來實現系統狀態。Struts建議在實現時把”做什麼”(Action)和”如何做”(業務邏輯)分離。這樣可以實現業務邏輯的重用。

EJB是sun的JavaEE伺服器端元件模型,設計目標與核心應用是部署分散式應用程式。簡單來說就是把已經編寫好的程式(即:類)打包放在伺服器上執行。憑藉java跨平臺的優勢,用EJB技術部署的分散式系統可以不限於特定的平臺。EJB (Enterprise JavaBean)是J2EE(javaEE)的一部分,定義了一個用於開發基於元件的企業多重應用程式的標準。其特點包括網路服務支援和核心開發工具(SDK)。 在J2EE裡,Enterprise Java Beans(EJB)稱為Java 企業Bean,是Java的核心程式碼,分別是會話Bean(Session Bean),實體Bean(Entity Bean)和訊息驅動Bean(MessageDriven Bean)。

  正確答案: D 

v下面有關jsp中靜態include和動態include的區別,說法錯誤的是?  

A.動態INCLUDE:用jsp:include動作實現

B.靜態INCLUDE:用include偽碼實現,定不會檢查所含檔案的變化,適用於包含靜態頁面<%@ include file=”included.htm” %>

C.靜態include的結果是把其他jsp引入當前jsp,兩者合為一體;動態include的結構是兩者獨立,直到輸出時才合併

D.靜態include和動態include都可以允許變數同名的衝突.頁面設定也可以借用主檔案的

解析:

動態 INCLUDE 用 jsp:include 動作實現 <jsp:include page=”included.jsp” flush=”true” /> 它總是會檢查所含檔案中的變化 , 適合用於包含動態頁面 , 並且可以帶引數。各個檔案分別先編譯,然後組合成一個檔案。

靜態 INCLUDE 用 include 偽碼實現 , 定不會檢查所含檔案的變化 , 適用於包含靜態頁面 <%@ include file=”included.htm” %>。先將檔案的程式碼被原封不動地加入到了主頁面從而合成一個檔案,然後再進行翻譯,此時不允許有相同的變數。 

以下是對 include 兩種用法的區別 , 主要有兩個方面的不同 ;

    一 : 執行時間上 :

    <%@ include file=”relativeURI”%> 是在翻譯階段執行

    <jsp:include page=”relativeURI” flush=”true” /> 在請求處理階段執行 .

    二 : 引入內容的不同 :

    <%@ include file=”relativeURI”%>

    引入靜態文字 (html,jsp), 在 JSP 頁面被轉化成 servlet 之前和它融和到一起 .

    <jsp:include page=”relativeURI” flush=”true” /> 引入執行頁面或 servlet 所生成的應答文字 .

正確答案: D

本文轉自 小眼兒 部落格園部落格,原文連結:http://www.cnblogs.com/hujunzheng/p/5049687.html,如需轉載請自行聯絡原作者


相關文章