115個Java面試題及回答

在本教程中,我們將討論在Java面試中,用人單位用來測試應聘者Java以及面向對象的能力的面試題目.以下章節我們將按照以下結構討論面試問題,面向對象編程及其特性,Java及其特性的一般問題,集合,垃圾回收,異常處理,Java applets,Swing,JDBC,RMI, Servlet 和 JSP.

來,我們一起出發吧。。

目錄

 

面向對象編程(OOP)

Java是支持併發,基於類的以及面向對象的一種計算機編程語言. 以下列舉了面向對象編程的優勢:

  • 模塊化編程,使維護和修改更加容易

  • 代碼重用

  • 提高代碼的可靠性以及靈活性

  • 提高代碼可讀性

面向對象編程有其非常明顯的特性,比如說封裝,繼承,多態和抽象. 下面我們來分析一下每種特性.

封裝(Encapsulation)

封裝,提供的對象隱藏內部特性和行爲的一種能力,每個對象提供了一些方法,其他的對象可以訪問並改變其內部數據。在Java中,提供了三種訪問修飾符: 公有的,私有的以及保護的。每個修飾符都設定了不同的訪問權限,這個權限設置不會因爲包的不同而有差異。

下面是使用封裝的一些優點:

  • 通過隱藏屬性來保護對象的內部信息

  • 因爲可以獨立的修改或者擴展對象的行爲,從而提高代碼的可用性以及維護性

  • 隔離,通過阻止對象使用不希望的互動方式來交互,以此來提高模塊化程度。

你可以通過鏈接訪問我們的教程查看關於封裝更多的細節和實例.

 

多態(Polymorphism)

多態就是針對不同的基礎數據類型呈現相同接口的一種能力,多態類型就是其操作可以適用於不同類型值的一種類型。

繼承(Inheritance)

繼承提供了一個對象從基類獲取字段和方法的一種能力.繼承提供了代碼的重用性,並且在不更改現有類的情況下,對現有類增加額外的功能。

抽象(Abstraction)

抽象是從具體的實例中分離想法的過程,根據他們各自的功能而非具體的實現來開發類. Java中支持創建和存在暴露接口的抽象類, 而沒有包括方法的具體實現。抽象方法的宗旨就是將類的行爲和具體實現分離開。

抽象和封裝的異同

抽象和封裝是個互補的概念。一方面,抽象專注在對象的行爲上,而另外一方面,封裝專注於對象的行爲的具體實現。封裝是通過隱藏對象的內部信息來實現的,因此也可以被看做是抽象的一種策略。


 

有關Java的一般問題

1. 什麼是JVM? 爲什麼稱Java爲跨平臺的編程語言?

Java虛擬機(Java Virtual Machine)是可以執行Java字節碼的虛擬機,每個Java源文件將被編譯成字節碼文件,然後在JVM中執行。Java之所以被設計成可以在任意的平臺運行,而不需要重寫或者在不同的平臺下重新編譯,這些都要歸功於Java虛擬機(JVM),因爲JVM非常瞭解特定的指令的長度以及底層硬件平臺的特殊性。

2. JDK和JRE之間的差異是什麼?

Java運行環境(Java Runtime Enviroment) 是運行Java程序的基本的Java虛擬機,包括執行applet的瀏覽器插件。JDK (Java Development Kit) 是爲了開發,編譯和執行Java應用程序,針對Java的全功能的軟件開發包,包含了JRE,編譯器和工具(比如說  JavaDoc 和Java Debugger)。

 

3. “static” 關鍵字是什麼意思?在Java裏可以 override private 或 static 的方法嗎? keyword mean ? Can you override private or static method in Java ?

static 關鍵字表示,訪問這個成員變量或方法時,不必獲取它屬於的類的實例。

Java 裏的 static 方法不能被 override,因爲 override 的機制是運行時(runtime)的動態綁定,而 static 方法是在編譯時靜態綁定的。static 方法並不與任何類的具體實例有關,因此無法應用繼承的概念。

4. 在靜態方法裏可以訪問非靜態變量嗎?

Java 中的 static 變量歸相應的類所有,它的值對於類的所有實例都是相同的。static 變量是在 JVM 加載類的時候初始化的。如果代碼試圖訪問非靜態的變量,而且不是通過類的實例去訪問,編譯器會報錯,因爲這些非靜態變量還沒有被創建呢,並且它們沒有與實例相關聯。

 

5. Java 支持哪些數據類型?什麼是 Autoboxing 和 Unboxing?
Java語言支持的8個基本數據類型如下:

  • byte

  • short

  • int

  • long

  • float

  • double

  • boolean

  • char

Autoboxing 是指在基本數據類型和對應的包裝(wrapper)類之間Java 編譯器所做的自動轉換。例如,編譯器將 int 轉換爲 Integer,將 double 轉換爲 Double ,等等。逆向的轉換稱爲 unboxing。

6. 在Java中什麼是方法的 Override(覆蓋) 和 Overload(重載)?
Java中方法的 overload 發生的條件是,同一個類裏,有兩個或以上的方法名稱完全相同,但參數列表不同。另一方面,方法的 override 是指,子類重定義了父類裏的同一個方法。Override 的方法必須方法名、參數列表和返回類型都完全相同。Override 的方法不會限制原方法的訪問權限。

 

7.Java中構造函數、構造函數重載的概念和拷貝構造函數

當類的對象被創建的時候,調用它的構造函數。每個類都有一個構造函數。如果程序員沒有爲類編寫構造函數,Java編譯器自動爲類創建一個缺省的構造函數。

構造函數重載和Java中函數重載類似,可以爲同一個類創建不同的構造函數,每個構造函數必須擁有唯一的參數列表。

Java與C++不同,它不支持拷貝構造函數,但是區別僅僅是,如果你沒有編寫類的拷貝構造函數,Java不會自動創建它。

8.Java支持多繼承嗎?

Java不支持多繼承,每個類只允許繼承一個類,但是可以實現多個接口。


 

9.接口和抽象類有什麼不同?

Java同時提供和支持抽象類和接口,它們的實現有一些共同的特點,也有如下不同:

  • 接口中所有的方法默認都是抽象的,而抽象類可以同時包含抽象和非抽象的方法。

  • 一個類可以實現多個接口,但它只能繼承一個抽象類。

  • 一個類要實現某個接口,必須實現這個接口聲明的所有方法。而一個類不需要實現抽象父類中聲明的所有方法,不過,這時候這個類也必須聲明爲抽象類。

  • 抽象類可以實現接口,而且不需要實現接口中的方法。

  • 接口中聲明的變量默認是final的,而抽象類可以包含非final的變量。

  • 接口中的成員默認是public的,而抽象類的成員可以是private,protected,或public的。

  • 接口是絕對抽象的,不可實例化,抽象類也不可以實例化,但可以在main方法中觸發實例化(注:通過匿名類實現)。

也可以查閱       Abstract class and Interface differences for JDK 8    

10.傳引用和傳值  

當對象通過傳值調用時,傳遞的是這個對象的一個拷貝。因此,即使函數修改這個對象,也不會影響原對象的值。  

當對象通過傳引用調用時,對象本身沒有被傳遞,而傳遞的是對象的一個引用。因此,外部函數對這個對象的修改,也會反映到任何出現這個對象的地方。    

 

Java 線程

11. 進程與線程的區別 ?
進程是一個程序的執行(即正在運行的程序), 然而線程是在進程中獨立的執行序列. 一個進程可以包含很多線程. 線程有時被稱爲輕量級的進程.

12. 說下創建線程的不同方式. 你傾向於哪種方式並說明原因 ?
有三種創建線程的方式:

  • 繼承Thread類.

  • 實現Runnable接口.

  • 通過Executor框架創建線程池.

首選方式是實現Runnable接口, 因爲它不需要繼承Thread類. 當你的程序設計需要多繼承時, 使用接口會有所幫助. 另外, 線程池效率是很高的, 並且實施起來也很簡單.

 

13. 解釋下可用的線程狀態.
在執行期間, 線程會處於以下狀態中的一種:

  • Runnable: 線程已準備就緒, 但沒有立即運行.

  • Running: 處理器正在執行的線程代碼.

  • Waiting: 處於阻塞狀態的線程, 等待外部某種處理的結束.

  • Sleeping: 被強制休眠的線程.

  • Blocked on I/O: 等待I/O操作的完成.

  • Blocked on Synchronization: 等待取得線程鎖.

  • Dead: 線程已經執行結束.

14. 同步方法與同步塊的區別 ?
在Java程序中, 每個對象都擁有一個鎖. 線程可以通過使用synchronized關鍵字來獲取一個對象上的鎖. synchronized關鍵字可以用於方法級別(粗粒度鎖)或代碼塊級別(細粒度鎖).

15. 在監視器中的線程同步是怎樣發生的? 你可以使用哪些級別的同步 ?

JVM使用結合了監視器的鎖. 監視器是一個守護者, 它看管一個同步代碼的序列, 並且確保在一個時刻只能有一個線程執行同步代碼片段. 每個監視器關聯着一個對象引用. 只能得到鎖的線程纔可以執行同步代碼.

16. 什麼是死鎖 ?

兩個進程相互等待對方執行完畢時, 其結果是它們會永遠等待下去.

17. 怎樣確保N個線程訪問N個資源時不會發生死鎖 ?

使用N個線程時一個非常簡單的避免死鎖的方法是爲所有的鎖排序, 並強制每個線程也按那種方式排序. 這樣, 如果所有線程以相同的順序鎖定和解鎖互斥資源就不會發生死鎖了.

 

Java Collections

18. Java Collections框架的基本接口 ?
Java Collections 框架 提供了一系列支持對象集合操作的設計良好的接口和類. Java Collections框架中最基礎的接口是:

  • Collection, 表示一組對象(元素).

  • Set, 包含非重複元素的集合.

  • List, 包含非重複元素的有序集合.

  • Map, 包含非重複鍵的鍵值對的對象.

19. 爲什麼Collection沒有繼承Cloneable和Serializable接口 ?

Collection接口描述的是由元素組成的對象組. Collection的每一個具體實現可以選擇自己的方式來管理元素. 一些集合允許存在重複鍵, 另一些則不允許.

當處理實際實現時複製和序列化的語義和效果纔會起作用. 因此, 集合類的具體實現應該決定它們將怎樣被複制和序列化.

 

20. 什麼是Iterator(疊代器) ?

Iterator接口提供了許多能夠疊代集合的方法.每個java集合(Collection)都含有一個返回Iterator實例的iterator方法. 疊代器在疊代過程中能夠移除底層集合中的元素.

21. Iterator 和ListIterator之間的不同 ?
它們之間的不同如下:

  • Iterator能夠遍歷Set和List集合, 而ListIterator只能用來遍歷List.

  • Iterator只能正向遍歷集合, 而ListIterator可以雙向遍歷List.

  • ListIterator實現了Iterator接口並提供了額外的功能, 例如添加元素, 替換元素, 取得上一個或上一個元素索引, 等等.

22. fail-fast與fail-safe的區別?

Iterator的fail_safe特性是對底層集合的拷貝進行操作, 因此對集合的任何改變都不會有影響. java.util包下的所有集合類是fail-fast的, 但java.util.concurrent包下的集合類是fail-safe的. fail-fast疊代器會拋出ConcurrentModificationException, 而fail-safe疊代器不會拋出這種異常.

 

23. Java中的 HashMap 是怎麼工作的?
Java 中的 HashMap 是用來存儲鍵值對的。 HashMap 需要一個 hash 函數,它使用 hashCode 和 equals 方法,來進行 collection 中元素的保存和查找。調用 put 方法時,HashMap 會計算鍵(key)的 hash 值,然後將鍵值對存到 collection 的適當索引下。如果鍵已經存在,那麼相應的值會更新。HashMap 的重要特徵主要有它的容量,裝載因子(load factor)和容量擴充(threshold resizing)。

24. hashCode() 和 equals() 方法重要性何在 ?
Java中的 HashMap 使用 hashCode 和 equals 方法來確定鍵值對的索引。根據鍵去查詢對應的值時,同樣會用到這兩個方法。如果這兩個方法沒有正確實現,兩個不同的鍵可能會產生相同的 hash 值,因此會被 collection 認爲是相同的。並且,這兩個方法在檢測重複時也會用到。因此,這兩個方法都要正確實現,對 HashMap 的正確性和效率都至關重要。

 

25.HashMap與HashTable之間有哪些不同?

HashMap、HashTable這兩個類都實現了Map接口,因此有些非常相似的特徵,但他們在以下特性中又有所不同:

  • HashMap的key與value都允許null值的存在,而HashTable則既不允許key爲null,也不允許value爲null。

  • HashTable是線程同步的,而HashMap則不是。因此,在單線程環境下HashMap是首選,而HashTable更適合在多線程環境下使用。

  • HashMap提供了它鍵的set集合,因此Java程序可以通過set進行迭代。因此,HashMap是快速失敗的。另一方面,HashTable提供了它鍵的枚舉。

  • HashTable類被當做遺留類(譯者注:Java遺留類說明

26.Array與ArrayList間有什麼不同?與ArrayList相比你什麼時候會用Array?

Array與ArrayList類在以下特性中有所區別:

  • Arrays可以包含基礎數據類型或者對象,而ArrayList只能包含對象。

  • Arrays有固定長度,而ArrayList長度則是動態的。

  • ArrayList類提供了更多的方法和特性,比如addAll,removeAll,iterator,等等

  • 對於一個基礎數據類型的list,集合框架使用了自動裝箱去減少編碼的工作。但針對固定長度的的基礎數據類型,這種方法會使得它們變得更慢。

27.ArrayList與LinkedList間有什麼不同?

ArrayList、LinkedList這兩個類都實現了List接口,但他們以下特性中又有所不同:

  • ArrayList是基於索引的數據結構,底層由Array支持實現。它提供了以時間複雜度爲O(1)的性能隨機訪問它的元素,另一方面,LinkedList以元素列表的方式來存儲它的數據,每一個元素與它前一個和後一個元素都是相連的。對元素查詢操作的時間複雜度爲O(n).

  • 對元素的插入、添加、移除操作,與ArrayList相比,LinkedList更快,因爲,當一個元素被添加到集合內部的任意位置時,LinkedList不需要重新調整數組大小或者更新索引。

  • LinkedList比ArrayList消耗更多的內存,因爲LinkedList中每一個節點都存儲了兩個引用,一個是它前一個元素,一個是它後一個元素

也可以查看我們的文章ArrayList vs. LinkedList

 

28. Comparable 和 Comparator 接口分別是什麼 ? 列出它們的區別。
Java 提供的 Comparable 接口,其中只包含一個方法,就是 compareTo。這個方法會比較兩個對象,從而得出它們的順序關係。具體來說,它會返回一個負整數,零,或一個正整數,分別表示傳入的對象小於,等於或大於已有的對象。

Java 提供的 Comparator 接口,包含兩個方法,compare 和 equals 。compare 方法比較兩個參數,得出它們的順序關係。它會返回一個負整數,零,或一個正整數,分別表示第一個參數小於,等於或大於已有的對象。equals 方法有1個參數,它用來確定參數對象是否等於這個 camparator。這個方法僅在要比較的對象也是一個 comparator,同時它的序關係與這個 comparator 相同時,纔會返回 true。

 

29.Java Priority Queue是什麼?
PriorityQueue是一個基於優先級堆的無界隊列,它的元素都以他們的自然順序有序排列。在它創建的時候,我們可以可以提供一個比較器(Comparator)來負責PriorityQueue中元素的排序。PriorityQueue不允許null元素,不允許不提供自然排序的對象,也不允許沒有任何關聯Comparator的對象。最後,PriorityQueue不是線程安全的,在執行入隊和出隊操作它需要O(log(n))的時間複雜度。

30. 關於Big-O符號你瞭解些什麼?你能針對不同數據結構舉些例子嗎?
Big-O符號簡單描述了,在一種數據結構中隨着元素的不斷增加,在最壞的情況下,一個算法的擴展或者執行能有多好。Big-O符號還可以用來描述其他的行爲,比如內存消耗。由於collection集合下的類實際上都是數據結構,我們通常用Big-O符號來選擇基於時間、內存、性能前提下的最好實現去使用。Big-O符號能就大量數據的性能給出一個很好的指示。

 

31. 如何權衡有序數組和無序數組 ?
有序數組最關鍵的優勢在於搜索的時間複雜度爲 O(log n),而無序數組的時間複雜度是 O (n)。有序數組的劣勢就在於插入操作的時間複雜度爲 O(n),因爲較高值的元素需要挪動位置騰出空間給新元素。與之不同的是,無序數組的插入操作的時間複雜度爲 O(1)。

32. 有哪些關於 Java 集合框架的最佳實踐?

  • 基於應用的需求來選擇使用正確類型的集合,這對性能來說是非常重要的。例如,如果元素的大小是固定的,並且知道優先級,我們將會使用一個 Array,而不是 ArrayList

  • 一些集合類允許我們指定他們的初始容量。因此,如果我們知道存儲數據的大概數值,就可以避免重散列或者大小的調整。

  • 總是使用泛型來保證類型安全,可靠性和健壯性。同時,使用泛型還可以避免運行時的 ClassCastException

  • 在 Map 中使用 Java Development Kit (JDK) 提供的不可變類作爲一個 key,這樣可以避免 hashCode 的實現和我們自定義類的 equals 方法。

  • 應該依照接口而不是實現來編程。

  • 返回零長度的集合或者數組,而不是返回一個 null ,這樣可以防止底層集合是空的。


 
 

33. Enumeration 和 Iterator 接口有什麼不同 ?
Enumeration 跟 Iterator 相比較快兩倍,而且佔用更少的內存。但是,Iterator 相對於 Enumeration 更安全,因爲其他線程不能修改當前迭代器遍歷的集合對象。同時,Iterators 允許調用者從底層集合中移除元素,這些 Enumerations 都沒法完成。

34. HashSet 和TreeSet 有什麼不同?
HashSet 是用一個 hash 表來實現的,因此,它的元素是無序的。添加,刪除和 HashSet 包括的方法的持續時間複雜度是 O(1)。

另一個方面,TreeSet 是用一個樹形結構實現的,因此,它是有序的。添加,刪除和 TreeSet 包含的方法的持續時間複雜度是  O(logn)。

 

垃圾回收器

35. Java中垃圾回收的目的是什麼, 它什麼時候被使用 ?

垃圾回收用於識別和丟棄程序不再需要的對象, 以便回收和複用資源.

36. System.gc() 和Runtime.gc()方法用途?

這些方法用於提醒JVM開始垃圾回收. 然而開始垃圾回收的時機是由JVM決定的.

37. finalize()什麼時候被調用 ? 它的目的是什麼 ?

finallize方法是在釋放該對象內存前由gc(垃圾回收器)調用. 通常建議在這個方法中釋放該對象持有的資源.

38.如果一個對象的引用被設置爲null, gc會立即釋放該對象的內存麼?

不會, 這個對象將會在下一次gc循環中被回收.

39. Java堆的結構是什麼 ? 堆中的Perm Gen(全稱是Permanent Generation)空間是什麼 ?

JVM有一個運行時數據區,即堆(heap).所有的類實例和數組的內存都是從堆中分配的. 它在JVM啓動時被創建. 對象所佔用的堆內存會被一個稱爲垃圾回收器的自動內存管理系統收回.

堆內存中包含活的和死的對象. 活的對象可以被程序訪問並且不會被垃圾回收. 死的對象是那些不會被程序訪問的, 但還沒有被垃圾回收器收回的對象. 這種對象會佔用堆內存空間直到最終被垃圾回收器收回.

40. Serial 垃圾回收器與 Throughput 垃圾回收器區別 ?

Throughput垃圾回收器使用並行版本的新生代回收器, 它用於中到大型數據集的應用. 另一方面, Serial回收器通常足以應對大多數的小應用(在現代處理器上不會超過約100MB的堆內存).

 

41. 什麼時候對象會被回收 ?
噹噹前程序無法訪問到某個對象時,該對象將被回收.

42. 垃圾回收發生在指定的JVM區域 ?
垃圾回收在 PermGen 裏發生。如果 PermGen滿了或是到了瓶頸,就會觸發完全回收。如果仔細 觀察垃圾回收過程,會發現PermGen最後也被回收了. 這就是爲什麼要設置合理的PermGen大小以避免完全垃圾回收. 可以看看這篇文章 Java 8: PermGen to Metaspace.

 

異常處理 

43. Java中的兩種異常是什麼?它們之間的區別?
Java有兩種類型的異常:checked與unchecked(檢查與未檢查) 異常. 如果unchecked異常可能會在方法或構造函數的執行時被拋出從而蔓延到方法或構造函數的外部, 它們也不需要要在方法或構造函數中聲明throws子句. 然而, checked異常必須通過方法或構造函數的throws子句聲明. 關於java異常處理的建議請參考這裏Java exception handling.

44. Java中異常與錯誤的區別?

ExceptionError都是Throwable類的子類. Exception用於用戶程序需要捕獲的異常條件. Error定義了用戶程序不可預見的異常

 

45. throw與throws的區別 ?
關鍵字throw用於在程序中顯式地拋出一個異常. 相反, throws子句用於指出在該方法中沒有處理的異常. 每個方法必須顯式指明哪些異常沒有處理, 以便該方法的調用者可以預防可能發生的異常. 最後, 多個異常用逗號分隔.

45. 異常處理中finally語句塊的重要性?

不管程序是否發生了異常, finally語句塊都會被執行. 甚至當沒有catch聲明但拋出了一個異常時, finally語句塊也會被執行. 最後要說一點: finally語句塊通常用於釋放資源, 如I/O緩衝區, 數據庫連接等等.

46. 異常被處理後異常對象會發生什麼?
異常對象會在下次gc執行時被回收.

47. 怎樣區分finally語句塊與finalize()方法?
不管是否拋出異常finally語句塊都會被執行, 它通常用於釋放程序持有的資源. finalize是Object類中的一個protected方法, 當一個對象被gc回收前它會被jvm調用.

 

Java Applets

48. 什麼是 Applet ?
一個 Java Applet 可以包含在 HTML 頁面中並且可以在啓用 Java 客戶端的瀏覽器中運行。Applets 可以用來創建動態和交互式的 web 應用程序。

49. Applet 生命週期的說明
一個 Applet 可能會經歷以下的幾個狀態:

  • Init: 每次加載的時候都進行初始化

  • Start: 開始執行一個 applet

  • Stop: 停止執行一個 applet

  • Destroy: 卸載 applet 之前執行最後的清理

50. 當 applet 加載的時候會發生什麼?
首先,會創建一個 applet 的控制類的實例。然後,applet 初始化,最後 applet 開始運行。

 

51. Applet和Java應用程序有什麼不同?
Applets需要一個支持Java的瀏覽器, 但是Java應用程序可以被單獨執行。但是,他們都需要一個Java虛擬機,JVM。

還有, 一個Java應用程序需要一個main方法與特定的簽名,來確保啓動. Java applets並不需要這樣一些東西。

最後, Java Applet通常使用嚴格的安全策略,而Java應用程序通常使用較寬鬆的安全策略。

52. 什麼是強加給Java Applet限制?
這主要是由於安全原因,以下限制強加在Java小程序:

  • Applet無法加載庫或定義本地方法。

  • Applet 通常無法讀取或執行主機的文件。

  • Applet無法讀取某些系統屬性。

  • 除非連接來自主機否則不能進行網絡連接。

  • Applet程序不能啓動主機上執行它的任何程序。

 

53. 什麼是不可信的Applet ?
不受信任的Applet是那些Java Applet不能訪問或執行本地系統的文件的程序。默認情況下,所有下載的Applet被認爲是不可信的。

54. 通過文件系統加載的小程序在加載了互聯網和Applet之間的區別是什麼 ?
關於其中一個applet被加載在互聯網的情況下,applet是由applet類加載器加載並須受該applet安全管理器執行的限制。

關於其中一個applet是從客戶端的本地磁盤加載的情況下,applet是由文件系統加載器加載的。

通過文件系統加載的applet允許讀取文件,寫入文件並加載在客戶端上。還有,通過文件系統加載applet允許執行,最後,通過文件系統加載的applet不管是否通過字節碼驗證都可加載。

 

55. 什麼是applet類加載器,它提供了什麼?
當在互聯網上加載applet,該applet是由applet的類加載器加載的。類加載器強制執行Java命名空間的層次結構。此外,類加載器保證這是在來自本地文件系統的類中唯一的命名空間,以及在每個網絡源中唯一的命名空間。

當瀏覽器在網絡上加載applet,applet的類被放置在私人的和applet起始地址有關的命名空間中。那麼,那些類加載器加載的類就會通過校驗。這個校驗會檢查類文件是否符合Java語言規範。除此之外,校驗器會確保沒有堆棧溢出或者向下溢出,參數的所有字節碼指令也是正確的。


 
 

56. 什麼是applet安全管理,它提供什麼?
applet安全管理是對Java applet做了限制的機制。瀏覽器只能有一個安全管理器。安全管理器在啓動的時候建立,之後它不能被取代,重載,重寫或者延長。

Swing

57. Choice和List之間的區別是什麼?
Choice是一種緊湊的方式展示,必須要拉下,是爲了讓用戶能夠看到所有的可選選項列表。Choice只能選中一個選項。List是以幾個List選項是可見的方式展示的。List支持選中一個或多個List選項。

58. 什麼是佈局管理器?
佈局管理器是用來組織容器內的組件。

59. Scrollbar和JScrollPane 的區別是什麼?
Scrollbar是一個組件, 但不是一個容器,而ScrollPane是一個容器。 ScrollPane處理它自身的事件並執行它自己的滑動。

60. 哪些Swing方法是線程安全?
只有3個方法是線程安全的:repaint, revalidate, 和invalidate。

 

61. 說出3個支持繪圖的子類。
Canvas,Frame,Panel, 和Applet類都支持繪圖。

62. 什麼是裁剪?
裁剪是指在有限的區域和圖形類進行繪圖操作。

63. MenuItem和CheckboxMenuItem的區別是什麼?
CheckboxMenuItem類繼承了MenuItem類,並支持選中或者取消菜單選項。

64. BorderLayout的元素是怎樣組織的?
BorderLayout的元素都是在有序地分佈在邊緣部分(東,南,西,北)和容器的中心。

65. GridBagLayout的元素是怎樣組織的?
GridBagLayout的元素根據網格組織的。元素具有不同的尺寸,並且可以佔據一行或列的網格。因此,行和列可以有不同的尺寸。

66. Window和Frame有什麼區別?
Frame類是繼承Window類,並定義了一些主要的帶菜單欄的應用程序窗口。

67. 裁剪和重畫之間的關係?
當窗口被AWT繪圖線程重畫,它設置了裁剪區域到窗口中請求重畫的區域。

68. 事件監聽器接口和事件適配器類之間是什麼關係?
事件監聽器接口定義了一個特定事件的事件處理程序所必須實現的一些方法。事件適配器提供了一個事件偵聽器接口的默認實現。

69. 一個GUI組件怎麼處理自己的事件?
GUI組件可以通過實現相應的事件監聽器接口和添加它自己作爲本身的事件偵聽器來處理自己的事件。

70. Java佈局管理器提供超過傳統的窗口系統的什麼樣的優勢?
Java使用佈局管理器以一致的方式來佈局組件,跨所有窗口平臺。由於佈局管理器不綁定絕對化的尺寸和位置,所以它們能夠容納不同窗口系統的平臺具體差異。

71. Java爲所有Swing組件使用的設計模式是什麼?
Java爲所有Swing組件使用的設計模式是是 模型視圖控制器(MVC)模式。

 

JDBC

72. 什麼是 JDBC ?
JDBC是一個抽象層,允許用戶在不同數據庫間進行選擇。JDBC使開發人員能夠在Java中編寫數據庫應用程序,而不必讓自己關心一個特定的數據庫的底層細節。

73. 解釋JDBC中驅動的作用。
JDBC驅動提供了 對 JDBC API 所提供的抽象類 的 數據庫供應商的特定實現。每個驅動必須提供java.sql包的以下的類實現:Connection,Statement,PreparedStatement,CallableStatement,ResultSet Driver

74.Class.forName 方法的目的是什麼?
此方法用於加載驅動程序,以建立與數據庫的連接。

 

75.與Statement相比PreparedStatement的優點?

PreparedStatement是預編譯的,因此它有更好的性能。另外,PreparedStatement可以被不同輸入值的查詢重用。

76. CallableStatement的用途 ? 指出用於創建CallableStatement的方法.

CallableStatement用於執行存儲過程。存儲過程由數據庫保存並提供。存儲過程可以根據用戶的輸入返回結果。強烈建議使用存儲過程,因爲它提供了安全性和模塊化。準備CallableStatement的方法如下:

CallableStament.prepareCall();

77. 連接池是什麼 ?

打開和關閉數據庫連接時與數據庫的交互需要付出很高的代價. 特別是當數據庫客戶端增長時,這個代價是相當高的,並且消耗了很多資源。數據庫連接池中的連接在應用服務器啓動時被創建並在池中進行管理。一個連接請求由池中的數據庫連接提供。當連接結束後,請求會被放回池中以供以後重用。

 
 

遠程方法調用 (RMI)

78.  什麼是RMI ?
Java遠程方法調用(RMI)是一個Java API,它執行的面向對象的等價遠程過程調用(RPC)的方法,包括了直接傳輸序列化的Java類和分佈式垃圾收集的支持。 遠程方法調用(RMI),也可以看作是一個遠程運行的對象上激活的方法的過程。RMI提供位置透明性,因爲用戶認爲一個方法是在本地運行的對象上執行。 RMI Tips here.

79. 什麼是RMI的體系結構的基本原理?
RMI的架構最重要的原則是將行爲的定義和行爲的實施分別對待。 RMI允許定義的行爲和實現行爲保持獨立,並在獨立的JVM中運行的代碼。

 
 

80. RMI的體系結構層是什麼?
RMI的結構主要分爲以下幾層:

  • 樁(Stub)和框架(Skeleton)層:該層位於開發者視圖的下面。該層是負責攔截客戶端請求接口的方法並重定向這些請求到遠程RMI服務上。

  • 遠程引用層:架構的第二層是處理從客戶端到服務器的遠程對象引用的解析。該層解析並管理從客戶端到遠程服務對象的引用。該連接是一對一(單播)連接的。

  • 傳輸層:該層主要負責連接參與服務的兩個JVM。它基於通過網絡連接的機子的TCP/IP,提供了基本的連通性,以及一些防火牆的滲透策略。

81. 在RMI中遠程接口的作用是什麼?
遠程接口用於識別那些不是來自本地機子接口但可以被調用的方法。所有對象都是必須直接或間接實現該接口的遠程對象。實現該遠程接口之前應該聲明其遠程接口,爲每個遠程對象定義構造方法,並在所有遠程接口中爲每個遠程方法提供實現。

 

82. java.rmi.Naming 類扮演的角色 ?

java.rmi.Naming類提供了存儲和獲取已註冊的遠程對象. Naming類中的每個方法都需要一個URL格式的String作爲參數的名稱.

83. RMI中的綁定是什麼意思 ?

綁定是關聯或註冊一個遠程對象的名字的過程, 這個名字可以在以後用到, 用於查找與它綁定的遠程對象. 遠程對象可以通過Naming類中的bind或rebind方法與一個名字相關聯.

84. Naming 類中的bind與rebind方法的區別 ?

bind方法的綁定主要用於將特定的名字綁定到一個遠程對象, 但rebind方法的綁定用於將特定的名字重新綁定到一個新的遠程對象. 如果這個名字已經綁定過了, 使用rebind這個綁定會被替換.

 

85. 運行RMI 程序的步驟?

爲了使RMI程序正常運行需要以下步驟:

  • 編譯所有源文件.

  • 用rmic生成stub.

  • 啓動rmiregistry.

  • 啓動RMIServer.

  • 運行客戶端程序.

86.RMI中stub的角色 ?

遠程對象的stub作爲遠程對象在本地程序中的表示或代理. 調用者調用本地stub的一個方法, 這個方法會在遠程對象上執行.當一個stub的方法被調用時, 它經歷了以下步驟:

  • 初始化與運行遠程對象的遠程JVM的連接.

  • 將參數編碼並傳遞給遠程JVM.

  • 等待方法調用與執行的結果.

  • 解碼返回值或異常(如果執行失敗).

  • 將返回值返回給調用者.

 

87. 什麼是DGC?它是如何工作的?
DGC代表的是分佈式垃圾收集。遠程方法調用(RMI)使用的是DGC自動垃圾收集機制。由於RMI涉及到跨JVM的遠程引用,垃圾回收就會相當困難。DGC使用相關的計數算法爲遠程對象提供自動存儲管理。

88. 在RMI中使用RMISecurityManager的目的是什麼?
在RMI應用程序中可以使用RMISecurityManager提供安全管理器來下載代碼。如果安全管理器沒有設置好,RMI的類加載器不會從遠程端下載任何類。

89. 解釋編組和解組。
當一個應用程序要通過網絡來傳送內存對象到另一臺主機,或者保留它到存儲器,內存表達法會將其轉換到合適的格式。這個過程就叫做編組,而恢復操作就叫解組。

 

90. 解釋序列化和反序列化。
Java提供了一個機制,是指一個對象可以被表示爲字節序列,包括對象的數據,以及對象類型的信息和存儲在對象中的數據類型。因此,序列化可以看做是平面化對象爲了存儲到磁盤中,方便後面讀取和重新配置的一種方式。反序列化是一種從平面化狀態到活躍狀態的一種轉換對象的逆過程。

Servlets

91. 什麼是Servlet?
servlet是用來處理客戶端請求並生成動態web內容的Java程序語言類。Servlets大多是用來處理或者存儲HTML表單提交的數據,提供動態內容和管理那些不在HTTP無狀態協議中的狀態信息。

 

92. 解釋一個Servlet的架構.
核心抽象概念肯定是所有servlet必須實現 javax.servlet.Servlet 接口。 每個 servlet 必須直接或者間接實現這個接口, 也可以繼承於 javax.servlet.GenericServlet 或者javax.servlet.http.HTTPServlet。最後想提的是,每個 servlet 能夠使用多線程服務多個請求。

93. 一個 Applet 和 一個 Servlet 區別是什麼 ?
一個 Applet 是一個跑在客戶機器的 網頁瀏覽器 裏面的 客戶端java程序。相反,一個 servlet 是跑在網頁服務器的服務的容器。一個 applet 能使用用戶界面class, 而一個 servlet 不能夠有一個用戶界面。相反,一個servlet 等待客戶端的 HTTP 請求併爲每一個請求生成一個響應。

94. GenericServlet 和 HttpServlet 的區別是什麼 ?
GenericServlet 是一個實現了Servlet 和 ServletConfig  接口的通用的協議無關的 servlet . 那些繼承於GenericServlet 類的 servlet 將重寫 service 方法 。最後想提的是,爲了給Web用戶開發一個使用HTTP協議服務的HTTP servlet, 你的 servlet 必須改爲繼承於 HttpServlet 。

95.解釋一個Servlet的生命週期.

對每一個客戶端的請求,這個Servlet引擎加載servlet和調用它的init方法,以便在servlet初始化。然後, Servlet對象處理所有從客戶端來的後續請求,通過爲每個請求單獨調用服務的方法。最後,該servlet調用服務器的destroy方法。

96 .doGet()和doPost()之間的區別是什麼?

doGet : GET方法附加請求的URL的名稱 - 值對。因此,存在客戶端的請求字符數量的限制。此外,該請求的參數值爲可見,因此,如果有敏感信息不能採用這種方式。
doPost: POST方法克服了GET請求的限制,將發送請求的值置於body裏。此外,發送值的數量沒有限制。最後,通過POST請求傳遞的敏感信息是不可見的

 

97. web應用是什麼 ?
web應用是web服務的延伸. 主要有兩種類型:面向視覺的和麪向服務的. 面向視覺型的應用通過編輯語言來動態展示交互頁面. 面向應用的則提供了後端的service.總的來說,就是一堆置於 server's URL明明空間下的servlets.

98. 什麼是服務端包含 (SSI) ?
服務端包含是服務端的一種簡單腳本語言,主要應用在Web方面,置於servlet標籤中. 最常用的地方就是在網頁中引入一個或多個文件. 當瀏覽器加載頁面時,使用servlet產生的超文本替換其標籤.

 

99. 什麼是 Servlet 鏈?
Servlet 鏈是指將上一個servlet的結果傳到下一個.第二個的結構又可以傳到第三個. 最後的servlet負責將響應回覆給客戶端.

100. 如何知道請求 servlet的客戶端信息 ?
ServletRequest類可以獲取客戶端的IP地址或主機名. getRemoteAddr()獲取IP getRemoteHost()獲取主機名. 示例如下 here.

 

101. Http response的結構是什麼 ?
HTTP response 包括了三個部分:

  • Status Code: 描述了這次迴應的狀況. 它可以用來檢查這次請求是否成功完成. 一旦請求失敗了, 這個status code可以用來尋找原因. 如果你的 servlet 沒有返回一個status code, 默認就會返回成功的status code, HttpServletResponse.SC_OK.

  • HTTP Headers: 它包含了response的更多信息.舉個例子,headers可以反應response的訪問date/time, 或者是用於將實體安全地傳送到用戶的編碼形式。可以閱讀 how to retrieve headers in Servlet here.

  • Body: 它是response的具體內容. 可能包括HTML內容,比如圖片。Body包括了緊接Header發送的HTTP事務消息數據字節。

102. 什麼是cookie?session和cookie之間的區別是什麼?
Cookie是Web服務器發送到瀏覽器的一小塊信息,瀏覽器爲每個Web服務器在本地文件中存儲cookie。 在以後的請求裏, 瀏覽器對特定的Web服務器,將request和所有特定的Web服務器的cookie一起發送。Session和Cookie之間的區別如下:

  • Session無論在客戶端瀏覽器的設置都可以工作。客戶端可以選擇禁用cookies。然而,Session仍然可以工作,因爲客戶端沒有能力在服務器端禁用Session。

  • Session和cookie也t有不同的信息存儲量。 HTTP會話能夠存儲任何Java對象,而一個cookie只能保存String對象。

 

103.瀏覽器和servlet通過什麼協議通信  ?
HTTP協議.

104. 什麼是HTTP通道 ?
通道是指使用 HTTP或 HTTPS 封裝其它的網絡協議. HTTP包裝了其他的網絡通信協議. 其它協議通過HTTP來發送請求的過程就使用了通道.

 

105.  sendRedirect和 forward 方法的區別?
 sendRedirect創建一個新的請求,  forward只是將請求轉發.之前請求中包含的對象在redirect後將不可用, 因爲產生了一個新的請求. 但是 forwarding不受此限制.通常來說,sendRedirect 比 forward 方法慢一些.

106. 什麼是URL編碼和解碼 ?

URL編碼就是替換其中的空格和特殊字符, 變成相應的Hex碼.解碼就是反向操作。

 

JSP

107. JSP頁面是什麼 ?
一個JSP頁面是一個文本文檔,包含了兩種類型的文本:靜態數據和JSP元素。靜態數據可以以任何一種基於文本的格式表達,比如HTML或者XML。JSP是一種混合了靜態內容與動態生成內容的技術。查看JSP例子

108. JSP請求是如何被處理的?
一個JSP請求的到來,瀏覽器首先以一個jsp擴展的文件名來請求一個頁面。然後,Web Server讀取到該請求,使用JSP編譯器將JSP頁面轉換爲一個servlet類。注意JSP文件只在該頁面的第一次請求或者JSP文件已經改變時才編譯。生成的servlet類被調用,去處理瀏覽器的請求。一旦請求處理完,servlet會向客戶端返回一個相應。查看如何獲取JSP請求中的參數

 

109. JSP的優勢所在?

使用JSP技術有以下優勢:

  • JSP網頁被動態的編譯,因此開發者很容易更新當前代碼。

  • JSP網頁可預編譯。

  • JSP網頁能容易的組合成靜態模版,包括HTML XML片段,且代碼可形成動態內容。

  • 開發者能提供自定義的JSP標籤庫,且使用類XML語法訪問。

  • 開發者可以在組件級別做邏輯上的改變,但是不能使用程序邏輯編輯個別的網頁。

110. 什麼是指令?在JSP中, 包括哪些不同類型的指令?

指令是JSP引擎所處理的命令,當網頁被編譯成小程序時,指令用於去設置頁面級別的命令,從外部文件插入數據,指定自定義的標籤庫。指令被包括在<%@ 和%>內。指令的類型分爲:

  • 包含指令:用於包含文件,和當用頁面合併文件內容。

  • 頁面指令:用於定義JSP頁面的具體屬性,比如錯誤頁面和緩衝池。

  • 標籤庫:用於聲明頁面中使用到的自定義標籤庫。

 

111. 什麼是JSP的actions?
JSP的actions是使用XML語法結構來控制Servlet引擎的行爲。JSP的actions是在當JSP頁面請求的時候才執行。它們會動態插入一個文件中,再利用JavaBeans的組件,轉發給用戶到另一個頁面,或者生成帶Java插件的HTML頁面。以下是一些可以操作的actions:

  • jsp:include- 當JSP頁面被請求的時候,包含了一個文件。

  • jsp:useBean- 尋找或者實例化一個JavaBean。

  • jsp:setProperty- 設置JavaBean的屬性。

  • jsp:getProperty- 得到JavaBean的屬性。

  • jsp:forward- 轉發請求到新的頁面。

  • jsp:plugin- 生成特定瀏覽器的代碼。

112. 什麼是Scriptlet?
在Java Server Page(JSP)技術中,scriptlet是嵌入在JSP頁面的其中一塊Java代碼。scriptlet是標籤內的任何東西。在這些標籤之間,用戶可以添加任何有效的scriptlet。

 

113. 什麼是聲明?
聲明類似於Java中的變量聲明。聲明是爲表達式或者scriptlets後續的使用而聲明的變量。添加一個聲明,你必須在你的聲明中使用序列。

114. 什麼是表達式?
JSP表達式是把一個腳本語言表達式的值插入進來,轉換成字符串,進入數據流之後再通過web服務器返回給客戶端。表達式的定義是在<% = 和 %>標籤之間。

115. 什麼是隱式對象?他們是什麼?
JSP隱式對象是指JSP容器在每頁中提供給開發人員的Java對象。開發人員可以直接調用他們,而不需要任何顯示聲明。JSP隱式對象也被稱爲預定義變量。以下對象都是在JSP頁面中隱式存在的:

  • application

  • page

  • request

  • response

  • session

  • exception

  • out

  • config

  • pageContext


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章