java筆試題


下面有關JVM內存,說法錯誤的是?

A.程序計數器是一個比較小的內存區域,用於指示當前線程所執行的字節碼執行到了第幾行,是線程隔離的

B.Java方法執行內存模型,用於存儲局部變量,操作數棧,動態鏈接,方法出口等信息,是線程隔離的

C.方法區用於存儲JVM加載的類信息、常量、靜態變量、即使編譯器編譯后的代碼等數據,是線程隔離的

D.原則上講,所有的對象都在堆區上分配內存,是線程之間共享的

解析:方法區在JVM中也是一個非常重要的區域,它與堆一樣,是被 線程共享 的區域。 在方法區中,存儲了每個類的信息(包括類的名稱、方法信息、字段信息)、靜態變量、常量以及編譯器編譯后的代碼等。

  正確答案: C

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

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

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

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

D.PreparedStatement可以阻止常見的SQL注入式攻擊

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

  正確答案: C

下面有關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

下面有關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 

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

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

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

C.在銷毀階段,執行destroy()方法后會釋放Servlet 占用的資源

D.destroy()方法僅執行一次,即在服務器停止且卸載Servlet時執行該方法

解析:servlet是由Servlet容器負責加載Servlet類,創建Servlet對象並實例化,然后調用Servlet的init方法,進行初始化,之后調用Service方法。實例化和初始化不同

  正確答案: A   

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

A.init()方法是servlet生命的起點。一旦加載了某個servlet,服務器將立即調用它的init()方法

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

C.destroy()方法標志servlet生命周期的結束

D.servlet在多線程下使用了同步機制,因此,在並發編程下servlet是線程安全的

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

  正確答案: D 

下面有關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

解析:

從action類上分析:

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

從Servlet 依賴分析: 

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

從action線程模式分析: 

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

  正確答案: B 

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

forward,服務器獲取跳轉頁面內容傳給用戶,用戶地址欄不變
redirect,是服務器向用戶發送轉向的地址,redirect后地址欄變成新的地址
 

下面哪一項不是加載驅動程序的方法?

A.通過DriverManager.getConnection方法加載

B.調用方法 Class.forName

C.通過添加系統的jdbc.drivers屬性

D.通過registerDriver方法注冊

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

正確答案: A 

 

關於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

 

在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

關於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 

下面有關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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM