39道高级java面试题及答案(最新)
?
Java軟件工程師作為在軟件編程語言中使用非常廣泛的軟件編程語言之一,受歡迎程度也是非常高的,在軟件人才的需求方面同樣是數量巨大,現在軟件公司的java軟件開發工程師的職位空缺也是非常大的。當然軟件公司在招收開發人員時都是會對本人進行一定的了解的,因此啊面試環節是絕對不能少的,那么今年最新的高級java面試題都有哪些呢?下面就隨動力節點java培訓機構一起來了解一下。
?
?
1.隊列和棧是什么,列出它們的區別?
?
棧和隊列兩者都被用來預存儲數據。java.util.Queue是一個接口,它的實現類在Java并發包中。隊列允許先進先出(FIFO)檢索元素,但并非總是這樣。Deque接口允許從兩端檢索元素。
?
棧與隊列很相似,但它允許對元素進行后進先出(LIFO)進行檢索。
?
Stack是一個擴展自Vector的類,而Queue是一個接口。
?
?
2.Collections類是什么?
?
Java.util.Collections是一個工具類僅包含靜態方法,它們操作或返回集合。它包含操作集合的多態算法,返回一個由指定集合支持的新集合和其它一些內容。這個類包含集合框架算法的方法,比如折半搜索、排序、混編和逆序等。
?
?
3.Comparable和Comparator接口是什么?
?
如果我們想使用Array或Collection的排序方法時,需要在自定義類里實現Java提供Comparable接口。Comparable接口有compareTo(T OBJ)方法,它被排序方法所使用。我們應該重寫這個方法,如果“this”對象比傳遞的對象參數更小、相等或更大時,它返回一個負整數、0或正整數。但是,在大多數實際情況下,我們想根據不同參數進行排序。比如,作為一個CEO,我想對雇員基于薪資進行排序,一個HR想基于年齡對他們進行排序。這就是我們需要使用Comparator接口的情景,因為Comparable.compareTo(Object o)方法實現只能基于一個字段進行排序,我們不能根據對象排序的需要選擇字段。Comparator接口的compare(Object o1, Object o2)方法的實現需要傳遞兩個對象參數,若第一個參數比第二個小,返回負整數;若第一個等于第二個,返回0;若第一個比第二個大,返回正整數。
?
?
4.Comparable和Comparator接口有何區別?
?
Comparable和Comparator接口被用來對對象集合或者數組進行排序。Comparable接口被用來提供對象的自然排序,我們可以使用它來提供基于單個邏輯的排序。
?
Comparator接口被用來提供不同的排序算法,我們可以選擇需要使用的Comparator來對給定的對象集合進行排序。
?
?
5.我們如何對一組對象進行排序?
?
如果我們需要對一個對象數組進行排序,我們可以使用Arrays.sort()方法。如果我們需要排序一個對象列表,我們可以使用Collection.sort()方法。兩個類都有用于自然排序(使用Comparable)或基于標準的排序(使用Comparator)的重載方法sort()。Collections內部使用數組排序方法,所有它們兩者都有相同的性能,只是Collections需要花時間將列表轉換為數組。
?
?
6.當一個集合被作為參數傳遞給一個函數時,如何才可以確保函數不能修改它?
?
在作為參數傳遞之前,我們可以使用Collections.unmodifiableCollection(Collection c)方法創建一個只讀集合,這將確保改變集合的任何操作都會拋出UnsupportedOperationException。
?
?
7.我們如何從給定集合那里創建一個synchronized的集合?
?
我們可以使用Collections.synchronizedCollection(Collection c)根據指定集合來獲取一個synchronized(線程安全的)集合。
?
?
8.集合框架里實現的通用算法有哪些?
?
Java集合框架提供常用的算法實現,比如排序和搜索。Collections類包含這些方法實現。大部分算法是操作List的,但一部分對所有類型的集合都是可用的。部分算法有排序、搜索、混編、最大最小值。
?
?
9.大寫的O是什么?舉幾個例子?
?
大寫的O描述的是,就數據結構中的一系列元素而言,一個算法的性能。Collection類就是實際的數據結構,我們通常基于時間、內存和性能,使用大寫的O來選擇集合實現。比如:例子1:ArrayList的get(index i)是一個常量時間操作,它不依賴list中元素的數量。所以它的性能是O(1)。例子2:一個對于數組或列表的線性搜索的性能是O(n),因為我們需要遍歷所有的元素來查找需要的元素。
?
?
10.與Java集合框架相關的有哪些最好的實踐?
?
(1)根據需要選擇正確的集合類型。比如,如果指定了大小,我們會選用Array而非ArrayList。如果我們想根據插入順序遍歷一個Map,我們需要使用TreeMap。如果我們不想重復,我們應該使用Set。
?
(2)一些集合類允許指定初始容量,所以如果我們能夠估計到存儲元素的數量,我們可以使用它,就避免了重新哈希或大小調整。
?
(3)基于接口編程,而非基于實現編程,它允許我們后來輕易地改變實現。
?
(4)總是使用類型安全的泛型,避免在運行時出現ClassCastException。
?
(5)使用JDK提供的不可變類作為Map的key,可以避免自己實現hashCode()和equals()。
?
(6)盡可能使用Collections工具類,或者獲取只讀、同步或空的集合,而非編寫自己的實現。它將會提供代碼重用性,它有著更好的穩定性和可維護性。
?
?
11. 什么時候使用斷言?
?
斷言不應該用于驗證輸入數據到一個public方法或命令行參數。IllegalArgumentException會是一個更好的選擇。在public方法中,只用斷言來檢查它們根本不應該發生的情況。
?
?
12. 什么是垃圾回收?
?
垃圾回收是Java中自動內存管理的另一種叫法。垃圾回收的目的是為程序保持盡可能多的可用堆(heap)。 JVM會刪除堆上不再需要從堆引用的對象。
?
?
13. 用一個例子解釋垃圾回收?
?
比方說,下面這個方法就會從函數調用。
?
void method(){
?
Calendar calendar = new GregorianCalendar(2000,10,30);
?
System.out.println(calendar);
?
}
?
通過函數第一行代碼中參考變量calendar,在堆上創建了GregorianCalendar類的一個對象。
?
函數結束執行后,引用變量calendar不再有效。因此,在方法中沒有創建引用到對象。
?
JVM認識到這一點,會從堆中刪除對象。這就是所謂的垃圾回收。
?
?
14. 什么時候運行垃圾回收?
?
垃圾回收在JVM突發奇想和心血來潮時運行(沒有那么糟糕)。運行垃圾收集的可能情況是:
?
堆可用內存不足
?
CPU空閑
?
?
15. 垃圾回收的最佳做法?
?
用編程的方式,我們可以要求(記住這只是一個請求——不是一個命令)JVM通過調用System.gc()方法來運行垃圾回收。
?
當內存已滿,且堆上沒有對象可用于垃圾回收時,JVM可能會拋出OutOfMemoryException。
?
對象在被垃圾回收從堆上刪除之前,會運行finalize()方法。我們建議不要用finalize()方法寫任何代碼。
?
?
16. 什么是初始化數據塊?
?
初始化數據塊——當創建對象或加載類時運行的代碼。
?
有兩種類型的初始化數據塊:
?
靜態初始化器:加載類時運行的的代碼
?
實例初始化器:創建新對象時運行的代碼
?
?
17、面向對象的特征有哪些方面
?
①抽象:
?
抽象是忽略一個主題中與當前目標無關的那些方面,以便更充分地注意與當前目標有關的方面。抽象并不打算了解全部問題,而只是選擇其中的一部分,暫時不用部分細節。抽象包括兩個方面,一是過程抽象,二是數據抽象。
?
②繼承:
?
繼承是一種聯結類的層次模型,并且允許和鼓勵類的重用,它提供了一種明確表述共性的方法。對象的一個新類可以從現有的類中派生,這個過程稱為類繼承。新類繼承了原始類的特性,新類稱為原始類的派生類(子類),而原始類稱為新類的基類(父類)。派生類可以從它的基類那里繼承方法和實例變量,并且類可以修改或增加新的方法使之更適合特殊的需要。
?
③封裝:
?
封裝是把過程和數據包圍起來,對數據的訪問只能通過已定義的界面。面向對象計算始于這個基本概念,即現實世界可以被描繪成一系列完全自治、封裝的對象,這些對象通過一個受保護的接口訪問其他對象。
?
④多態性:
?
多態性是指允許不同類的對象對同一消息作出響應。多態性包括參數化多態性和包含多態性。多態性語言具有靈活、抽象、行為共享、代碼共享的優勢,很好的解決了應用程序函數同名問題。
?
?
18、String是最基本的數據類型嗎?
?
基本數據類型包括byte、int、char、long、float、double、boolean和short。
?
java.lang.String類是final類型的,因此不可以繼承這個類、不能修改這個類。為了提高效率節省空間,我們應該用StringBuffer類
?
?
19、int 和 Integer 有什么區別?
?
Java 提供兩種不同的類型:引用類型和原始類型(或內置類型)。Int是java的原始數據類型,Integer是java為int提供的封裝類。
?
?
20、String 和StringBuffer的區別?
?
JAVA平臺提供了兩個類:String和StringBuffer,它們可以儲存和操作字符串,即包含多個字符的字符數據。這個String類提供了數值不可改變的字符串。而這個StringBuffer類提供的字符串進行修改。當你知道字符數據要改變的時候你可以使用StringBuffer。典型地,你可以使用StringBuffers來動態構造字符數據。
?
?
21、運行時異常與一般異常有何異同?
?
異常表示程序運行過程中可能出現的非正常狀態,運行時異常表示虛擬機的通常操作中可能遇到的異常,是一種常見運行錯誤。java編譯器要求方法必須聲明拋出可能發生的非運行時異常,但是并不要求必須聲明拋出未被捕獲的運行時異常。
?
?
22、說出Servlet的生命周期,并說出Servlet和CGI的區別?
?
Servlet被服務器實例化后,容器運行其init方法,請求到達時運行其service方法,service方法自動派遣運行與請求對應的doXXX方法(doGet,doPost)等,當服務器決定將實例銷毀的時候調用其destroy方法。
?
與cgi的區別在于servlet處于服務器進程中,它通過多線程方式運行其service方法,一個實例可以服務于多個請求,并且其實例一般不會銷毀,而CGI對每個請求都產生新的進程,服務完成后銷毀,所以效率上低于servlet。
?
?
23、說出ArrayList,Vector, LinkedList的存儲性能和特性
?
ArrayList和Vector都是使用數組方式存儲數據,此數組元素數大于實際存儲的數據以便增加和插入元素,它們都允許直接按序號索引元素,但是插入元素要涉及數組元素移動等內存操作,所以索引數據快而插入數據慢,Vector由于使用了synchronized方法(線程安全),通常性能上較ArrayList差,而LinkedList使用雙向鏈表實現存儲,按序號索引數據需要進行前向或后向遍歷,但是插入數據時只需要記錄本項的前后項即可,所以插入速度較快。
?
?
24、EJB是基于哪些技術實現的?
?
EJB包括Session Bean、Entity Bean、Message Driven Bean,基于JNDI、RMI、JAT等技術實現。
?
SessionBean在J2EE應用程序中被用來完成一些服務器端的業務操作,例如訪問數據庫、調用其他EJB組件。EntityBean被用來代表應用系統中用到的數據。
?
對于客戶機,SessionBean是一種非持久性對象,它實現某些在服務器上運行的業務邏輯。
?
對于客戶機,EntityBean是一種持久性對象,它代表一個存儲在持久性存儲器中的實體的對象視圖,或是一個由現有企業應用程序實現的實體。
?
Session Bean 還可以再細分為 Stateful Session Bean 與 Stateless Session Bean ,這兩種的 Session Bean都可以將系統邏輯放在 method之中執行,不同的是 Stateful Session Bean 可以記錄呼叫者的狀態,因此通常來說,一個使用者會有一個相對應的 Stateful Session Bean 的實體。
?
?
25、Collection 和 Collections的區別?
?
Collection是集合類的上級接口,繼承與他的接口主要有Set 和List.
?
Collections是針對集合類的一個幫助類,他提供一系列靜態方法實現對各種集合的搜索、排序、線程安全化等操作。
?
?
26、&和&&的區別?
?
&是位運算符,表示按位與運算,&&是邏輯運算符,表示邏輯與(and)。
?
?
27.Java是從()語言改進重新設計。?
?
A.Ada?
?
B.C++?
?
C.Pasacal?
?
D.BASIC?
?
答案:B
?
?
28.下列語句哪一個正確()
?
A. Java程序經編譯后會產生machine code?
?
B.Java程序經編譯后會產生byte code?
?
C.Java程序經編譯后會產生DLL?
?
D.以上都不正確
?
答案:B
?
?
?
29.下列說法正確的有()
?
A.class中的constructor不可省略
?
B. constructor必須與class同名,但方法不能與class同名?
?
C.constructor在一個對象被new時執行?
?
D.一個class只能定義一個constructor?
?
答案:C
?
?
30.提供Java存取數據庫能力的包是()?
?
A.java.sql?
?
B.java.awt?
?
C.java.lang?
?
D.java.swing?
?
答案:A
?
?
31.下列運算符合法的是()?
?
A.&&?
?
B.<>?
?
C.if?
?
D.:=?
?
答案:A
?
?
32.執行如下程序代碼 a=0;c=0; do{ --c; a=a-1;
?
}while(a>0);
?
后,C的值是()?
?
A.0?
?
B.1
?
C.-1
?
D.死循環
?
答案:C
?
?
33.下列哪一種敘述是正確的()
?
A.abstract修飾符可修飾字段、方法和類
?
B.抽象方法的body部分必須用一對大括號{}包住?
?
C.聲明抽象方法,大括號可有可無?
?
D.聲明抽象方法不可寫出大括號?
?
答案:D
?
?
34.下列語句正確的是()
?
A.形式參數可被視為localvariable?
?
B.形式參數可被字段修飾符修飾
?
C.形式參數為方法被調用時,真正被傳遞的參數?
?
D.形式參數不可以是對象?
?
答案:A
?
?
35.下列哪種說法是正確的()
?
A.實例方法可直接調用超類的實例方法?
?
B.實例方法可直接調用超類的類方法?
?
C.實例方法可直接調用其他類的實例方法?
?
D.實例方法可直接調用本類的類方法
?
答案:D
?
?
36.下列說法正確的有()
?
A.環境變量可在編譯sourcecode時指定
?
B.在編譯程序時,所能指定的環境變量不包括class path?
?
C.javac一次可同時編譯數個Java源文件
?
D.javac.exe能指定編譯結果要置于哪個目錄(directory)?
?
答案:BCD
?
?
37.下列標識符不合法的有()?
?
A.new
?
B.$Usdollars?
?
C.1234?
?
D.car.taxi?
?
答案:ACD
?
?
38.下列說法錯誤的有()?
?
A.數組是一種對象
?
B.數組屬于一種原生類
?
C.intnumber=[]={31,23,33,43,35,63}?
?
D.數組的大小可以任意改變
?
答案:BCD
?
?
39.不能用來修飾interface的有()
?
A.private?
?
B.public?
?
C.protected?
?
D.static?
?
答案:ACD
?
?
以上就是動力節點java培訓機構小編分享的“39道高級java面試題及答案”的內容,希望對大家有幫助,更多java面試題請繼續關注動力節點java培訓機構官網,每天會精彩內容分享與你。
總結
以上是生活随笔為你收集整理的39道高级java面试题及答案(最新)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 开展Java的学习方向,看最新Java视
- 下一篇: 小白自学Java框架,框架的全面解析总结