1. 程式人生 > >java面試問題總結參考

java面試問題總結參考

Struts1與 Struts2的區別,它們常用到哪幾個類, 以及工作流程? Struts1:ActionServlet[process()],RequestProcessor[processPreprocess()],PlugIn, Action,ActionForm,ActionForward,ActionMapping,struts-config.xml 

Struts2:FilterDispatcher,ActionSupport,ServletActionContext[getResponse()], ModelDriven[getModel()],MethodFilterInterceptor struts.xml,它是在 WebWork基礎上發展起來的. 

Struts 工作流程: 

struts1: 

釋出 StrutsWeb服務時,根據web.xml 初始化ActionServlet,ActionContext 等內容. 在接到一個HttpRequest請求後,ActionServlet 根據struts-config.xml 中的配置內容,將請求的參 數傳到對應的 Formbean 中,並設定 session.然後根據請求中的 Action 引數,在 struts-config.xml 中查詢指定的Action,並呼叫此Action來處理請求.根據Action的處理結果,會返回一個forward 變數,此時通過mapping.findForward()查找出對應的 forward所標示的Action 或者 JSP 頁面,將 請求轉到下一個處理.如果是forward 指向 JSP 頁面,則輸出到前臺. 

Struts2: (1)客戶端提交一個HttpServletRequest 請求(.action 或 JSP 頁面) (2)請求被提交到一系列Filter 過濾器,如ActionCleanUp 和 FilterDispatcher 等 (3)FilterDispatcher 是 Struts2控制器的核心,它通常是過濾器鏈中的最後一個過濾器 (4)請求發到 FilterDispatcher 後,FilterDispatcher 詢問 ActionMapper 是否需要呼叫某個 Action 來處理這個 Request(一般根據URL 字尾是否為.action 來判斷) (5)如果ActionMapper決定需要呼叫某個Action,FilterDispatcher則把請求交到ActioProxy,由其 進行處理. (6)ActionProxy通過Configuration Manager(它會訪問struts.xml)詢問框架的配置檔案,找到需要 呼叫的Action 類. (7)ActionProxy 建立一個 ActionInvocation 例項,而 ActionInvocation 通過代理模式呼叫 Action,(在呼叫之前會根據配置檔案載入相關的所有Interceptor 攔截器) (8)Action 執行完畢後,返回一個result 字串,此時再按相反的順序通過Interceptor 攔截器. (9) 最後ActionInvocation 負責根據struts.xml 中配置的result 元素,找到與返回值對應的result, 決定進行下一步輸出.

?Struts1和 Struts2的區別和對比: 

Action 類: ?Struts1要求 Action 類繼承一個抽象基類。Struts1的一個普遍問題是使用抽象類程式設計而不是接 口。 ?Struts 2Action 類可以實現一個Action 介面,也可實現其他介面,使可選和定製的服務成為 可能。Struts2提供一個ActionSupport 基類去 實現 常用的介面。Action 介面不是必須的,任 何有 execute 標識的POJO 物件都可以用作Struts2的 Action 物件。 執行緒模式: ?Struts1Action 是單例模式並且必須是執行緒安全的,因為僅有Action 的一個例項來處理所有 的請求。單例策略限制了Struts1Action 能作的事,並且要在開發時特別小心。Action 資源必 須是執行緒安全的或同步的。 ?Struts2Action 物件為每一個請求產生一個例項,因此沒有執行緒安全問題。(實際上,servlet

容器給每個請求產生許多可丟棄的物件,並且不會導致效能和垃圾回收問題) Servlet 依賴: ? Struts1 Action 依賴於 Servlet API ,因為當一個 Action 被呼叫時 HttpServletRequest 和 HttpServletResponse 被傳遞給execute 方法。 ?Struts 2Action 不依賴於容器,允許Action 脫離容器單獨被測試。如果需要,Struts2Action 仍然可以訪問初始的 request 和 response。但是,其他的元素減少或者消除了直接訪問 HttpServetRequest 和 HttpServletResponse 的必要性。 可測性: ? 測試 Struts1Action 的一個主要問題是execute 方法暴露了 servletAPI(這使得測試要依賴於 容器)。一個第三方擴充套件--StrutsTestCase--提供了一套 Struts1的模擬物件(來進行測試)。 ?Struts 2Action 可以通過初始化、設定屬性、呼叫方法來測試,“依賴注入”支援也使測試更 容易。 捕獲輸入: ?Struts1 使用 ActionForm 物件捕獲輸入。所有的ActionForm 必須繼承一個基類。因為其他 JavaBean 不能用作ActionForm,開發者經 常建立多餘的類捕獲輸入。動態Bean(DynaBeans) 可以作為建立傳統 ActionForm 的選擇,但是,開發者可能是在重新描述(建立)已經存 在的 JavaBean(仍然會導致有冗餘的javabean)。 ?Struts 2直接使用Action 屬性作為輸入屬性,消除了對第二個輸入物件的需求。輸入屬性可 能是有自己(子)屬性的rich 物件型別。Action 屬效能夠通過 web 頁面上的taglibs 訪問。Struts2 也支援 ActionForm 模式。rich 物件型別,包括業務物件,能夠用作輸入/輸出物件。這種 ModelDriven 特性簡化了 taglib 對 POJO 輸入物件的引用。 表示式語言: ?Struts1 整合了 JSTL,因此使用 JSTL EL。這種EL 有基本物件圖遍歷,但是對集合和索引 屬性的支援很弱。 ? Struts2可以使用 JSTL,但是也支援一個更強大和靈活的表示式語言--"Object Graph NotationLanguage" (OGNL). 繫結值到頁面(view): ?Struts 1使用標準 JSP 機制把物件繫結 到頁面中來訪問。 ?Struts 2 使用 "ValueStack"技術,使 taglib 能夠訪問值而不需要把你的頁面(view)和物件 繫結起來。ValueStack 策略允許通過一系列名稱相同但型別不同的屬性重用頁面(view)。 型別轉換: ?Struts 1ActionForm 屬性通常都是 String 型別。Struts1使用 Commons-Beanutils 進行型別轉 換。每個類一個轉換器,對每一個例項來說是不可配置的。 ?Struts2 使用 OGNL進行型別轉換。提供基本和常用物件的轉換器。 校驗: ?Struts 1支援在 ActionForm 的 validate 方法中手動校驗,或者通過Commons Validator 的擴充套件 來校驗。同一個類可以有不同的校驗內容,但不能校驗子物件。 ?Struts2支援通過 validate 方法和 XWork 校驗框架來進行校驗。XWork 校驗框架使用為屬性 類型別定義的校驗和內容校驗,來支援chain 校驗子屬性 Action 執行的控制: ?Struts1支援每一個模組有單獨的Request Processors(生命週期),但是模組中的所有Action 必須共享相同的生命週期。 ?Struts2支援通過攔截器堆疊(Interceptor Stacks)為每一個 Action 建立不同的生命週期。堆 棧能夠根據需要和不同的Action 一起使用。

Servlet,Filter 和 Listener 實現的介面. Servlet 繼承HttpServlet 類 Filter 實現 Filter 介面 Listener 實現HttpSessionListener,HttpSessionAttributeListener 介面

 -----------------------------------------------------------------------------------

Java 面試中,最常被人問到的幾個問題: 1.java.util.*包的UML 結構圖。 2.Vector 和 ArrayList、LinkedList 區別?Hashtable 和 HashMap之間的區別 3.String、StringBuffer,StringBuilder 之間區別。 

--回答-1.Collection ? |? |_List ? |?|_LinkedList ? |?|_ArrayList ? |?|_Vector? | |_Stack |? |_Set |_HashSet?? Map? |?|_HashMap? |? |Dictionary ?|_ |_Hashtable Comparetor 2.?LinkedList 內部以連結串列形式儲存資料 ?? ArrayList 內部以陣列形式儲存資料。 ? ?Vector 同ArrayList,不過它與 ArrayList 比較起來是 thread-safe 的。 ? ?Hashtable 是繼承了 Dictionary,是執行緒安全的。HashMap 實現了 Map介面,不是執行緒安全 的。 ??? 如何保證執行緒安全的?每個修改容器中資料的操作都是同步的(synchronized), 因此保證了執行緒安全。 

3. String 是長度不可變的,StringBuffer 和 StringBuilder 長度都是可以變化的。 StringBuffer 是執行緒安全的,StringBuilder 不是執行緒安全的。 ------------------------------------------------------------------------------==== 2、Anonymous Inner Class (匿名內部類) 是否可以 extends(繼承)其它類,是否可以 implements(實現)interface(介面) 答:匿名的內部類是沒有名字的內部類。不能extends(繼承) 其它類,但一個內部類可以作為 一個介面,由另一個內部類實現 3、StaticNested Class 和 InnerClass 的不同 答:NestedClass(一般是C++的說法),InnerClass(一般是JAVA的說法)。Java 內部類與C++ 巢狀類最大的不同就在於是否有指向外部的引用上。注: 靜態內部類(InnerClass)意味著1 建立一個 static 內部類的物件,不需要一個外部類物件,2不能從一個 static 內部類的一個對 象訪問一個外部類物件

4、&和&&的區別 答:&是位運算子,表示按位與運算,&&是邏輯運算子,表示邏輯與(and)

 5、Collection 和 Collections 的區別 答:Collection 是集合類的上級介面,繼承與他的介面主要有Set?和 List.Collections 是針對集 合類的一個幫助類,他提供一系列靜態方法實現對各種集合的搜尋、排序、執行緒安全化等操 作

6、什麼時候用assert 

答:assertion(斷言)在軟體開發中是一種常用的除錯方式,很多開發語 言中都支援這種機制。在實現中,assertion 就是在程式中的一條語句,它對一個boolean 表達 式進行檢查,一個正確程式必須保證這個boolean 表示式的值為 true;如果該值為 false,說明 程式已經處於不正確的狀態下,系統將給出警告或退出。一般來說,assertion 用於保證程式 最基本、關鍵的正確性。assertion 檢查通常在開發和測試時開啟。為了提高效能,在軟體發 布後,assertion 檢查通常是關閉的 

7、Strings=new String("xyz");建立了幾個 StringObject 

答:兩個,一個字元物件,一個字元物件引用物件 

8、Math.round(11.5)等於多少?Math.round(-11.5)等於多少 答:?Math.round(11.5)==12;Math.round(-11.5)==-11;round 方法返回與引數最接近的長整數,參 數加1/2後求其 floor 

9、short s1=1;s1=s1+1;有什麼錯?short s1=1;s1+=1;有什麼錯 答 : short?s1?=?1;?s1?=?s1?+?1;? ( s1+1 運 算 結 果 是 int 型 , 需 要 強 制 轉 換 類 型 ) short?s1?=?1;?s1?+=?1;(可以正確編譯)

 10、Java 有沒有 goto 答:java 中的保留字,現在沒有在 java 中使用 

11、陣列有沒有 length()這個方法?String 有沒有 length()這個方法 答:陣列沒有 length()這個方法,有length 的屬性。String 有有length()這個方法 

12、Overload 和 Override 的區別。Overloaded 的方法是否可以改變返回值的型別 答:方法的重寫 Overriding 和過載 Overloading 是 Java 多型性的不同表現。重寫 Overriding 是父類與子類之間多型性的一種表現,過載Overloading 是一個類中多型性的一種表現。如果 在子類中定義某方法與其父類有相同的名稱和引數,我們說該方法被重寫?(Overriding)。子類 的物件使用這個方法時,將呼叫子類中的定義,對它而言,父類中的定義如同被"遮蔽"了 。 如果在一個類中定義了多個同名的方法,它們或有不同的引數個數或有不同的引數型別,則 稱為方法的過載(Overloading)。Overloaded 的方法是可以改變返回值的型別 

13、Set 裡的元素是不能重複的,那麼用什麼方法來區分重複與否呢? 是用==還是 equals()? 它 們有何區別 答:Set 裡的元素是不能重複的,那麼用iterator()方法來區分重複與否。equals()是判讀兩個 Set 是否相等????equals()和==方法決定引用值是否指向同一物件equals()在類中被覆蓋,為的是當 兩個分離的物件的內容和型別相配的話,返回真值

 15、error 和 exception 有什麼區別 答:error?表示恢復不是不可能但很困難的情況下的一種嚴重問題。比如說記憶體溢位。不可能 指望程式能處理這樣的情況????exception?表示一種設計或實現問題。也就是說,它表示如果 程式執行正常,從不會發生的情況 

16、List,Set,Map是否繼承自 Collection 介面 答:?List,Set 是,Map不是 

17、abstractclass 和 interface 有什麼區別 答:宣告方法的存在而不去實現它的類被叫做抽象類(abstract?class),它用於要建立一個體 現某些基本行為的類,併為該類宣告方法,但不能在該類中實現該類的情況。不能建立abstract

?類的例項。然而可以建立一個變數,其型別是一個抽象類,並讓它指向具體子類的一個例項 。 不能有抽象建構函式或抽象靜態方法。Abstract?類的子類為它們父類中的所有抽象方法提供 實現,否則它們也是抽象類為。取而代之,在子類中實現該方法。知道其行為的其它類可以 在類中實現這些方法介面(interface)是抽象類的變體。在介面中,所有方法都是抽象的。多 繼承性可通過實現這樣的介面而獲得。介面中的所有方法都是抽象的,沒有一個有程式體。 介面只可以定義 static?final 成員變數。介面的實現與子類相似,除了該實現類不能從介面定 義中繼承行為。當類實現特殊介面時,它定義(即將程式體給予)所有這種介面的方法。然 後,它可以在實現了該介面的類的任何物件上呼叫介面的方法。由於有抽象類,它允許使用 介面名作為引用變數的型別。通常的動態聯編將生效。引用可以轉換到介面型別或從介面類 型轉換,instanceof?運算子可以用來決定某物件的類是否實現了介面 

18、abstract的 method 是否可同時是 static,是否可同時是 native,是否可同時是 synchronized 答:都不能 

19、介面是否可繼承介面? 抽象類是否可實現(implements)介面? 抽象類是否可繼承實體類 (concrete class) 答:介面可以繼承介面。抽象類可以實現(implements)介面,抽象類是否可繼承實體類,但前 提是實體類必須有明確的建構函式 

20、構造器Constructor 是否可被override 答:構造器 Constructor 不能被繼承,因此不能重寫Overriding,但可以被過載Overloading 

21、是否可以繼承String 類 答:String類是 final 類故不可以繼承 

22、try{}裡有一個 return 語句,那麼緊跟在這個 try 後的 finally{}裡的 code 會不會被執行, 什麼時候被執行,在return 前還是後 答:會執行,在return 前執行 

23、用最有效率的方法算出2乘以8等於幾 答:2?<<?3 

24、兩個物件值相同(x.equals(y)==true),但卻可有不同的hashcode,這句話對不對 答:不對,有相同的hash?code 

25、當一個物件被當作引數傳遞到一個方法後,此方法可改變這個物件的屬性,並可返回變 化後的結果,那麼這裡到底是值傳遞還是引用傳遞答:是值傳遞。Java?程式語言只有值傳遞 引數。當一個物件例項作為一個引數被傳遞到方法中時,引數的值就是對該物件的引用。對 象的內容可以在被呼叫的方法中改變,但物件的引用是永遠不會改變的 

26、swtich 是否能作用在 byte 上,是否能作用在 long 上,是否能作用在 String 上答:witch (expr1)中,expr1是一個整數表示式。因此傳遞給?switch?和?case?語句的引數應該 是?int、?short、?char?或者?byte。long,string?都不能作用於swtich 27、ArrayList 和Vector 的區別,HashMap和Hashtable 的區別 答:就ArrayList 與 Vector 主要從二方面來說.一.同步性:Vector 是執行緒安全的,也就是說是同 步的,而ArrayList 是執行緒序不安全的,不是同步的二.資料增長:當需要增長時,Vector 預設增 長為原來一培,而ArrayList 卻是原來的一半就HashMap與 HashTable 主要從三方面來說。一. 歷史原因:Hashtable 是基於陳舊的Dictionary 類的,HashMap是 Java1.2引進的Map介面的一 個實現二.同步性:Hashtable 是執行緒安全的,也就是說是同步的,而HashMap是執行緒序不安全 的,不是同步的三.值:只有HashMap 可以讓你將空值作為一個表的條目的key 或 value

 28、char 型變數中能不能存貯一箇中文漢字?為什麼? 答:是能夠定義成為一箇中文的,因為java 中以unicode 編碼,一個 char 佔16個位元組,所以 放一箇中文是沒問題的

29、GC是什麼??為什麼要有 GC 答:GC是垃圾收集的意思(Gabage?Collection),記憶體處理是程式設計人員容易出現問題的地方, 忘記或者錯誤的記憶體回收會導致程式或系統的不穩定甚至崩潰,Java 提供的 GC 功能可以自 動監測物件是否超過作用域從而達到自動回收記憶體的目的,Java 語言沒有提供釋放已分配內 存的顯示操作方法。 

30、float 型floatf=3.4是否正確? 答:不正確。精度不準確,應該用強制型別轉換,如下所示:floatf=(float)3.4 

32、抽象類與介面? 答:抽象類與介面都用於抽象,但是抽象類(JAVA中)可以有自己的部分實現,而介面則完全 是一個標識(同時有多重繼承的功能)。 JAVA類實現序例化的方法是實現 java.io.Serializable 介面 Collection 框架中實現比較要實現Comparable 介面和 Comparator 介面

 33、STRING 與 STRINGBUFFER 的區別。 答:STRING 的長度是不可變的,STRINGBUFFER 的長度是可變的。如果你對字串中的內 容經常進行操作,特別是內容要修改時,那麼使用StringBuffer,如果最後需要String,那麼 使用 StringBuffer 的toString()方法

 34、談談final,finally,finalize 的區別 答:final—修飾符(關鍵字)如果一個類被宣告為 final,意味著它不能再派生出新的子類, 不能作為父類被繼承。因此一個類不能既被宣告為 abstract 的,又被宣告為final 的。將變數 或方法宣告為 final,可以保證它們在使用中不被改變。被宣告為final 的變數必須在宣告時給 定初值,而在以後的引用中只能讀取,不可修改。被宣告為final 的方法也同樣只能使用,不 能過載finally—再異常處理時提供 finally 塊來執行任何清除操作。如果丟擲一個異常,那麼 相匹配的 catch 子句就會執行,然後控制就會進入 finally 塊(如果有的話)finalize—方法 名。Java 技術允許使用 finalize() 方法在垃圾收集器將物件從記憶體中清除出去之前做必要的 清理工作。這個方法是由垃圾收集器在確定這個物件沒有被引用時對這個物件呼叫的。它是 在 Object 類中定義的,因此所有的類都繼承了它。子類覆蓋 finalize() 方法以整理系統資源 或者執行其他清理工作。finalize() 方法是在垃圾收集器刪除物件之前對這個物件呼叫的 

35、面向物件的特徵有哪些方面? 答:主要有以下四方面:1.抽象:抽象就是忽略一個主題中與當前目標無關的那些方面,以 便更充分地注意與當前目標有關的方面。抽象並不打算了解全部問題,而只是選擇其中的一 部分,暫時不用部分細節。抽象包括兩個方面,一是過程抽象,二是資料抽象。2.繼承:繼 承是一種聯結類的層次模型,並且允許和鼓勵類的重用,它提供了一種明確表述共性的方法。 物件的一個新類可以從現有的類中派生,這個過程稱為類繼承。新類繼承了原始類的特性, 新類稱為原始類的派生類(子類),而原始類稱為新類的基類(父類)。派生類可以從它的基 類那裡繼承方法和例項變數,並且類可以修改或增加新的方法使之更適合特殊的需要。3.封 裝:封裝是把過程和資料包圍起來,對資料的訪問只能通過已定義的介面。面向物件計算始 於這個基本概念,即現實世界可以被描繪成一系列完全自治、封裝的物件,這些物件通過一 個受保護的介面訪問其他物件。4.?多型性:多型性是指允許不同類的物件對同一訊息作出響 應。多型性包括引數化多型性和包含多型性。多型性語言具有靈活、抽象、行為共享、程式碼 共享的優勢,很好的解決了應用程式函式同名問題。 

36、String是最基本的資料型別嗎 答:基本資料型別包括byte、int、char、long、float、double、boolean和 short。java.lang.String 類是 final 型別的,因此不可以繼承這個類、不能修改這個類。為了提高效率節省空間,我們 應該用StringBuffer 類 

37、int?和?Integer?有什麼區別

答:Java?提供兩種不同的型別:引用型別和原始型別(或內建型別)。Int 是 java 的原始資料 型別,Integer 是 java 為 int 提供的封裝類。Java 為每個原始型別提供了封裝類。原始型別封 裝 類,booleanBoolean,charCharacter,byteByte,shortShort,intInteger,longLong,floatFloat,doubleDouble 引用型別和原始型別的行為完全不同,並且它們具有不同的語義。引用型別和原始型別具有 不同的特徵和用法,它們包括:大小和速度問題,這種型別以哪種型別的資料結構儲存,當 引用型別和原始型別用作某個類的例項資料時所指定的預設值。物件引用例項變數的預設值 為?null,而原始型別例項變數的預設值與它們的型別有關 

38、執行時異常與一般異常有何異同 答:異常表示程式執行過程中可能出現的非正常狀態,執行時異常表示虛擬機器的通常操作中 可能遇到的異常,是一種常見執行錯誤。java 編譯器要求方法必須宣告丟擲可能發生的非運 行時異常,但是並不要求必須宣告丟擲未被捕獲的執行時異常。

 39、說出ArrayList,Vector,?LinkedList 的儲存效能和特性 答:ArrayList 和 Vector 都是使用陣列方式儲存資料,此陣列元素數大於實際儲存的資料以便 增加和插入元素,它們都允許直接按序號索引元素,但是插入元素要涉及陣列元素移動等內 存操作,所以索引資料快而插入資料慢,Vector 由於使用了 synchronized 方法(執行緒安全), 通常效能上較 ArrayList 差,而LinkedList 使用雙向連結串列實現儲存,按序號索引資料需要進行 前向或後向遍歷,但是插入資料時只需要記錄本項的前後項即可,所以插入速度較快。

 40、HashMap和Hashtable 的區別 答:HashMap是 Hashtable 的輕量級實現(非執行緒安全的實現),他們都完成了Map介面,主 要區別在於 HashMap允許空(null)鍵值(key),由於非執行緒安全,效率上可能高於Hashtable。 HashMap 允許將 null 作為一個 entry 的 key 或者 value,而 Hashtable 不允許。HashMap 把 Hashtable 的 contains 方法去掉了,改成containsvalue 和 containsKey。因為contains 方法容易 讓人引起誤解。?Hashtable 繼承自 Dictionary 類,而HashMap是 Java1.2引進的Map?interface 的一個實現。最大的不同是,Hashtable 的方法是Synchronize 的,而 HashMap不是,在多個 執行緒訪問Hashtable 時,不需要自己為它的方法實現同步,而HashMap?就必須為之提供外同 步。?Hashtable 和 HashMap採用的hash/rehash 演算法都大概一樣,所以效能不會有很大的差異 。 

41、heap和 stack 有什麼區別 答:棧是一種線形集合,其新增和刪除元素的操作應在同一段完成。棧按照後進先出的方式 進行處理。堆是棧的一個組成元素 

42、Java 的介面和C++的虛類的相同和不同處 答:由於Java 不支援多繼承,而有可能某個類或物件要使用分別在幾個類或物件裡面的方法 或屬性,現有的單繼承機制就不能滿足要求。與繼承相比,介面有更高的靈活性,因為介面 中沒有任何實現程式碼。當一個類實現了介面以後,該類要實現接口裡面所有的方法和屬性, 並且接口裡面的屬性在預設狀態下面都是 public?static,所有方法預設情況下是 public.一個類 可以實現多個介面。 

43、Java 中的異常處理機制的簡單原理和應用 答:當JAVA程式違反了 JAVA的語義規則時,JAVA虛擬機器就會將發生的錯誤表示為一個異 常。違反語義規則包括2種情況。一種是JAVA類庫內建的語義檢查。例如陣列下標越界,會引 發 IndexOutOfBoundsException;訪問 null 的物件時會引發NullPointerException。另一種情況就 是 JAVA允許程式設計師擴充套件這種語義檢查,程式設計師可以建立自己的異常,並自由選擇在何時用 throw 關鍵字引發異常。所有的異常都是java.lang.Thowable 的子類。

43、垃圾回收的優點和原理。並考慮2種回收機制 答:Java 語言中一個顯著的特點就是引入了垃圾回收機制,使c++程式設計師最頭疼的記憶體管理 的問題迎刃而解,它使得Java 程式設計師在編寫程式的時候不再需要考慮記憶體管理。由於有個垃 圾回收機制,Java 中的物件不再有"作用域"的概念,只有物件的引用才有"作用域"。垃圾回 收可以有效的防止記憶體洩露,有效的使用可以使用的記憶體。垃圾回收器通常是作為一個單獨 的低級別的執行緒執行,不可預知的情況下對記憶體堆中已經死亡的或者長時間沒有使用的物件 進行清楚和回收,程式設計師不能實時的呼叫垃圾回收器對某個物件或所有物件進行垃圾回收。 回收機制有分代複製垃圾回收和標記垃圾回收,增量垃圾回收。 

44、你所知道的集合類都有哪些?主要方法? 答:最常用的集合類是?List?和?Map。?List?的具體實現包括?ArrayList?和?Vector,它們是可 變大小的列表,比較適合構建、儲存和操作任何型別物件的元素列表。?List?適用於按數值索 引訪問元素的情形。?Map?提供了一個更通用的元素儲存方法。?Map?集合類用於儲存元素對 (稱作"鍵"和"值"),其中每個鍵對映到一個值。 

45、描述一下 JVM 載入class 檔案的原理機制? 答:JVM 中類的裝載是由ClassLoader 和它的子類來實現的,Java?ClassLoader?是一個重要的 Java 執行時系統元件。它負責在執行時查詢和裝入類檔案的類。 

46、排序都有哪幾種方法?請列舉 答:??排序的方法有:插入排序(直接插入排序、希爾排序),交換排序(氣泡排序、快速排 序),選擇排序(直接選擇排序、堆排序),歸併排序,分配排序(箱排序、基數排序)快速 排序的虛擬碼。/?/使用快速排序方法對 a[?0?:n-?1?]排序從 a[?0?:n-?1?]中選擇一個元素作為 m?i?d?d?l?e,該元素為支點把餘下的元素分割為兩段left?和r?i?g?h?t,使得l?e?f?t 中的元素 都小於等於支點,而right?中的元素都大於等於支點遞迴地使用快速排序方法對left?進行排序 遞迴地使用快速排序方法對right?進行排序所得結果為l?e?f?t?+?m?i?d?d?l?e?+?r?i?g?h?t 

47、JAVA語言如何進行異常處理,關鍵字:throws,throw,try,catch,finally 分別代表什麼意義? 在 try塊中可以丟擲異常嗎? 答:Java 通過面向物件的方法進行異常處理,把各種不同的異常進行分類,並提供了良好的 介面。在Java 中,每個異常都是一個物件,它是Throwable 類或其它子類的例項。當一個方 法出現異常後便丟擲一個異常物件,該物件中包含有異常資訊,呼叫這個物件的方法可以捕 獲到這個異常並進行處理。Java 的異常處理是通過5個關鍵詞來實現的:try、catch、throw、 throws 和 finally。一般情況下是用try 來執行一段程式,如果出現異常,系統會丟擲(throws) 一個異常,這時候你可以通過它的型別來捕捉(catch)它,或最後(finally)由預設處理器 來處理。用 try 來指定一塊預防所有"異常"的程式。緊跟在 try 程式後面,應包含一個 catch 子句來指定你想要捕捉的"異常"的型別。throw 語句用來明確地丟擲一個"異常"。throws 用來 標明一個成員函式可能丟擲的各種"異常"。Finally 為確保一段程式碼不管發生什麼"異常"都被 執行一段程式碼。可以在一個成員函式呼叫的外面寫一個try 語句,在這個成員函式內部寫另一 個 try語句保護其他程式碼。每當遇到一個try 語句,"異常"的框架就放到堆疊上面,直到所有 的 try語句都完成。如果下一級的try 語句沒有對某種"異常"進行處理,堆疊就會展開,直到 遇到有處理這種"異常"的try 語句。 

48、一個".java"原始檔中是否可以包括多個類(不是內部類)?有什麼限制? 答:可以。必須只有一個類名與檔名相同。 49、java 中有幾種型別的流?JDK 為每種型別的流提供了一些抽象類以供繼承,請說出他們 分別是哪些類? 答:位元組流,字元流。位元組流繼承於 InputStream?OutputStream,字元流繼承於InputStreamReader?OutputStreamWriter。在 java.io 包中還有許多其他的流,主要是為了提高效能和使用方便。 

50、java 中會存在記憶體洩漏嗎,請簡單描述。 答:會。自己實現堆載的資料結構時有可能會出現記憶體洩露,可參看effective java. 

51、java 中實現多型的機制是什麼? 答:方法的重寫 Overriding 和過載 Overloading 是 Java 多型性的不同表現。重寫 Overriding 是父類與子類之間多型性的一種表現,過載Overloading 是一個類中多型性的一種表現。

 52、垃圾回收器的基本原理是什麼?垃圾回收器可以馬上回收記憶體嗎?有什麼辦法主動通知 虛擬機器進行垃圾回收 答:對於GC 來說,當程式設計師建立物件時,GC 就開始監控這個物件的地址、大小以及使用情 況。通常,GC採用有向圖的方式記錄和管理堆(heap)的中所有物件。通過這種方式確定哪些 物件是"可達的",哪些物件是"不可達的"。當 GC 確定一些物件為"不可達"時,GC就有責任 回收這些記憶體空間。可以。程式設計師可以手動執行System.gc(),通知 GC執行,但是 Java 語言 規範並不保證 GC一定會執行。 

53、靜態變數和例項變數的區別? 答:static?i?=?10;?//常量???class?A?a;??a.i?=10;//可變

 54、什麼是java 序列化,如何實現java 序列化? 答:序列化就是一種用來處理物件流的機制,所謂物件流也就是將物件的內容進行流化。可 以對流化後的物件進行讀寫操作,也可將流化後的物件傳輸於網路之間。序列化是為了解決 在對物件流進行讀寫操作時所引發的問題。序列化的實現:將需要被序列化的類實現 Serializable 介面,該介面沒有需要實現的方法,implements?Serializable 只是為了標註該物件 是 可 被 序 列 化 的 , 然 後 使 用 一 個 輸 出 流 ( 如 : FileOutputStream) 來 構 造 一 個 ObjectOutputStream( 對 象 流 ) 對 象 , 接 著 , 使 用 ObjectOutputStream 對 象 的 writeObject(Object?obj)方法就可以將引數為obj 的物件寫出(即儲存其狀態),要恢復的話則用 輸入流。 

55、是否可以從一個static 方法內部發出對非static 方法的呼叫? 答:不可以,如果其中包含物件的method();不能保證物件初始化. 

56、寫clone()方法時,通常都有一行程式碼,是什麼? 答:Clone?有預設行為,super.clone();他負責產生正確大小的空間,並逐位複製。 

57、在JAVA中,如何跳出當前的多重巢狀迴圈? 答:用break;?return?方法。

 58、List、Map、Set 三個介面,存取元素時,各有什麼特點? 答:List?以特定次序來持有元素,可有重複元素。Set?無法擁有重複元素,內部排序。Map?保 存 key-value 值,value 可多值。 

59、說出一些常用的類,包,介面,請各舉5個 答:常用的類:BufferedReader??BufferedWriter??FileReader??FileWirter??String??Integer 常用 的 包 : java.lang??java.awt??java.io??java.util??java.sql 常 用 的 接 口 : Remote??List??Map??Document??NodeList ---------------------------------------------------------------------------------------------執行緒程式設計方面?? 

60、java 中有幾種方法可以實現一個執行緒?用什麼關鍵字修飾同步方法??stop()和 suspend()方 法為何不推薦使用? 答:有兩種實現方法,分別是繼承Thread 類與實現Runnable 介面用synchronized 關鍵字修飾 同步方法反對使用stop(),是因為它不安全。它會解除由執行緒獲取的所有鎖定,而且如果物件 處於一種不連貫狀態,那麼其他執行緒能在那種狀態下檢查和修改它們。結果很難檢查出真正

的問題所在。suspend()方法容易發生死鎖。呼叫suspend()的時候,目標執行緒會停下來,但卻 仍然持有在這之前獲得的鎖定。此時,其他任何執行緒都不能訪問鎖定的資源,除非被"掛起" 的執行緒恢復執行。對任何執行緒來說,如果它們想恢復目標執行緒,同時又試圖使用任何一個鎖 定的資源,就會造成死鎖。所以不應該使用suspend(),而應在自己的Thread 類中置入一個標 志,指出執行緒應該活動還是掛起。若標誌指出執行緒應該掛起,便用wait()命其進入等待狀態。 若標誌指出執行緒應當恢復,則用一個notify()重新啟動執行緒。

 61、sleep()?和?wait()?有什麼區別?? 答:sleep 是執行緒類(Thread)的方法,導致此執行緒暫停執行指定時間,給執行機會給其他線 程,但是監控狀態依然保持,到時後會自動恢復。呼叫sleep 不會釋放物件鎖。wait 是Object 類的方法,對此物件呼叫 wait 方法導致本執行緒放棄物件鎖,進入等待此物件的等待鎖定池, 只有針對此物件發出 notify 方法(或 notifyAll)後本執行緒才進入物件鎖定池準備獲得物件鎖 進入執行狀態。

 62、同步和非同步有何異同,在什麼情況下分別使用他們?舉例說明。 答:如果資料將線上程間共享。例如正在寫的資料以後可能被另一個執行緒讀到,或者正在讀 的資料可能已經被另一個執行緒寫過了,那麼這些資料就是共享資料,必須進行同步存取。當 應用程式在物件上呼叫了一個需要花費很長時間來執行的方法,並且不希望讓程式等待方法 的返回時,就應該使用非同步程式設計,在很多情況下采用非同步途徑往往更有效率。

 63、啟動一個執行緒是用run()還是start()? 答:啟動一個執行緒是呼叫start()方法,使執行緒所代表的虛擬處理機處於可執行狀態,這意味著 它可以由JVM 排程並執行。這並不意味著執行緒就會立即執行。run()方法可以產生必須退出的 標誌來停止一個執行緒。? 64、當一個執行緒進入一個物件的一個synchronized 方法後,其它執行緒是否可進入此物件的其 它方法? 答:不能,一個物件的一個synchronized 方法只能由一個執行緒訪問。 

65、請說出你所知道的執行緒同步的方法。 答:wait():使一個執行緒處於等待狀態,並且釋放所持有的物件的lock。sleep():使一個正在執行 的執行緒處於睡眠狀態,是一個靜態方法,呼叫此方法要捕捉InterruptedException 異常。notify(): 喚醒一個處於等待狀態的執行緒,注意的是在呼叫此方法的時候,並不能確切的喚醒某一個等 待狀態的執行緒,而是由 JVM 確定喚醒哪個執行緒,而且不是按優先順序。Allnotity():喚醒所有處 入等待狀態的執行緒,注意並不是給所有喚醒執行緒一個物件的鎖,而是讓它們競爭。

 66、多執行緒有幾種實現方法,都是什麼?同步有幾種實現方法,都是什麼?? 答:多執行緒有兩種實現方法,分別是繼承Thread 類與實現Runnable 介面?同步的實現方面有 兩種,分別是synchronized,wait 與notify

67、執行緒的基本概念、執行緒的基本狀態以及狀態之間 的關係答:執行緒指在程式執行過程中,能夠執行程式程式碼的一個執行單位,每個程式至少都 有一個執行緒,也就是程式本身。Java 中的執行緒有四種狀態分別是:執行、就緒、掛起、結束 68、簡述synchronized 和 java.util.concurrent.locks.Lock 的異同?? 答:主要相同點:Lock 能完成 synchronized 所實現的所有功能主要不同點:Lock 有比 synchronized 更精確的執行緒語義和更好的效能。synchronized 會自動釋放鎖,而 Lock 一定要 求程式設計師手工釋放,並且必須在finally 從句中釋放。 ---------------------------------------------------------------------------------------------

Jsp 方面 

69、forward?和 redirect 的區別 答:forward 是伺服器請求資源,伺服器直接訪問目標地址的URL,把那個 URL的響應內容 讀取過來,然後把這些內容再發給瀏覽器,瀏覽器根本不知道伺服器傳送的內容是從哪兒來

的,所以它的位址列中還是原來的地址。????redirect 就是服務端根據邏輯,傳送一個狀態碼, 告訴瀏覽器重新去請求那個地址,一般來說瀏覽器會用剛才請求的所有引數重新請求,所以 session,request 引數都可以獲取。

 70、jsp 有哪些內建物件?作用分別是什麼? 答:JSP 共有以下9種基本內建元件(可與ASP 的6種內部元件相對應): request 使用者端請 求,此請求會包含來自 GET/POST 請求的引數 ?? response 網頁傳回使用者端的迴應 ?? pageContext 網頁的屬性是在這裡管理 ?? session 與請求有關的會話期 ??application servlet 正在執行的內容 ?? out 用來傳送回應的輸出?? configservlet 的構架部件 ??page JSP 網頁本 身 ??exception 針對錯誤網頁,未捕捉的例外 

71、jsp 有哪些動作?作用分別是什麼? 答:JSP 共有以下6種基本動作?? jsp:include:在頁面被請求的時候引入一個檔案。 ?? jsp:useBean:尋找或者例項化一個 JavaBean。 ?? jsp:setProperty:設定 JavaBean的屬性。 ?? jsp:getProperty:輸出某個 JavaBean 的屬性。 ?? jsp:forward:把請求轉到一個新的頁面。 ?? jsp:plugin:根據瀏覽器型別為Java 外掛生成OBJECT 或EMBED 標記 

72、JSP 中動態INCLUDE 與靜態INCLUDE 的區別? 答:動態 INCLUDE 用 jsp:include 動作實現?? <jsp:include page="included.jsp" flush="true" /> 它總是會檢查所含檔案中的變化,適合用於包含動態頁面,並且可以帶引數?? 靜態INCLUDE用include偽碼實現,定不會檢查所含檔案的變化,適用於包含靜態頁面??<%@ include file="included.htm" %> 

73、兩種跳轉方式分別是什麼?有什麼區別? 答:有兩種,分別為:? <jsp:include page="included.jsp" flush="true">? <jsp:forward page= "nextpage.jsp"/>前者頁面不會轉向include 所指的頁面,只是顯示該頁的結果,主頁面還是原 來的頁面。執行完後還會回來,相當於函式呼叫。並且可以帶引數.後者完全轉向新頁面,不 會再回來。相當於go to 語句。

 74、JSP 的內建物件及方法。 答:request 表示 HttpServletRequest 物件。它包含了有關瀏覽器請求的資訊,並且提供了幾個 用於獲取cookie,?header,?和 session 資料的有用的方法。????? response 表示 HttpServletResponse 物件,並提供了幾個用於設定送回?瀏覽器的響應的方法(如 cookies,頭資訊等)????? out 物件是 javax.jsp.JspWriter 的一個例項,並提供了幾個方法使你能用於向瀏覽器回送輸出 結果。????? pageContext 表示一個 javax.servlet.jsp.PageContext 物件。它是用於方便存取各種範圍的名字 空間、servlet 相關的物件的API,並且包裝了通用的servlet 相關功能的方法。????? session 表示一個請求的 javax.servlet.http.HttpSession 物件。Session 可以存貯使用者的狀態信 息????? applicaton?表示一個 javax.servle.ServletContext 物件。這有助於查詢有關servlet 引擎和servlet 環境的資訊????? config 表示一個 javax.servlet.ServletConfig 物件。該物件用於存取 servlet 例項的初始化參 數。????? page 表示從該頁面產生的一個servlet 例項