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