牛客網Java評估題

yhj_yzx_yzx發表於2020-12-04

牛客網 Java 工程師能力評估 題


轉載原文地址:檢視原文


免責宣告:本部落格為學習筆記,如有侵權請聯絡刪除



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

  • 程式計數器是一個比較小的記憶體區域,用於指示當前執行緒所執行的位元組碼執行到了第幾行,是執行緒隔離的
  • 虛擬機器棧描述的是 Java 方法執行的記憶體模型,用於儲存區域性變數,運算元棧,動態連結,方法出口等資訊,是執行緒隔離的
  • 方法區用於儲存 JVM 載入的類資訊、常量、靜態變數、以及編譯器編譯後的程式碼等資料,是執行緒隔離的
  • 原則上講,所有的物件都在堆區上分配記憶體,是執行緒之間共享的

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

  • JDBC提供了 Statement、PreparedStatement 和 CallableStatement 三種方式來執行查詢語句,其中 Statement 用於通用查詢,PreparedStatement 用於執行引數化查詢,而 CallableStatement 則是用於儲存過程
  • 對於 PreparedStatement 來說,資料庫可以使用已經編譯過及定義好的執行計劃,由於 PreparedStatement 物件已預編譯過,所以其執行速度要快於 Statement 物件”
  • PreparedStatement 中,“?” 叫做佔位符,一個佔位符可以有一個或者多個值
  • PreparedStatement 可以阻止常見的 SQL 注入式攻擊

(3)下面有關 SPRING 的事務傳播特性,說法錯誤的是?

  • PROPAGATION_SUPPORTS:支援當前事務,如果當前沒有事務,就以非事務方式執行
  • PROPAGATION_REQUIRED:支援當前事務,如果當前沒有事務,就丟擲異常
  • PROPAGATION_REQUIRES_NEW:新建事務,如果當前存在事務,把當前事務掛起
  • PROPAGATION_NESTED:支援當前事務,新增 Savepoint 點,與當前事務同步提交或回滾

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

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

(5)下面有關 servlet service 描述錯誤的是?

  • 不管是 post 還是 get 方法提交過來的連線,都會在 service 中處理
  • doGet/doPost 則是在 javax.servlet.GenericServlet 中實現的
  • service() 是在 javax.servlet.Servlet 介面中定義的
  • service 判斷請求型別,決定是呼叫 doGet 還是 doPost 方法

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

  • 在建立自己的 Servlet 時候,應該在初始化方法 init() 方法中建立 Servlet 例項
  • 在 Servlet 生命週期的服務階段,執行 service() 方法,根據使用者請求的方法,執行相應的 doGet() 或是 doPost() 方法
  • 在銷燬階段,執行 destroy() 方法後會釋放 Servlet 佔用的資源
  • destroy() 方法僅執行一次,即在伺服器停止且解除安裝 Servlet 時執行該方法

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

  • init()方法是servlet生命的起點。一旦載入了某個servlet,伺服器將立即呼叫它的init()方法
  • service()方法處理客戶機發出的所有請求
  • destroy()方法標誌servlet生命週期的結束
  • servlet在多執行緒下使用了同步機制,因此,在併發程式設計下servlet是執行緒安全的

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

  • Struts1 要求 Action 類繼承一個抽象基類。Struts 2 Action 類可以實現一個Action介面
  • Struts1 Action物件為每一個請求產生一個例項。Struts2 Action 是單例模式並且必須是執行緒安全的
  • Struts1 Action 依賴於 Servlet API,Struts 2 Action 不依賴於容器,允許Action脫離容器單獨被測試
  • Struts1 整合了 JSTL,Struts2 可以使用 JSTL,但是也支援 OGNL

(9)關於 AWT 和 Swing 說法正確的是?

  • Swing 是 AWT 的子類
  • AWT 在不同作業系統中顯示相同的風格
  • AWT 不支援事件型別,Swing 支援事件模型
  • Swing 在不同的作業系統中顯示相同的風格

(10)看以下程式碼:

檔名稱:forward.jsp

<html>  
     <head><title> 跳轉  </title> </head> 
     <body>  
         <jsp:forward page="index.htm"/>     
     </body>
 </html> 

如果執行以上jsp檔案,位址列的內容為:

  • 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

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

  • 通過DriverManager.getConnection方法載入
  • 呼叫方法 Class.forName
  • 通過新增系統的jdbc.drivers屬性
  • 通過registerDriver方法註冊

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

  • sleep是執行緒類(Thread)的方法,wait是Object類的方法;
  • sleep不釋放物件鎖,wait放棄物件鎖
  • sleep暫停執行緒、但監控狀態仍然保持,結束後會自動恢復
  • wait後進入等待鎖定池,只有針對此物件發出notify方法後獲得物件鎖進入執行狀態

(13)根據下面的程式程式碼,哪些選項的值返回 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;  
    } 
}
  • a == b
  • s == a
  • b == c
  • a.equals(s)

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

Integer i01 = 59;
int i02 = 59;
Integer i03 =Integer.valueOf(59);
Integer i04 = new Integer(59);

以下輸出結果為false的是:

  • System.out.println(i01 == i02);
  • System.out.println(i01 == i03);
  • System.out.println(i03 == i04);
  • System.out.println(i02 == i04);

(15)下面哪個不對?

  • 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

(16)關於以下程式程式碼的說明正確的是?

public class HasStatic{
   private static int x=100;
   public static void main(String args[]){
       HasStatic hs1=new HasStatic();
       hs1.x++;
       HasStatic  hs2=new HasStatic();
       hs2.x++;
       hs1=new HasStatic();
       hs1.x++;
       HasStatic.x--;
       System.out.println("x="+x);
    }
} 
  • 程式通過編譯,輸出結果為:x=103
  • 10行不能通過編譯,因為x是私有靜態變數
  • 5行不能通過編譯,因為引用了私有靜態變數
  • 程式通過編譯,輸出結果為:x=102

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

  • Jsp 檔案實現檢視 View 的功能
  • ActionServlet 這一個類是整個 struts 專案的控制器
  • ActionForm、Action 都屬於 Model 部分
  • 一個 struts 專案只能有一個 Servlet

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

  • 動態 INCLUDE:用 jsp:include 動作實現
  • 靜態 INCLUDE:用 include 偽碼實現,定不會檢查所含檔案的變化,適用於包含靜態頁面 <%@ include file=“included.htm” %>
  • 靜態 include 的結果是把其他 jsp 引入當前 jsp,兩者合為一體;動態 include 的結構是兩者獨立,直到輸出時才合併
  • 靜態 include 和動態 include 都可以允許變數同名的衝突.頁面設定也可以借用主檔案的

(19)給定以下 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");
    }
}
  • exception in main finished
  • finally finished
  • exception in main finally
  • finally exception in main finished

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

  • 5120m,1024m
  • 5120m,2048m
  • 10240m,1024m
  • 10240m,2048m





牛客網 Java 工程師能力評估 20 題(題目 & 詳細解析)

選項從上到下為,A,B,C,D

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

  • 程式計數器是一個比較小的記憶體區域,用於指示當前執行緒所執行的位元組碼執行到了第幾行,是執行緒隔離的
  • 虛擬機器棧描述的是 Java 方法執行的記憶體模型,用於儲存區域性變數,運算元棧,動態連結,方法出口等資訊,是執行緒隔離的
  • 方法區用於儲存 JVM 載入的類資訊、常量、靜態變數、以及編譯器編譯後的程式碼等資料,是執行緒隔離的
  • 原則上講,所有的物件都在堆區上分配記憶體,是執行緒之間共享的

答案:C 、解析:
大多數 JVM 將記憶體區域劃分為:
Method Area(Non-Heap)(方法區) ,Heap(堆) , Program Counter Register(程式計數器) , VM Stack(虛擬機器棧,也有翻譯成 JAVA 方法棧的),Native Method Stack ( 本地方法棧 )

其中 Method AreaHeap執行緒共享的 *
*VM Stack,Native Method Stack 和 Program Counter Register*
非執行緒共享* 的。

為什麼分為 執行緒共享和非執行緒共享的呢?請繼續往下看。

首先我們熟悉一下一個一般性的 Java 程式的工作過程。一個 Java 源程式檔案,會被編譯為位元組碼檔案(以 class 為副檔名),每個 java 程式都需要執行在自己的 JVM 上,然後告知 JVM 程式的執行入口,再被 JVM 通過位元組碼直譯器載入執行。那麼程式開始執行後,都是如何涉及到各記憶體區域的呢?

概括地說來,JVM 初始執行的時候都會分配好 Method Area(方法區)Heap(堆) ,而 JVM 每遇到一個執行緒,就為其分配一個 Program Counter Register(程式計數器), VM Stack(虛擬機器棧)和Native Method Stack(本地方法棧), 當執行緒終止時,三者(虛擬機器棧,本地方法棧和程式計數器)所佔用的記憶體空間也會被釋放掉。這也是為什麼我把記憶體區域分為執行緒共享和非執行緒共享的原因,非執行緒共享的那三個區域的生命週期與所屬執行緒相同,而執行緒共享的區域與 JAVA 程式執行的生命週期相同,所以這也是系統垃圾回收的場所只發生線上程共享的區域(實際上對大部分虛擬機器來說知發生在 Heap上)的原因。


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

  • JDBC提供了 Statement、PreparedStatement 和 CallableStatement 三種方式來執行查詢語句,其中 Statement 用於通用查詢,PreparedStatement 用於執行引數化查詢,而 CallableStatement 則是用於儲存過程
  • 對於 PreparedStatement 來說,資料庫可以使用已經編譯過及定義好的執行計劃,由於 PreparedStatement 物件已預編譯過,所以其執行速度要快於 Statement 物件”
  • PreparedStatement 中,“?” 叫做佔位符,一個佔位符可以有一個或者多個值
  • PreparedStatement 可以阻止常見的 SQL 注入式攻擊

答案:C、解析:
JDBC statement 中的 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)的支援;
(5)
Statement 每次執行 sql 語句,資料庫都要執行 sql 語句的編譯 ,
最好用於僅執行一次查詢並返回結果的情形,效率高於PreparedStatement。

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


(3)下面有關 SPRING 的事務傳播特性,說法錯誤的是?

  • PROPAGATION_SUPPORTS:支援當前事務,如果當前沒有事務,就以非事務方式執行
  • PROPAGATION_REQUIRED:支援當前事務,如果當前沒有事務,就丟擲異常
  • PROPAGATION_REQUIRES_NEW:新建事務,如果當前存在事務,把當前事務掛起
  • PROPAGATION_NESTED:支援當前事務,新增 Savepoint 點,與當前事務同步提交或回滾

答案:B、解析:

PROPAGATION_SUPPORTS – 支援當前事務,如果當前沒有事務,就以非事務方式執行。

PROPAGATION_REQUIRED – 支援當前事務,如果當前沒有事務,就新建一個事務。這是最常見的選擇。

PROPAGATION_MANDATORY – 支援當前事務,如果當前沒有事務,就丟擲異常。

PROPAGATION_REQUIRES_NEW – 新建事務,如果當前存在事務,把當前事務掛起。

PROPAGATION_NOT_SUPPORTED – 以非事務方式執行操作,如果當前存在事務,就把當前事務掛起。

PROPAGATION_NEVER – 以非事務方式執行,如果當前存在事務,則丟擲異常。

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

  • (1)傳播行為定義了被呼叫方法的事務邊界。
傳播行為意義
PROPERGATION_MANDATORY表示方法必須執行在一個事務中,如果當前事務不存在,就丟擲異常
PROPAGATION_NESTED表示如果當前事務存在,則方法應該執行在一個巢狀事務中。否則,它看起來和 PROPAGATION_REQUIRED 看起來沒什麼倆樣
PROPAGATION_NEVER表示方法不能執行在一個事務中,否則丟擲異常
PROPAGATION_NOT_SUPPORTED表示方法不能執行在一個事務中,如果當前存在一個事務,則該方法將被掛起
PROPAGATION_REQUIRED表示當前方法必須執行在一個事務中,如果當前存在一個事務,那麼該方法執行在這個事務中,否則,將建立一個新的事務
PROPAGATION_REQUIRES_NEW表示當前方法必須執行在自己的事務中,如果當前存在一個事務,那麼這個事務將在該方法執行期間被掛起
PROPAGATION_SUPPORTS表示當前方法不需要執行在一個是事務中,但如果有一個事務已經存在,該方法也可以執行在這個事務中

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

隔離級別意義
ISOLATION_DEFAULT使用後端資料庫預設的隔離級別
ISOLATION_READ_UNCOMMITTED允許讀取未提交的資料(對應未提交讀),可能導致髒讀、不可重複讀、幻讀
ISOLATION_READ_COMMITTED允許在一個事務中讀取另一個已經提交的事務中的資料(對應已提交讀)。可以避免髒讀,但是無法避免不可重複讀和幻讀
ISOLATION_REPEATABLE_READ一個事務不可能更新由另一個事務修改但尚未提交(回滾)的資料(對應可重複讀)。可以避免髒讀和不可重複讀,但無法避免幻讀
ISOLATION_SERIALIZABLE這種隔離級別是所有的事務都在一個執行佇列中,依次順序執行,而不是並行(對應可序列化)。可以避免髒讀、不可重複讀、幻讀。但是這種隔離級別效率很低,因此,除非必須,否則不建議使用。
  • (3)只讀

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

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

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

  • (4)事務超時

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

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


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

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

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

擴充套件:
Servlet 與 CGI 的比較

和 CGI 程式一樣,Servlet 可以響應使用者的指令(提交一個 FORM 等等),也可以象 CGI 程式一樣,收集使用者表單的資訊並給予動態反饋(簡單的註冊資訊錄入和檢查錯誤)。
然而,Servlet 的機制並不僅僅是這樣簡單的與使用者表單進行互動。傳統技術中,動態的網頁建立和顯示都是通過 CGI 來實現的,但是,有了Servlet,您可以大膽的放棄所有 CGI(perl?php?甚至asp!),利用Servlet代替CGI,進行程式編寫。
對比一:當使用者瀏覽器發出一個 Http/CGI 的請求,或者說 呼叫一個 CGI程式的時候,伺服器端就要新啟用一個程式 (而且是每次都要呼叫),呼叫 CGI 程式越多(特別是訪問量高的時候),就要消耗系統越多的處理時間,只剩下越來越少的系統資源,對於使用者來說,只能是漫長的等待伺服器端的返回頁面了,這對於電子商務激烈發展的今天來說,不能不說是一種技術上的遺憾。
而 Servlet 充分發揮了伺服器端的資源並高效的利用。每次呼叫Servlet時並不是新啟用一個程式 ,而是在一個 Web 伺服器的程式敏感詞享和分離執行緒,而執行緒最大的好處在於可以共享一個資料來源,使系統資源被有效利用。
對比二:傳統的 CGI 程式,不具備平臺無關性特徵,系統環境發生變化,CGI 程式就要癱瘓,而 Servlet 具備 Java 的平臺無關性,在系統開發過程中保持了系統的可擴充套件性、高效性。
對比三:傳統技術中,一般大都為二層的系統架構,即 Web 伺服器+資料庫伺服器,導致網站訪問量大的時候,無法克服 CGI 程式與資料庫建立連線時速度慢的瓶頸,從而當機、資料庫死鎖現象頻繁發生。而我們的 Servlet 有連線池的概念,它可以利用多執行緒的優點,在系統快取中事先建立好若干與資料庫的連線,到時候若想和資料庫打交道可以隨時跟系統"要"一個連線即可,反應速度可想而知。


(5)下面有關 servlet service 描述錯誤的是?

  • 不管是 post 還是 get 方法提交過來的連線,都會在 service 中處理
  • doGet/doPost 則是在 javax.servlet.GenericServlet 中實現的
  • service() 是在 javax.servlet.Servlet 介面中定義的
  • service 判斷請求型別,決定是呼叫 doGet 還是 doPost 方法

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

而 GenericServlet 抽象類 給出了設計 servlet 的一些骨架,定義了 servlet 生命週期,還有一些得到名字、配置、初始化引數的方法,其設計的是和應用層協議無關的


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

  • 在建立自己的 Servlet 時候,應該在初始化方法 init() 方法中建立 Servlet 例項
  • 在 Servlet 生命週期的服務階段,執行 service() 方法,根據使用者請求的方法,執行相應的 doGet() 或是 doPost() 方法
  • 在銷燬階段,執行 destroy() 方法後會釋放 Servlet 佔用的資源
  • destroy() 方法僅執行一次,即在伺服器停止且解除安裝 Servlet 時執行該方法

答案:A、解析:
建立 Servlet 的例項是由 Servlet 容器來完成的,且建立 Servlet 例項是在初始化方法 init() 之前

Servlet 的生命週期:
Servlet 的生命週期分為5個階段:載入、建立、初始化、處理客戶請求、解除安裝。

  • (1)載入:容器通過類載入器使用servlet類對應的檔案載入servlet
  • (2)建立:通過呼叫servlet建構函式建立一個servlet物件
  • (3)初始化:呼叫init方法初始化
  • (4)處理客戶請求:每當有一個客戶請求,容器會建立一個執行緒來處理客戶請求
  • (5)解除安裝:呼叫destroy方法讓servlet自己釋放其佔用的資源

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

  • init()方法是servlet生命的起點。一旦載入了某個servlet,伺服器將立即呼叫它的init()方法
  • service()方法處理客戶機發出的所有請求
  • destroy()方法標誌servlet生命週期的結束
  • servlet在多執行緒下使用了同步機制,因此,在併發程式設計下servlet是執行緒安全的

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


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

  • Struts1 要求 Action 類繼承一個抽象基類。Struts 2 Action 類可以實現一個Action介面
  • Struts1 Action物件為每一個請求產生一個例項。Struts2 Action 是單例模式並且必須是執行緒安全的
  • Struts1 Action 依賴於 Servlet API,Struts 2 Action 不依賴於容器,允許Action脫離容器單獨被測試
  • Struts1 整合了 JSTL,Struts2 可以使用 JSTL,但是也支援 OGNL

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


(9)關於 AWT 和 Swing 說法正確的是?

  • Swing 是AWT的子類
  • AWT 在不同作業系統中顯示相同的風格
  • AWT 不支援事件型別,Swing 支援事件模型
  • Swing 在不同的作業系統中顯示相同的風格

答案:D、解析:
AWT,抽象視窗工具包,是 Java 提供的建立圖形使用者介面的工具集,可用於生成現代的、滑鼠控制的圖形應用介面,且無需修改,就可以在各種軟硬體平臺上執行。

而 swing 是 Java 語言在編寫圖形使用者介面方面的新技術,Swing 採用模型-檢視-控制設計正規化,Swing 可以使 Java 程式在同一個平臺上執行時能夠有不同外觀以供使用者選擇。

兩者不同在於一個是初代工具集,一個是進化版的工具集,使用者不會再滿足於初始的功能,而是更加註重於附加價值,明顯從這點上,Swing 是比 AWT 要好很多。
寫法上,Swing 的標頭檔案引用包需要用到 Javax,元件呼叫時也需要在 AWT 的基礎上加上 “J”。


(10)看以下程式碼:

檔名稱:forward.jsp

<html>  
     <head><title> 跳轉  </title> </head> 
     <body>  
         <jsp:forward page="index.htm"/>     
     </body>
 </html> 

如果執行以上jsp檔案,位址列的內容為:

  • 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

答案:A、解析:
redirect:請求重定向:客戶端行為,本質上為2次請求,位址列改變,前一次請求物件消失。舉例:你去銀行辦事(forward.jsp),結果告訴你少帶了東西,你得先去公安局辦(index.html)臨時身份證,這時你就會走出銀行,自己前往公安局,位址列變為index.html.

forward:請求轉發:伺服器行為,位址列不變。舉例:你把錢包落在計程車上,你去警察局(forward.jsp)報案,警察局說錢包落在某某公司的計程車上(index.html),這時你不用親自去找某某公司的計程車,警察局讓計程車自己給你送來,你只要在警察局等就行。所以位址列不變,依然為forward.jsp


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

  • 通過 DriverManager.getConnection 方法載入
  • 呼叫方法 Class.forName
  • 通過新增系統的 jdbc.drivers 屬性
  • 通過 registerDriver 方法註冊

答案:A、解析:
載入驅動方法:
1.Class.forName(“com.microsoft.sqlserver.jdbc.SQLServerDriver”);
2.DriverManager.registerDriver(new com.mysql.jdbc.Driver());
3.System.setProperty(“jdbc.drivers”, “com.mysql.jdbc.Driver”);


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

  • sleep是執行緒類(Thread)的方法,wait是Object類的方法;
  • sleep不釋放物件鎖,wait放棄物件鎖
  • sleep暫停執行緒、但監控狀態仍然保持,結束後會自動恢復
  • wait後進入等待鎖定池,只有針對此物件發出notify方法後獲得物件鎖進入執行狀態

答案:D、解析:
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,notify 和 notifyAll 不需要捕獲異常
4.sleep 是執行緒類(Thread)的方法,導致此執行緒暫停執行指定時間,給執行機會給其他執行緒,但是監控狀態依然保持,到時後會自動恢復。呼叫 sleep 不會釋放物件鎖。
5.wait 是 Object 類的方法,對此物件呼叫 wait 方法導致本執行緒放棄物件鎖,進入等待此物件的等待鎖定池,只有針對此物件發出 notify 方法(或notifyAll)後本執行緒才進入物件鎖定池準備獲得物件鎖進入執行狀態。


(13)根據下面的程式程式碼,哪些選項的值返回 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;  
    } 
}
  • a == b
  • s == a
  • b == c
  • a.equals(s)

答案:C、解析:

a = new Square(42L);   
 b = new Square(42L);  

這裡 new 了兩個物件,所以 a,b 不是同一個引用 a!=b
s 的型別跟 a,b 不同型別,所以 s!=a,s!=b

 c = b;
1

這裡 b,c 是同一個物件的引用,所以 b==c 是 true


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

Integer i01 = 59;
int i02 = 59;
Integer i03 =Integer.valueOf(59);
Integer i04 = new Integer(59);

以下輸出結果為false的是:

  • System.out.println(i01 == i02);
  • System.out.println(i01 == i03);
  • System.out.println(i03 == i04);
  • System.out.println(i02 == i04);

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


(15)下面哪個不對?

  • 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

答案:C、解析:
四個選項都來自於Java API原文

A選項是RuntimeException的定義;
B選項是把Error的第二段定義拿來改掉換成RuntimeException,但這樣說對於RuntimeException也沒錯;
C選項也是把Error的定義換成了RuntimeException,但這裡的"indicates serious problems"不應該用在RuntimeException上,Error才表示嚴重的錯誤,RuntimeException並不是.
D選項顯然.

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

執行時異常的特點是Java編譯器不會檢查它,也就是說,當程式中可能出現這類異常,即使沒有用try-catch語句捕獲它,也沒有用throws子句宣告丟擲它,也會編譯通過。

非執行時異常 (編譯異常): 是 RuntimeException 以外的異常,型別上都屬於 Exception 類及其子類。從程式語法角度講是必須進行處理的異常,如果不處理,程式就不能編譯通過。如 IOException、SQLException 等以及使用者自定義的 Exception 異常,一般情況下不自定義檢查異常。


(16)關於以下程式程式碼的說明正確的是?

public class HasStatic{
   private static int x=100;
   public static void main(String args[]){
       HasStatic hs1=new HasStatic();
       hs1.x++;
       HasStatic  hs2=new HasStatic();
       hs2.x++;
       hs1=new HasStatic();
       hs1.x++;
       HasStatic.x--;
       System.out.println("x="+x);
    }
} 

  • 程式通過編譯,輸出結果為:x=103
  • 10行不能通過編譯,因為x是私有靜態變數
  • 5行不能通過編譯,因為引用了私有靜態變數
  • 程式通過編譯,輸出結果為:x=102

答案:D、解析:
main 是 HasStatic 的靜態方法,在其內部可直接訪問靜態變數,不存在因為私有變數不能通過編譯的問題;如果在其他類中,包括 HasStatic 的派生類中,均不能訪問其私有靜態變數


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

  • Jsp 檔案實現檢視 View 的功能
  • ActionServlet 這一個類是整個 struts 專案的控制器
  • ActionForm、Action 都屬於 Model 部分
  • 一個 struts 專案只能有一個 Servlet

答案:C、D 解析:
img


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

  • 動態 INCLUDE:用 jsp:include 動作實現
  • 靜態 INCLUDE:用 include 偽碼實現,定不會檢查所含檔案的變化,適用於包含靜態頁面 <%@ include file=“included.htm” %>
  • 靜態 include 的結果是把其他 jsp 引入當前 jsp,兩者合為一體;動態 include 的結構是兩者獨立,直到輸出時才合併
  • 靜態 include 和動態 include 都可以允許變數同名的衝突.頁面設定也可以借用主檔案的

答案:D、解析:
動態 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 所生成的應答文字 .


(19)給定以下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");
    }
}

  • exception in main finished
  • finally finished
  • exception in main finally
  • finally exception in main finished

答案:B、解析:
i / 10;無論 i 是多少,永遠不會丟擲異常,所以 catch 語句不會執行。
而 finally 語句是必定執行的語句。
所以先指向 aMathod() 的 finally 程式碼塊,輸出 finally
然後執行 main() 方法的最後一條輸出語句,輸出 finished


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

  • 5120m,1024m
  • 5120m,2048m
  • 10240m,1024m
  • 10240m,2048m

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

原文地址:檢視原文

更多文章連結

相關文章