Java重要知識點(二)

JAVA知識點

數組(Array)和列表(ArrayList)有什麼區別?什麼時候應該使用Array而不是ArrayList?

Array和ArrayList的不同點:
Array可以包含基本類型和對象類型,ArrayList只能包含對象類型。
Array大小是固定的,ArrayList的大小是動態變化的。
ArrayList提供了更多的方法和特性,比如:addAll(),removeAll(),iterator()等等。
對於基本類型數據,集合使用自動裝箱來減少編碼工作量。但是,當處理固定大小的基本數據類型的時候,這種方式相對比較慢。

Comparable和Comparator接口是幹什麼的?列出它們的區別。

Java提供了只包含一個compareTo()方法的Comparable接口。這個方法可以個給兩個對象排序。具體來說,它返回負數,0,正數來表明輸入對象小於,等於,大於已經存在的對象。
Java提供了包含compare()和equals()兩個方法的Comparator接口。compare()方法用來給兩個輸入參數排序,返回負數,0,正數表明第一個參數是小於,等於,大於第二個參數。equals()方法需要一個對象作爲參數,它用來決定輸入參數是否和comparator相等。只有當輸入參數也是一個comparator並且輸入參數和當前comparator的排序結果是相同的時候,這個方法才返回true。

什麼是Java優先級隊列(Priority Queue)?

PriorityQueue是一個基於優先級堆的無界隊列,它的元素是按照自然順序(natural order)排序的。在創建的時候,我們可以給它提供一個負責給元素排序的比較器。PriorityQueue不允許null值,因爲他們沒有自然順序,或者說他們沒有任何的相關聯的比較器。最後,PriorityQueue不是線程安全的,入隊和出隊的時間複雜度是O(log(n))。

Java集合類框架的最佳實踐有哪些?

根據應用的需要正確選擇要使用的集合的類型對性能非常重要,比如:假如元素的大小是固定的,而且能事先知道,我們就應該用Array而不是ArrayList。
有些集合類允許指定初始容量。因此,如果我們能估計出存儲的元素的數目,我們可以設置初始容量來避免重新計算hash值或者是擴容。
爲了類型安全,可讀性和健壯性的原因總是要使用泛型。同時,使用泛型還可以避免運行時的ClassCastException。
使用JDK提供的不變類(immutable class)作爲Map的鍵可以避免爲我們自己的類實現hashCode()和equals()方法。
編程的時候接口優於實現。
底層的集合實際上是空的情況下,返回長度是0的集合或者是數組,不要返回null。

HashSet和TreeSet有什麼區別?

HashSet是由一個hash表來實現的,因此,它的元素是無序的。add(),remove(),contains()方法的時間複雜度是O(1)。
另一方面,TreeSet是由一個樹形的結構來實現的,它裏面的元素是有序的。因此,add(),remove(),contains()方法的時間複雜度是O(logn)。

finalize()方法什麼時候被調用?析構函數(finalization)的目的是什麼?

垃圾回收器(garbage colector)決定回收某對象時,就會運行該對象的finalize()方法 但是在Java中很不幸,如果內存總是充足的,那麼垃圾回收可能永遠不會進行,也就是說filalize()可能永遠不被執行,顯然指望它做收尾工作是靠不住的。 那麼finalize()究竟是做什麼的呢?它最主要的用途是回收特殊渠道申請的內存。Java程序有垃圾回收器,所以一般情況下內存問題不用程序員操心。但有一種JNI(Java Native Interface)調用non-Java程序(C或C++),finalize()的工作就是回收這部分的內存。

Java堆的結構是什麼樣子的?什麼是堆中的永久代(Perm Gen space)?

JVM的堆是運行時數據區,所有類的實例和數組都是在堆上分配內存。它在JVM啓動的時候被創建。對象所佔的堆內存是由自動內存管理系統也就是垃圾收集器回收。
堆內存是由存活和死亡的對象組成的。存活的對象是應用可以訪問的,不會被垃圾回收。死亡的對象是應用不可訪問尚且還沒有被垃圾收集器回收掉的對象。一直到垃圾收集器把這些對象回收掉之前,他們會一直佔據堆內存空間。

Java中的兩種異常類型是什麼?他們有什麼區別?

Java中有兩種異常:受檢查的(checked)異常和不受檢查的(unchecked)異常。不受檢查的異常不需要在方法或者是構造函數上聲明,就算方法或者是構造函數的執行可能會拋出這樣的異常,並且不受檢查的異常可以傳播到方法或者是構造函數的外面。相反,受檢查的異常必須要用throws語句在方法或者是構造函數上聲明。這裏有Java異常處理的一些小建議。

throw和throws有什麼區別?

throw關鍵字用來在程序中明確的拋出異常,相反,throws語句用來表明方法不能處理的異常。每一個方法都必須要指定哪些異常不能處理,所以方法的調用者才能夠確保處理可能發生的異常,多個異常是用逗號分隔的。

異常處理完成以後,Exception對象會發生什麼變化?

Exception對象會在下一個垃圾回收過程中被回收掉。

finally代碼塊和finalize()方法有什麼區別?

無論是否拋出異常,finally代碼塊都會執行,它主要是用來釋放應用佔用的資源。finalize()方法是Object類的一個protected方法,它是在對象被垃圾回收之前由Java虛擬機來調用的。
Java小應用程序(Applet)

什麼是Applet? 解釋一下Applet的生命週期

java applet是能夠被包含在HTML頁面中並且能被啓用了java的客戶端瀏覽器執行的程序。Applet主要用來創建動態交互的web應用程序。

applet可以經歷下面的狀態:
Init:每次被載入的時候都會被初始化。
Start:開始執行applet。
Stop:結束執行applet。
Destroy:卸載applet之前,做最後的清理工作。

Applet和普通的Java應用程序有什麼區別?

applet是運行在啓用了java的瀏覽器中,Java應用程序是可以在瀏覽器之外運行的獨立的Java程序。但是,它們都需要有Java虛擬機。
進一步來說,Java應用程序需要一個有特定方法簽名的main函數來開始執行。Java applet不需要這樣的函數來開始執行。
最後,Java applet一般會使用很嚴格的安全策略,Java應用一般使用比較寬鬆的安全策略。

哪些Swing的方法是線程安全的?

只有3個線程安全的方法: repaint(), revalidate(), and invalidate()。

事件監聽器接口(event-listener interface)和事件適配器(event-adapter)有什麼關係?

事件監聽器接口定義了對特定的事件,事件處理器必須要實現的方法。事件適配器給事件監聽器接口提供了默認的實現。

什麼是JDBC?

JDBC是允許用戶在不同數據庫之間做選擇的一個抽象層。JDBC允許開發者用JAVA寫數據庫應用程序,而不需要關心底層特定數據庫的細節。

RMI體系結構分哪幾層?

RMI體系結構分以下幾層:
存根和骨架層(Stub and Skeleton layer):這一層對程序員是透明的,它主要負責攔截客戶端發出的方法調用請求,然後把請求重定向給遠程的RMI服務。
遠程引用層(Remote Reference Layer):RMI體系結構的第二層用來解析客戶端對服務端遠程對象的引用。這一層解析並管理客戶端對服務端遠程對象的引用。連接是點到點的。
傳輸層(Transport layer):這一層負責連接參與服務的兩個JVM。這一層是建立在網絡上機器間的TCP/IP連接之上的。它提供了基本的連接服務,還有一些防火牆穿透策略。

解釋下Servlet的生命週期。

對每一個客戶端的請求,Servlet引擎載入Servlet,調用它的init()方法,完成Servlet的初始化。然後,Servlet對象通過爲每一個請求單獨調用service()方法來處理所有隨後來自客戶端的請求,最後,調用Servlet(譯者注:這裏應該是Servlet而不是server)的destroy()方法把Servlet刪除掉。

doGet()方法和doPost()方法有什麼區別?

doGet:GET方法會把名值對追加在請求的URL後面。因爲URL對字符數目有限制,進而限制了用在客戶端請求的參數值的數目。並且請求中的參數值是可見的,因此,敏感信息不能用這種方式傳遞。

doPOST:POST方法通過把請求參數值放在請求體中來克服GET方法的限制,因此,可以發送的參數的數目是沒有限制的。最後,通過POST請求傳遞的敏感信息對外部客戶端是不可見的。

HTTP響應的結構是怎麼樣的?

HTTP響應由三個部分組成:

狀態碼(Status Code):描述了響應的狀態。可以用來檢查是否成功的完成了請求。請求失敗的情況下,狀態碼可用來找出失敗的原因。如果Servlet沒有返回狀態碼,默認會返回成功的狀態碼HttpServletResponse.SC_OK。

HTTP頭部(HTTP Header):它們包含了更多關於響應的信息。比如:頭部可以指定認爲響應過期的過期日期,或者是指定用來給用戶安全的傳輸實體內容的編碼格式。如何在Serlet中檢索HTTP的頭部看這裏。

主體(Body):它包含了響應的內容。它可以包含HTML代碼,圖片,等等。主體是由傳輸在HTTP消息中緊跟在頭部後面的數據字節組成的。

多態的定義?

多態是編程語言給不同的底層數據類型做相同的接口展示的一種能力。一個多態類型上的操作可以應用到其他類型的值上面。

繼承的定義?

繼承給對象提供了從基類獲取字段和方法的能力。繼承提供了代碼的重用行,也可以在不修改類的情況下給現存的類添加新特性。

抽象的定義?抽象和封裝的不同點?

抽象是把想法從具體的實例中分離出來的步驟,因此,要根據他們的功能而不是實現細節來創建類。Java支持創建只暴漏接口而不包含方法實現的抽象的類。這種抽象技術的主要目的是把類的行爲和實現細節分離開。

抽象和封裝是互補的概念。一方面,抽象關注對象的行爲。另一方面,封裝關注對象行爲的細節。一般是通過隱藏對象內部狀態信息做到封裝,因此,封裝可以看成是用來提供抽象的一種策略。

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