1. 程式人生 > >【java工程師能力評估】題目解析

【java工程師能力評估】題目解析

下面有關JVM記憶體,說法錯誤的是?
正確答案: C   你的答案: C (正確)
程式計數器是一個比較小的記憶體區域,用於指示當前執行緒所執行的位元組碼執行到了第幾行,是執行緒隔離的
虛擬機器棧描述的是Java方法執行的記憶體模型,用於儲存區域性變數,運算元棧,動態連結,方法出口等資訊,是執行緒隔離的
方法區用於儲存JVM載入的類資訊、常量、靜態變數、以及編譯器編譯後的程式碼等資料,是執行緒隔離的

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

方法區在JVM中也是一個非常重要的區域,它與堆一樣,是被 執行緒共享 的區域。在方法區中,儲存了每個類的資訊(包括類的名稱、方法資訊、欄位資訊)、靜態變數、常量以及編譯器編譯後的程式碼等。
下面有關jdbc statement的說法錯誤的是?
正確答案: C   你的答案: C (正確)
JDBC提供了Statement、PreparedStatement 和 CallableStatement三種方式來執行查詢語句,其中 Statement 用於通用查詢, PreparedStatement 用於執行引數化查詢,而 CallableStatement則是用於儲存過程
對於PreparedStatement來說,資料庫可以使用已經編譯過及定義好的執行計劃,由於 PreparedStatement 物件已預編譯過,所以其執行速度要快於 Statement 物件”
PreparedStatement中,“?” 叫做佔位符,一個佔位符可以有一個或者多個值

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

1.Statement、PreparedStatement和CallableStatement都是介面(interface)。  
2.Statement繼承自Wrapper、PreparedStatement繼承自Statement、CallableStatement繼承自PreparedStatement。  
3.  
Statement介面提供了執行語句和獲取結果的基本方法;  
PreparedStatement介面添加了處理 IN 引數的方法;  
CallableStatement介面添加了處理 OUT 引數的方法。  

4.  
a.Statement:  
普通的不帶參的查詢SQL;支援批量更新,批量刪除;  
b.PreparedStatement:  
可變引數的SQL

,編譯一次,執行多次,效率高;  
安全性好,有效防止Sql注入等問題;  
支援批量更新,批量刪除;  
c.CallableStatement:  
繼承自PreparedStatement,支援帶引數的SQL操作;  
支援呼叫儲存過程,提供了對輸出和輸入/輸出引數(INOUT)的支援;  



Statement每次執行sql語句,資料庫都要執行sql語句的編譯 ,  
最好用於僅執行一次查詢並返回結果的情形,效率高於PreparedStatement。  



PreparedStatement是預編譯的,使用PreparedStatement有幾個好處  
1. 在執行可變引數的一條SQL時,PreparedStatement比Statement的效率高,因為DBMS預編譯一條SQL當然會比多次編譯一條SQL的效率要高。  
2. 安全性好,有效防止Sql注入等問題。  
3.  對於多次重複執行的語句,使用PreparedStament效率會更高一點,並且在這種情況下也比較適合使用batch;  

4.  程式碼的可讀性和可維護性。

下面有關SPRING的事務傳播特性,說法錯誤的是?
正確答案: B   你的答案: B (正確)
PROPAGATION_SUPPORTS:支援當前事務,如果當前沒有事務,就以非事務方式執行
PROPAGATION_REQUIRED:支援當前事務,如果當前沒有事務,就丟擲異常
PROPAGATION_REQUIRES_NEW:新建事務,如果當前存在事務,把當前事務掛起
PROPAGATION_NESTED:支援當前事務,新增Savepoint點,與當前事務同步提交或回滾

 事務屬性的種類:   傳播行為、隔離級別、只讀和事務超時

a)傳播行為定義了被呼叫方法的事務邊界。

傳播行為

意義

PROPERGATION_MANDATORY

表示方法必須執行在一個事務中,如果當前事務不存在,就丟擲異常

PROPAGATION_NESTED

表示如果當前事務存在,則方法應該執行在一個巢狀事務中。否則,它看起來和PROPAGATION_REQUIRED 看起來沒什麼倆樣

PROPAGATION_NEVER

表示方法不能執行在一個事務中,否則丟擲異常

PROPAGATION_NOT_SUPPORTED

表示方法不能執行在一個事務中,如果當前存在一個事務,則該方法將被掛起

PROPAGATION_REQUIRED

表示當前方法必須執行在一個事務中,如果當前存在一個事務,那麼該方法執行在這個事務中,否則,將建立一個新的事務

PROPAGATION_REQUIRES_NEW

表示當前方法必須執行在自己的事務中,如果當前存在一個事務,那麼這個事務將在該方法執行期間被掛起

PROPAGATION_SUPPORTS

表示當前方法不需要執行在一個是事務中,但如果有一個事務已經存在,該方法也可以執行在這個事務中

b)隔離級別

在操作資料時可能帶來 3 個副作用,分別是髒讀、不可重複讀、幻讀。為了避免這 3 中副作用的發生,在標準的 SQL 語句中定義了 4 種隔離級別,分別是未提交讀、已提交讀、可重複讀、可序列化。而在 spring 事務中提供了 5 種隔離級別來對應在SQL 中定義的 4 種隔離級別,如下:

隔離級別

意義

ISOLATION_DEFAULT

使用後端資料庫預設的隔離級別

ISOLATION_READ_UNCOMMITTED

允許讀取未提交的資料(對應未提交讀),可能導致髒讀、不可重複讀、幻讀

ISOLATION_READ_COMMITTED

允許在一個事務中讀取另一個已經提交的事務中的資料(對應已提交讀)。可以避免髒讀,但是無法避免不可重複讀和幻讀

ISOLATION_REPEATABLE_READ

一個事務不可能更新由另一個事務修改但尚未提交(回滾)的資料(對應可重複讀)。可以避免髒讀和不可重複讀,但無法避免幻讀

ISOLATION_SERIALIZABLE

這種隔離級別是所有的事務都在一個執行佇列中,依次順序執行,而不是並行(對應可序列化)。可以避免髒讀、不可重複讀、幻讀。但是這種隔離級別效率很低,因此,除非必須,否則不建議使用。

c)只讀

如果在一個事務中所有關於資料庫的操作都是隻讀的,也就是說,這些操作只讀取資料庫中的資料,而並不更新資料,那麼應將事務設為只讀模式( READ_ONLY_MARKER ) , 這樣更有利於資料庫進行優化 。

因為只讀的優化措施是事務啟動後由資料庫實施的,因此,只有將那些具有可能啟動新事務的傳播行為(PROPAGATION_NESTED 、 PROPAGATION_REQUIRED 、 PROPAGATION_REQUIRED_NEW) 的方法的事務標記成只讀才有意義。

如果使用 Hibernate 作為持久化機制,那麼將事務標記為只讀後,會將 Hibernate 的 flush 模式設定為FULSH_NEVER, 以告訴 Hibernate 避免和資料庫之間進行不必要的同步,並將所有更新延遲到事務結束。

d)事務超時

如果一個事務長時間執行,這時為了儘量避免浪費系統資源,應為這個事務設定一個有效時間,使其等待數秒後自動回滾。與設

置“只讀”屬性一樣,事務有效屬性也需要給那些具有可能啟動新事物的傳播行為的方法的事務標記成只讀才有意義。


下面有關servlet和cgi的描述,說法錯誤的是?
正確答案: D   你的答案: D (正確)
servlet處於伺服器程序中,它通過多執行緒方式執行其service方法
CGI對每個請求都產生新的程序,服務完成後就銷燬
servlet在易用性上強於cgi,它提供了大量的實用工具例程,例如自動地解析和解碼HTML表單資料、讀取和設定HTTP頭、處理Cookie、跟蹤會話狀態等
cgi在移植性上高於servlet,幾乎所有的主流伺服器都直接或通過外掛支援cgi

選擇D,servlet處於伺服器程序中,它通過多執行緒方式執行其service方法,一個例項可以服務於多個請求,並且其例項一般不會銷燬,而CGI對每個請求都產生新的程序,服務完成後就銷燬,所以效率上低於servlet。

下面有關servlet service描述錯誤的是?
正確答案: B   你的答案: B (正確)
不管是post還是get方法提交過來的連線,都會在service中處理
doGet/doPost 則是在 javax.servlet.GenericServlet 中實現的
service()是在javax.servlet.Servlet介面中定義的
service判斷請求型別,決定是呼叫doGet還是doPost方法

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

下列有關Servlet的生命週期,說法不正確的是?
正確答案: A   你的答案: A (正確)
在建立自己的Servlet時候,應該在初始化方法init()方法中建立Servlet例項
在Servlet生命週期的服務階段,執行service()方法,根據使用者請求的方法,執行相應的doGet()或是doPost()方法
在銷燬階段,執行destroy()方法後會釋放Servlet 佔用的資源

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

建立Servlet的例項是由Servlet容器來完成的,且建立Servlet例項是在初始化方法init()之前

Servlet的生命週期分為5個階段:載入、建立、初始化、處理客戶請求、解除安裝。
(1)載入:容器通過類載入器使用servlet類對應的檔案載入servlet
(2)建立:通過呼叫servlet建構函式建立一個servlet物件
(3)初始化:呼叫init方法初始化
(4)處理客戶請求:每當有一個客戶請求,容器會建立一個執行緒來處理客戶請求

(5)解除安裝:呼叫destroy方法讓servlet自己釋放其佔用的資源

下面有關servlet中init,service,destroy方法描述錯誤的是?
正確答案: D   你的答案: D (正確)
init()方法是servlet生命的起點。一旦載入了某個servlet,伺服器將立即呼叫它的init()方法
service()方法處理客戶機發出的所有請求
destroy()方法標誌servlet生命週期的結束

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

servlet在多執行緒下其本身並不是執行緒安全的。

如果在類中定義成員變數,而在service中根據不同的執行緒對該成員變數進行更改,那麼在併發的時候就會引起錯誤。最好是在方法中,定義區域性變數,而不是類變數或者物件的成員變數。由於方法中的區域性變數是在棧中,彼此各自都擁有獨立的執行空間而不會互相干擾,因此才做到執行緒安全。

下面有關struts1和struts2的區別,描述錯誤的是?
正確答案: B   你的答案: 空 (錯誤)
Struts1要求Action類繼承一個抽象基類。Struts 2 Action類可以實現一個Action介面
Struts1 Action物件為每一個請求產生一個例項。Struts2 Action是單例模式並且必須是執行緒安全的
Struts1 Action 依賴於Servlet API,Struts 2 Action不依賴於容器,允許Action脫離容器單獨被測試

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容器給每個請求產生許多可丟棄的物件,並且不會導致效能和垃圾回收問題)

關於AWT和Swing說法正確的是?
正確答案: D   你的答案: 空 (錯誤)
Swing是AWT的子類
AWT在不同作業系統中顯示相同的風格
AWT不支援事件型別,Swing支援事件模型

Swing在不同的作業系統中顯示相同的風格

AWT :是通過呼叫作業系統的native方法實現的,所以在Windows系統上的AWT視窗就是Windows的風格,而在Unix系統上的則是XWindow風格。 AWT 中的圖形函式與 作業系統 所提供的圖形函式之間有著一一對應的關係,我們把它稱為peers。 也就是說,當我們利用 AWT 來構件圖形使用者介面的時候,我們實際上是在利用 作業系統 所提供的圖形庫。由於不同 作業系統 的圖形庫所提供的功能是不一樣的,在一個平臺上存在的功能在另外一個平臺上則可能不存在。為了實現Java語言所宣稱的"一次編譯,到處執行"的概念,AWT 不得不通過犧牲功能來實現其平臺無關性,也就是說,AWT 所提供的圖形功能是各種通用型作業系統所提供的圖形功能的交集。由於AWT 是依靠本地方法來實現其功能的,我們通常把AWT控制元件稱為重量級控制元件。
Swing :是所謂的Lightweight元件,不是通過native方法來實現的,所以Swing的視窗風格更多樣化。但是,Swing裡面也有heaveyweight元件。比如JWindow,Dialog,JFrame
Swing是所謂的Lightweight元件,不是通過native方法來實現的,所以Swing的視窗風格更多樣化。但是,Swing裡面也有heaveyweight元件。比如JWindow,Dialog,JFrame

Swing由純Java寫成,可移植性好,外觀在不同平臺上相同。所以Swing部件稱為輕量級元件( Swing是由純JAVA CODE所寫的,因此SWING解決了JAVA因視窗類而無法跨平臺的問題,使視窗功能也具有跨平臺與延展性的特性,而且SWING不需佔有太多系統資源,因此稱為輕量級元件!!!)

看以下程式碼: 
檔名稱:forward.jsp 
<html>  
     <head><title> 跳轉  </title> </head> 
     <body>  
         <jsp:forward page="index.htm"/>     
     </body>
 </html> 
如果執行以上jsp檔案,位址列的內容為

正確答案: A   你的答案: A (正確)
http://127.0.0.1:8080/myjsp/forward.jsp
http://127.0.0.1:8080/myjsp/index.jsp
http://127.0.0.1:8080/myjsp/index.htm

http://127.0.0.1:8080/myjsp/forward.htm

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

因此這個題是A

下面哪一項不是載入驅動程式的方法?
正確答案: A   你的答案: B (錯誤)
通過DriverManager.getConnection方法載入
呼叫方法 Class.forName
通過新增系統的jdbc.drivers屬性

通過registerDriver方法註冊

DriverManager.getConnection方法返回一個Connection物件,這是載入驅動之後才能進行的

關於sleep()和wait(),以下描述錯誤的一項是( )
正確答案: D   你的答案: D (正確)
sleep是執行緒類(Thread)的方法,wait是Object類的方法;
sleep不釋放物件鎖,wait放棄物件鎖
sleep暫停執行緒、但監控狀態仍然保持,結束後會自動恢復
wait後進入等待鎖定池,只有針對此物件發出notify方法後獲得物件鎖進入執行狀態

D錯是因為進入的是就緒狀態而不是執行狀態

根據下面的程式程式碼,哪些選項的值返回true?
public class Square {  
    long width;  
    public Square(long l) {   
        width = l;  
    }  
    public static void main(String arg[]) {   
        Square a, b, c;  
        a = new Square(42L);   
        b = new Square(42L);   
        c = b;   
        long s = 42L;  
    } 
}


正確答案: C   你的答案: C (正確)
a == b
s == a
b == c
a.equals(s)


在jdk1.5的環境下,有如下4條語句:
Integer i01 = 59;
int i02 = 59;
Integer i03 =Integer.valueOf(59);
Integer i04 = new Integer(59)。
以下輸出結果為false的是:

正確答案: C   你的答案: C (正確)
System.out.println(i01== i02);
System.out.println(i01== i03);
System.out.println(i03== i04);
System.out.println(i02== i04);

C選項i03和i04是兩個不同的物件,返回false

D選項i02是基本資料型別,比較的時候比較的是數值,返回true

下面哪個不對?
正確答案: C   你的答案: B (錯誤)
RuntimeException is the superclass of those exceptions that can be thrown during the normal operation of the Java Virtual Machine.
A method is not required to declare in its throws clause any subclasses of RuntimeExeption that might be thrown during the execution of the method but not caught
An RuntimeException is a subclass of Throwable that indicates serious problems that a reasonable application should not try to catch.

NullPointerException is one kind of RuntimeException

Error是 indicates serious problems


執行時異常: 都是RuntimeException類及其子類異常,如NullPointerException(空指標異常)、IndexOutOfBoundsException(下標越界異常)等,這些異常是不檢查異常,程式中可以選擇捕獲處理,也可以不處理。這些異常一般是由程式邏輯錯誤引起的,程式應該從邏輯角度儘可能避免這類異常的發生。

      執行時異常的特點是Java編譯器不會檢查它,也就是說,當程式中可能出現這類異常,即使沒有用try-catch語句捕獲它,也沒有用throws子句宣告丟擲它,也會編譯通過。 
非執行時異常 (編譯異常): 是RuntimeException以外的異常,型別上都屬於Exception類及其子類。從程式語法角度講是必須進行處理的異常,如果不處理,程式就不能編譯通過。如IOException、SQLException等以及使用者自定義的Exception異常,一般情況下不自定義檢查異常

關於以下程式程式碼的說明正確的是?
1.   public class HasStatic{
2.     private static int x=100;
3.     public static void main(String args[]){
4.          HasStatic hs1=new HasStatic();
5.          hs1.x++;
6.          HasStatic  hs2=new HasStatic();
7.          hs2.x++;
8.          hs1=new HasStatic();
9.          hs1.x++;
10.        HasStatic.x--;
11.        System.out.println("x="+x);
12.     }
13.   } 
正確答案: D   你的答案: D (正確)
程式通過編譯,輸出結果為:x=103
10行不能通過編譯,因為x是私有靜態變數
5行不能通過編譯,因為引用了私有靜態變數

程式通過編譯,輸出結果為:x=102

關於struts專案中的類與MVC模式的對應關係,說法錯誤的是
正確答案: C D   你的答案: D (錯誤)
Jsp檔案實現檢視View的功能
ActionServlet這一個類是整個struts專案的控制器
ActionForm、Action都屬於Model部分

一個struts專案只能有一個Servlet


下面有關jsp中靜態include和動態include的區別,說法錯誤的是?  
正確答案: D   你的答案: D (正確)
動態INCLUDE:用jsp:include動作實現 
靜態INCLUDE:用include偽碼實現,定不會檢查所含檔案的變化,適用於包含靜態頁面<%@ include file="included.htm" %>
靜態include的結果是把其他jsp引入當前jsp,兩者合為一體;動態include的結構是兩者獨立,直到輸出時才合併

靜態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 所生成的應答文字 .

給定以下JAVA程式碼,這段程式碼執行後輸出的結果是()
public class Test
{
    public static int aMethod(int i)throws Exception
    {
        try{
            return i / 10;
        }
        catch (Exception ex)
        {
            throw new Exception("exception in a Method");
        } finally{
            System.out.printf("finally");
        }
    }

    public static void main(String [] args)
    {
        try
        {
            aMethod(0);
        }
        catch (Exception ex)
        {
            System.out.printf("exception in main");
        }
        System.out.printf("finished");
    }
}




正確答案: B   你的答案: B (正確)
exception in main finished
finally finished
exception in main finally

finally exception in main finished

對於JVM記憶體配置引數:
-Xmx10240m -Xms10240m -Xmn5120m -XXSurvivorRatio=3
,其最小記憶體值和Survivor區總大小分別是()

正確答案: D   你的答案: C (錯誤)
5120m,1024m
5120m,2048m
10240m,1024m

10240m,2048m

-Xmx:最大堆大小
-Xms:初始堆大小
-Xmn:年輕代大小
-XXSurvivorRatio:年輕代中Eden區與Survivor區的大小比值
年輕代5120m, Eden:Survivor=3,Survivor區大小=1024m(Survivor區有兩個,即將年輕代分為5份,每個Survivor區佔一份),總大小為2048m。

-Xms初始堆大小即最小記憶體值為10240m