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