在本教程中,我們將討論在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?
Autoboxing 是指在基本數據類型和對應的包裝(wrapper)類之間Java 編譯器所做的自動轉換。例如,編譯器將 int 轉換爲 Integer,將 double 轉換爲 Double ,等等。逆向的轉換稱爲 unboxing。 6. 在Java中什麼是方法的 Override(覆蓋) 和 Overload(重載)? |
7.Java中構造函數、構造函數重載的概念和拷貝構造函數 當類的對象被創建的時候,調用它的構造函數。每個類都有一個構造函數。如果程序員沒有爲類編寫構造函數,Java編譯器自動爲類創建一個缺省的構造函數。 構造函數重載和Java中函數重載類似,可以爲同一個類創建不同的構造函數,每個構造函數必須擁有唯一的參數列表。 Java與C++不同,它不支持拷貝構造函數,但是區別僅僅是,如果你沒有編寫類的拷貝構造函數,Java不會自動創建它。 8.Java支持多繼承嗎? Java不支持多繼承,每個類只允許繼承一個類,但是可以實現多個接口。 |
9.接口和抽象類有什麼不同? Java同時提供和支持抽象類和接口,它們的實現有一些共同的特點,也有如下不同:
也可以查閱 Abstract class and Interface differences for JDK 8 。 10.傳引用和傳值 當對象通過傳值調用時,傳遞的是這個對象的一個拷貝。因此,即使函數修改這個對象,也不會影響原對象的值。 當對象通過傳引用調用時,對象本身沒有被傳遞,而傳遞的是對象的一個引用。因此,外部函數對這個對象的修改,也會反映到任何出現這個對象的地方。 |
Java 線程11. 進程與線程的區別 ? 12. 說下創建線程的不同方式. 你傾向於哪種方式並說明原因 ?
首選方式是實現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 Collections18. Java Collections框架的基本接口 ?
19. 爲什麼Collection沒有繼承Cloneable和Serializable接口 ? Collection接口描述的是由元素組成的對象組. Collection的每一個具體實現可以選擇自己的方式來管理元素. 一些集合允許存在重複鍵, 另一些則不允許. 當處理實際實現時複製和序列化的語義和效果纔會起作用. 因此, 集合類的具體實現應該決定它們將怎樣被複制和序列化. |
20. 什麼是Iterator(疊代器) ? Iterator接口提供了許多能夠疊代集合的方法.每個java集合(Collection)都含有一個返回Iterator實例的iterator方法. 疊代器在疊代過程中能夠移除底層集合中的元素. 21. Iterator 和ListIterator之間的不同 ?
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 是怎麼工作的? 24. hashCode() 和 equals() 方法重要性何在 ? |
25.HashMap與HashTable之間有哪些不同? HashMap、HashTable這兩個類都實現了Map接口,因此有些非常相似的特徵,但他們在以下特性中又有所不同:
26.Array與ArrayList間有什麼不同?與ArrayList相比你什麼時候會用Array? Array與ArrayList類在以下特性中有所區別:
27.ArrayList與LinkedList間有什麼不同? ArrayList、LinkedList這兩個類都實現了List接口,但他們以下特性中又有所不同:
也可以查看我們的文章ArrayList vs. LinkedList |
28. Comparable 和 Comparator 接口分別是什麼 ? 列出它們的區別。 Java 提供的 Comparator 接口,包含兩個方法,compare 和 equals 。compare 方法比較兩個參數,得出它們的順序關係。它會返回一個負整數,零,或一個正整數,分別表示第一個參數小於,等於或大於已有的對象。equals 方法有1個參數,它用來確定參數對象是否等於這個 camparator。這個方法僅在要比較的對象也是一個 comparator,同時它的序關係與這個 comparator 相同時,纔會返回 true。 |
29.Java Priority Queue是什麼? 30. 關於Big-O符號你瞭解些什麼?你能針對不同數據結構舉些例子嗎? |
31. 如何權衡有序數組和無序數組 ? 32. 有哪些關於 Java 集合框架的最佳實踐?
|
|
33. Enumeration 和 Iterator 接口有什麼不同 ? 34. HashSet 和TreeSet 有什麼不同? 另一個方面,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區域 ? |
異常處理43. Java中的兩種異常是什麼?它們之間的區別? 44. Java中異常與錯誤的區別? Exception和Error都是Throwable類的子類. Exception用於用戶程序需要捕獲的異常條件. Error定義了用戶程序不可預見的異常 |
45. throw與throws的區別 ? 45. 異常處理中finally語句塊的重要性? 不管程序是否發生了異常, finally語句塊都會被執行. 甚至當沒有catch聲明但拋出了一個異常時, finally語句塊也會被執行. 最後要說一點: finally語句塊通常用於釋放資源, 如I/O緩衝區, 數據庫連接等等. 46. 異常被處理後異常對象會發生什麼? 47. 怎樣區分finally語句塊與finalize()方法? |
Java Applets48. 什麼是 Applet ? 49. Applet 生命週期的說明
50. 當 applet 加載的時候會發生什麼? |
51. Applet和Java應用程序有什麼不同? 還有, 一個Java應用程序需要一個main方法與特定的簽名,來確保啓動. Java applets並不需要這樣一些東西。 最後, Java Applet通常使用嚴格的安全策略,而Java應用程序通常使用較寬鬆的安全策略。 52. 什麼是強加給Java Applet限制?
|
53. 什麼是不可信的Applet ? 54. 通過文件系統加載的小程序在加載了互聯網和Applet之間的區別是什麼 ? 關於其中一個applet是從客戶端的本地磁盤加載的情況下,applet是由文件系統加載器加載的。 通過文件系統加載的applet允許讀取文件,寫入文件並加載在客戶端上。還有,通過文件系統加載applet允許執行,最後,通過文件系統加載的applet不管是否通過字節碼驗證都可加載。 |
55. 什麼是applet類加載器,它提供了什麼? |
|
56. 什麼是applet安全管理,它提供什麼? Swing57. Choice和List之間的區別是什麼? 58. 什麼是佈局管理器? 59. Scrollbar和JScrollPane 的區別是什麼? 60. 哪些Swing方法是線程安全? |
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組件怎麼處理自己的事件? 70. Java佈局管理器提供超過傳統的窗口系統的什麼樣的優勢? 71. Java爲所有Swing組件使用的設計模式是什麼? |
JDBC72. 什麼是 JDBC ? 73. 解釋JDBC中驅動的作用。 74.Class.forName 方法的目的是什麼? |
75.與Statement相比PreparedStatement的優點? PreparedStatement是預編譯的,因此它有更好的性能。另外,PreparedStatement可以被不同輸入值的查詢重用。 76. CallableStatement的用途 ? 指出用於創建CallableStatement的方法. CallableStatement用於執行存儲過程。存儲過程由數據庫保存並提供。存儲過程可以根據用戶的輸入返回結果。強烈建議使用存儲過程,因爲它提供了安全性和模塊化。準備CallableStatement的方法如下: CallableStament.prepareCall(); 77. 連接池是什麼 ? 打開和關閉數據庫連接時與數據庫的交互需要付出很高的代價. 特別是當數據庫客戶端增長時,這個代價是相當高的,並且消耗了很多資源。數據庫連接池中的連接在應用服務器啓動時被創建並在池中進行管理。一個連接請求由池中的數據庫連接提供。當連接結束後,請求會被放回池中以供以後重用。 |
|
遠程方法調用 (RMI)78. 什麼是RMI ? 79. 什麼是RMI的體系結構的基本原理? |
|
80. RMI的體系結構層是什麼?
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程序正常運行需要以下步驟:
86.RMI中stub的角色 ? 遠程對象的stub作爲遠程對象在本地程序中的表示或代理. 調用者調用本地stub的一個方法, 這個方法會在遠程對象上執行.當一個stub的方法被調用時, 它經歷了以下步驟:
|
87. 什麼是DGC?它是如何工作的? 88. 在RMI中使用RMISecurityManager的目的是什麼? 89. 解釋編組和解組。 |
90. 解釋序列化和反序列化。 Servlets91. 什麼是Servlet? |
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 請求併爲每一個請求生成一個響應。
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的名稱 - 值對。因此,存在客戶端的請求字符數量的限制。此外,該請求的參數值爲可見,因此,如果有敏感信息不能採用這種方式。 |
97. web應用是什麼 ? 98. 什麼是服務端包含 (SSI) ? |
99. 什麼是 Servlet 鏈? 100. 如何知道請求 servlet的客戶端信息 ? |
101. Http response的結構是什麼 ?
102. 什麼是cookie?session和cookie之間的區別是什麼?
|
103.瀏覽器和servlet通過什麼協議通信 ? 104. 什麼是HTTP通道 ? |
105. sendRedirect和 forward 方法的區別? 106. 什麼是URL編碼和解碼 ? URL編碼就是替換其中的空格和特殊字符, 變成相應的Hex碼.解碼就是反向操作。 |
JSP107. JSP頁面是什麼 ? 108. JSP請求是如何被處理的? |
109. JSP的優勢所在?使用JSP技術有以下優勢:
110. 什麼是指令?在JSP中, 包括哪些不同類型的指令?指令是JSP引擎所處理的命令,當網頁被編譯成小程序時,指令用於去設置頁面級別的命令,從外部文件插入數據,指定自定義的標籤庫。指令被包括在<%@ 和%>內。指令的類型分爲:
|
111. 什麼是JSP的actions?
112. 什麼是Scriptlet? |
113. 什麼是聲明?
聲明類似於Java中的變量聲明。聲明是爲表達式或者scriptlets後續的使用而聲明的變量。添加一個聲明,你必須在你的聲明中使用序列。
114. 什麼是表達式?
JSP表達式是把一個腳本語言表達式的值插入進來,轉換成字符串,進入數據流之後再通過web服務器返回給客戶端。表達式的定義是在<% = 和 %>標籤之間。
115. 什麼是隱式對象?他們是什麼?
JSP隱式對象是指JSP容器在每頁中提供給開發人員的Java對象。開發人員可以直接調用他們,而不需要任何顯示聲明。JSP隱式對象也被稱爲預定義變量。以下對象都是在JSP頁面中隱式存在的:
-
application
-
page
-
request
-
response
-
session
-
exception
-
out
-
config
-
pageContext