- Java面試的面試題目與解題思路 推薦度:
- java中高級筆試面試題及答案 推薦度:
- 相關(guān)推薦
java面試題2014
Java面試題2014
1.C++或Java中的異常處理機制的簡(jiǎn)單原理和應用。
當JAVA程序違反了JAVA的語(yǔ)義規則時(shí),JAVA虛擬機就會(huì )將發(fā)生的錯誤表示為一個(gè)異常。違反語(yǔ)義規則包括2種情況。一種是JAVA類(lèi)庫內置的語(yǔ)義檢查。例如數組下標越界,會(huì )引發(fā)IndexOutOfBoundsException;訪(fǎng)問(wèn)null的對象時(shí)會(huì )引發(fā)NullPointerException。另一種情況就是JAVA允許程序員擴展這種語(yǔ)義檢查,程序員可以創(chuàng )建自己的異常,并自由選擇在何時(shí)用throw關(guān)鍵字引發(fā)異常。所有的異常都是java.lang.Thowable的子類(lèi)。
2. Java的接口和C++的虛類(lèi)的相同和不同處。
由于Java不支持多繼承,而有可能某個(gè)類(lèi)或對象要使用分別在幾個(gè)類(lèi)或對象里面的方法或屬性,現有的單繼承機制就不能滿(mǎn)足要求。與繼承相比,接口有更高的靈活性,因為接口中沒(méi)有任何實(shí)現代碼。當一個(gè)類(lèi)實(shí)現了接口以后,該類(lèi)要實(shí)現接口里面所有的方法和屬性,并且接口里面的屬性在默認狀態(tài)下面都是public static,所有方法默認情況下是public.一個(gè)類(lèi)可以實(shí)現多個(gè)接口。
3. 垃圾回收的優(yōu)點(diǎn)和原理。并考慮2種回收機制。
Java語(yǔ)言中一個(gè)顯著(zhù)的特點(diǎn)就是引入了垃圾回收機制,使c++程序員最頭疼的內存管理的問(wèn)題迎刃而解,它使得Java程序員在編寫(xiě)程序的時(shí)候不再需要考慮內存管理。由于有個(gè)垃圾回收機制,Java中的對象不再有“作用域”的概念,只有對象的引用才有“作用域”。垃圾回收可以有效的防止內存泄露,有效的使用可以使用的內存。垃圾回收器通常是作為一個(gè)單獨的低級別的線(xiàn)程運行,不可預知的情況下對內存堆中已經(jīng)死亡的或者長(cháng)時(shí)間沒(méi)有使用的對象進(jìn)行清楚和回收,程序員不能實(shí)時(shí)的調用垃圾回收器對某個(gè)對象或所有對象進(jìn)行垃圾回收;厥諜C制有分代復制垃圾回收和標記垃圾回收,增量垃圾回收。
4. 請說(shuō)出你所知道的線(xiàn)程同步的方法。
wait():使一個(gè)線(xiàn)程處于等待狀態(tài),并且釋放所持有的對象的lock。
sleep():使一個(gè)正在運行的線(xiàn)程處于睡眠狀態(tài),是一個(gè)靜態(tài)方法,調用此方法要捕捉InterruptedException異常。
notify():喚醒一個(gè)處于等待狀態(tài)的線(xiàn)程,注意的是在調用此方法的時(shí)候,并不能確切的喚醒某一個(gè)等待狀態(tài)的線(xiàn)程,而是由JVM確定喚醒哪個(gè)線(xiàn)程,而且不是按優(yōu)先級。
Allnotity():喚醒所有處入等待狀態(tài)的線(xiàn)程,注意并不是給所有喚醒線(xiàn)程一個(gè)對象的鎖,而是讓它們競爭。
5. 請講一講析構函數和虛函數的用法和作用。
6. Error與Exception有什么區別?
Error表示系統級的錯誤和程序不必處理的異常,
Exception表示需要捕捉或者需要程序進(jìn)行處理的異常。
7. 在java中一個(gè)類(lèi)被聲明為final類(lèi)型,表示了什么意思?
表示該類(lèi)不能被繼承,是頂級類(lèi)。
8. 描述一下你最常用的編程風(fēng)格。
9. heap和stack有什么區別。
棧是一種線(xiàn)形集合,其添加和刪除元素的操作應在同一段完成。棧按照后進(jìn)先出的方式進(jìn)行處理。
堆是棧的一個(gè)組成元素
10. 如果系統要使用超大整數(超過(guò)long長(cháng)度范圍),請你設計一個(gè)數據結構來(lái)存儲這種超大型數字以及設計一種算法來(lái)實(shí)現超大整數加法運算)。
public class BigInt()
{
int[] ArrOne = new ArrOne[1000];
String intString="";
public int[] Arr(String s)
{
intString = s;
for(int i=0;i
{
11. 如果要設計一個(gè)圖形系統,請你設計基本的圖形元件(Point,Line,Rectangle,Triangle)的簡(jiǎn)單實(shí)現
第一,談?wù)刦inal, finally, finalize的區別。
final 用于聲明屬性,方法和類(lèi),分別表示屬性不可變,方法不可覆蓋,類(lèi)不可繼承。finally是異常處理語(yǔ)句結構的一部分,表示總是執行。finalize是 Object類(lèi)的一個(gè)方法,在垃圾收集器執行的時(shí)候會(huì )調用被回收對象的此方法,可以覆蓋此方法提供垃圾收集時(shí)的其他資源回收,例如關(guān)閉文件等。
第二,Anonymous Inner Class (匿名內部類(lèi)) 是否可以extends(繼承)其它類(lèi),是否可以implements(實(shí)現)interface(接口)?
可以繼承其他類(lèi)或完成其他接口,在swing編程中常用此方式。
第三,Static Nested Class 和 Inner Class的不同,說(shuō)得越多越好(面試題有的很籠統)。
Static Nested Class是被聲明為靜態(tài)(static)的內部類(lèi),它可以不依賴(lài)于外部類(lèi)實(shí)例被實(shí)例化。而通常的內部類(lèi)需要在外部類(lèi)實(shí)例化后才能實(shí)例化。
第四,&和&&的區別。
&是位運算符,表示按位與運算,&&是邏輯運算符,表示邏輯與(and).
第五,HashMap和Hashtable的區別。
HashMap是Hashtable的輕量級實(shí)現(非線(xiàn)程 安全 的實(shí)現),他們都完成了Map接口,主要區別在于HashMap允許空(null)鍵值(key),由于非線(xiàn)程 安全 ,效率上可能高于Hashtable.
第六,Collection 和 Collections的區別。
Collection是集合類(lèi)的上級接口,繼承與他的接口主要有Set 和List.Collections是針對集合類(lèi)的一個(gè)幫助類(lèi),他提供一系列靜態(tài)方法實(shí)現對各種集合的搜索、排序、線(xiàn)程安全化等操作。
第七,什么時(shí)候用assert。
1.4新增關(guān)鍵字(語(yǔ)法),用于測試boolean表達式狀態(tài),可用于調試程序。使用方法 assert ,表示如果表達式為真(true),則下面的語(yǔ)句執行,否則拋出AssertionError。另外的使用方式assert < boolean表達式>:,表示如果表達式為真,后面的表達式忽略,否則后面表達式的值用于A(yíng)ssertionError的構建參數。注意編譯時(shí)要增加-source 1.4 參數,否則報錯。]運行時(shí)要增加 –ea參數,否則assert行被忽略
第八,GC是什么? 為什么要有GC?
GC是垃圾收集的意思(Gabage Collection),內存處理是編程人員容易出現問(wèn)題的地方,忘記或者錯誤的內存回收會(huì )導致程序或系統的不穩定甚至崩潰, Java 提供的GC功能可以 自動(dòng)監測對象是否超過(guò)作用域從而達到自動(dòng)回收內存的目的, Java 語(yǔ)言沒(méi)有提供釋放已分配內存的顯示操作方法。
第九,String s = new String("xyz");創(chuàng )建了幾個(gè)String Object?
兩個(gè)
第十,Math.round(11.5)等於多少? Math.round(-11.5)等於多少?
Math.round(11.5)==12Math.round(-11.5)==-11round方法返回與參數最接近的長(cháng)整數,參數加1/2后求其floor.
第十一,short s1 = 1; s1 = s1 + 1;有什么錯? short s1 = 1; s1 += 1;有什么錯?
short s1 = 1; s1 = s1 + 1; (s1+1運算結果是int型,需要強制轉換類(lèi)型)short s1 = 1; s1 += 1;(可以正確編譯)
第十二,sleep() 和 wait() 有什么區別?
sleep是線(xiàn)程類(lèi)(Thread)的方法,導致此線(xiàn)程暫停執行指定時(shí)間,給執行機會(huì )給其他線(xiàn)程,但是監控狀態(tài)依然保持,到時(shí)后會(huì )自動(dòng)恢復。調用 sleep不會(huì )釋放對象鎖。wait是Object類(lèi)的方法,對此對象調用wait方法導致本線(xiàn)程放棄對象鎖,進(jìn)入等待此對象的等待鎖定池,只有針對此對 象發(fā)出notify方法(或notifyAll)后本線(xiàn)程才進(jìn)入對象鎖定池準備獲得對象鎖進(jìn)入運行狀態(tài)。
第十三、
多線(xiàn)程是為了同步完成多項任務(wù),不是為了提供運行效率,通過(guò)提高資源使用效率來(lái)提高系統的效率. 線(xiàn)程是在同一時(shí)間需要完成多項任務(wù)的時(shí)候實(shí)現的.
可以完成同時(shí)運行,但是通過(guò)程序運行的結果發(fā)現,雖然同時(shí)運行,但是每一次結果都不一致。
因為多線(xiàn)程存在一個(gè)特性:隨機性。
造成的原因:CPU在瞬間不斷切換去處理各個(gè)線(xiàn)程而導致的。
可以理解成多個(gè)線(xiàn)程在搶cpu資源。
2、 線(xiàn)程與進(jìn)程的比較
線(xiàn)程具有許多傳統進(jìn)程所具有的特征,故又稱(chēng)為輕型進(jìn)程(Light—Weight Process)或進(jìn)程元;
而把傳統的進(jìn)程稱(chēng)為重型進(jìn)程(Heavy—Weight Process),它相當于只有一個(gè)線(xiàn)程的任務(wù)。在引入了線(xiàn)程的操作系統中,通常一個(gè)進(jìn)程都有若干個(gè)線(xiàn)程,至少需要一個(gè)線(xiàn)程。
進(jìn)程與線(xiàn)程的區別:
1.進(jìn)程有獨立的進(jìn)程空間,進(jìn)程中的數據存放空間(堆空間和?臻g)是獨立的。
2.線(xiàn)程的堆空間是共享的,?臻g是獨立的,線(xiàn)程消耗的資源也比進(jìn)程小,相互之間可以影響的
第十三,Java有沒(méi)有g(shù)oto?
沒(méi)有 很十三的問(wèn)題,如果哪個(gè)面試的問(wèn)到這個(gè)問(wèn)題,我勸你還是別進(jìn)這家公司。
第十四,數組有沒(méi)有length()這個(gè)方法? String有沒(méi)有length()這個(gè)方法?
數組沒(méi)有length()這個(gè)方法,有length的屬性。
String有有length()這個(gè)方法。
第十五,Overload和Override的區別。Overloaded的方法是否可以改變返回值的類(lèi)型?
方法的重寫(xiě)Overriding和重載Overloading是Java多態(tài)性的不同表現。重寫(xiě)Overriding是父類(lèi)與子類(lèi)之間多態(tài)性的一種表現, 重載Overloading是一個(gè)類(lèi)中多態(tài)性的一種表現。如果在子類(lèi)中定義某方法與其父類(lèi)有相同的名稱(chēng)和參數,我們說(shuō)該方法被重寫(xiě) (Overriding)。子類(lèi)的對象使用這個(gè)方法時(shí),將調用子類(lèi)中的定義,對它而言,父類(lèi)中的定義如同被“屏蔽”了。如果在一個(gè)類(lèi)中定義了多個(gè)同名的方 法,它們或有不同的參數個(gè)數或有不同的參數類(lèi)型,則稱(chēng)為方法的重載(Overloading)。Overloaded的方法是可以改變返回值的類(lèi)型。
第十六,Set里的元素是不能重復的,那么用什么方法來(lái)區分重復與否呢? 是用==還是equals()? 它們有何區別?
Set里的元素是不能重復的,那么用iterator()方法來(lái)區分重復與否。equals()是判讀兩個(gè)Set是否相等。
equals()和==方法決定引用值是否指向同一對象equals()在類(lèi)中被覆蓋,為的是當兩個(gè)分離的對象的內容和類(lèi)型相配的話(huà),返回真值。
第十七,給我一個(gè)你最常見(jiàn)到的runtime exception。
參考如下:
ArithmeticException,
ArrayStoreException,
BufferOverflowException,
BufferUnderflowException,
CannotRedoException,
CannotUndoException,
ClassCastException,
CMMException,
ConcurrentModificationException,
DOMException,
EmptyStackException,
IllegalArgumentException,
IllegalMonitorStateException,
IllegalPathStateException,
IllegalStateException,
ImagingOpException,
IndexOutOfBoundsException,
MissingResourceException,
NegativeArraySizeException,
NoSuchElementException,
NullPointerException,
ProfileDataException,
ProviderException,
RasterFormatException,
SecurityException,
SystemException,
UndeclaredThrowableException,
UnmodifiableSetException,
UnsupportedOperationException
第十八,error和exception有什么區別?
error 表示恢復不是不可能但很困難的情況下的一種嚴重問(wèn)題。比如說(shuō)內存溢出。不可能指望程序能處理這樣的情況。
exception 表示一種設計或實(shí)現問(wèn)題。也就是說(shuō),它表示如果程序運行正常,從不會(huì )發(fā)生的情況。
第十九,List, Set, Map是否繼承自Collection接口?
List,Set是
Map不是
第二十,abstract class和interface有什么區別?
聲明方法的存在而不去實(shí)現它的類(lèi)被叫做抽象類(lèi)(abstract class),它用于要創(chuàng )建一個(gè)體現某些基本行為的類(lèi),并為該類(lèi)聲明方法,但不能在該類(lèi)中實(shí)現該類(lèi)的情況。不能創(chuàng )建abstract 類(lèi)的實(shí)例。然而可以創(chuàng )建一個(gè)變量,其類(lèi)型是一個(gè)抽象類(lèi),并讓它指向具體子類(lèi)的一個(gè)實(shí)例。不能有抽象構造函數或抽象靜態(tài)方法。Abstract 類(lèi)的子類(lèi)為它們父類(lèi)中的所有抽象方法提供實(shí)現,否則它們也是抽象類(lèi)為。取而代之,在子類(lèi)中實(shí)現該方法。知道其行為的其它類(lèi)可以在類(lèi)中實(shí)現這些方法。
接口(interface)是抽象類(lèi)的變體。在接口中,所有方法都是抽象的。多繼承性可通過(guò)實(shí)現這樣的接口而獲得。接口中的所有方法都是抽象的,沒(méi)有一個(gè) 有程序體。接口只可以定義static final成員變量。接口的實(shí)現與子類(lèi)相似,除了該實(shí)現類(lèi)不能從接口定義中繼承行為。當類(lèi)實(shí)現特殊接口時(shí),它定義(即將程序體給予)所有這種接口的方法。 然后,它可以在實(shí)現了該接口的類(lèi)的任何對象上調用接口的方法。由于有抽象類(lèi),它允許使用接口名作為引用變量的類(lèi)型。通常的動(dòng)態(tài)聯(lián)編將生效。引用可以轉換到 接口類(lèi)型或從接口類(lèi)型轉換,instanceof 運算符可以用來(lái)決定某對象的類(lèi)是否實(shí)現了接口。
第二十一,abstract的method是否可同時(shí)是static,是否可同時(shí)是native,是否可同時(shí)是synchronized?
都不能
第二十二,接口是否可繼承接口? 抽象類(lèi)是否可實(shí)現(implements)接口? 抽象類(lèi)是否可繼承實(shí)體類(lèi)(concrete class)?
接口可以繼承接口。抽象類(lèi)可以實(shí)現(implements)接口,抽象類(lèi)是否可繼承實(shí)體類(lèi),但前提是實(shí)體類(lèi)必須有明確的構造函數。
第二十三,啟動(dòng)一個(gè)線(xiàn)程是用run()還是start()?
啟動(dòng)一個(gè)線(xiàn)程是調用start()方法,使線(xiàn)程所代表的虛擬處理機處于可運行狀態(tài),這意味著(zhù)它可以由JVM調度并執行。這并不意味著(zhù)線(xiàn)程就會(huì )立即運行。run()方法可以產(chǎn)生必須退出的標志來(lái)停止一個(gè)線(xiàn)程。
第二十四,構造器Constructor是否可被override?
構造器Constructor不能被繼承,因此不能重寫(xiě)Overriding,但可以被重載Overloading。
第二十五,是否可以繼承String類(lèi)?
String類(lèi)是final類(lèi)故不可以繼承。
第二十六,當一個(gè)線(xiàn)程進(jìn)入一個(gè)對象的一個(gè)synchronized方法后,其它線(xiàn)程是否可進(jìn)入此對象的其它方法?
不能,一個(gè)對象的一個(gè)synchronized方法只能由一個(gè)線(xiàn)程訪(fǎng)問(wèn)。
第二十七,try {}里有一個(gè)return語(yǔ)句,那么緊跟在這個(gè)try后的finally {}里的code會(huì )不會(huì )被執行,什么時(shí)候被執行,在return前還是后?
會(huì )執行,在return前執行。
第二十八,編程題: 用最有效率的方法算出2乘以8等於幾?
有C背景的程序員特別喜歡問(wèn)這種問(wèn)題。
2 << 3
第二十九,兩個(gè)對象值相同(x.equals(y) == true),但卻可有不同的hash code,這句話(huà)對不對?
不對,有相同的hash code。
第三十,當一個(gè)對象被當作參數傳遞到一個(gè)方法后,此方法可改變這個(gè)對象的屬性,并可返回變化后的結果,那么這里到底是值傳遞還是引用傳遞?
是值傳遞。Java 編程語(yǔ)言只由值傳遞參數。當一個(gè)對象實(shí)例作為一個(gè)參數被傳遞到方法中時(shí),參數的值就是對該對象的引用。對象的內容可以在被調用的方法中改變,但對象的引用是永遠不會(huì )改變的。
第三十一,swtich是否能作用在byte上,是否能作用在long上,是否能作用在String上?
switch(expr1)中,expr1是一個(gè)整數表達式。因此傳遞給 switch 和 case 語(yǔ)句的參數應該是 int、 short、 char 或者 byte。long,string 都不能作用于swtich。
第三十二,編程題: 寫(xiě)一個(gè)Singleton出來(lái)。
Singleton模式主要作用是保證在Java應用程序中,一個(gè)類(lèi)Class只有一個(gè)實(shí)例存在。
一般Singleton模式通常有幾種種形式:
第一種形式: 定義一個(gè)類(lèi),它的構造函數為private的,它有一個(gè)static的private的該類(lèi)變量,在類(lèi)初始化時(shí)實(shí)例話(huà),通過(guò)一個(gè)public的getInstance方法獲取對它的引用,繼而調用其中的方法。
public class Singleton {
private Singleton(){}
//在自己內部定義自己一個(gè)實(shí)例,是不是很奇怪?
//注意這是private 只供內部調用
private static Singleton instance = new Singleton();
//這里提供了一個(gè)供外部訪(fǎng)問(wèn)本class的靜態(tài)方法,可以直接訪(fǎng)問(wèn)
public static Singleton getInstance() {
return instance;
}
}
第二種形式:
public class Singleton {
private static Singleton instance = null;
public static synchronized Singleton getInstance() {
//這個(gè)方法比上面有所改進(jìn),不用每次都進(jìn)行生成對象,只是第一次
//使用時(shí)生成實(shí)例,提高了效率!
if (instance==null)
instance=new Singleton();
return instance; }
}
其他形式:
定義一個(gè)類(lèi),它的構造函數為private的,所有方法為static的。
一般認為第一種形式要更加安全些
【java面試題】相關(guān)文章:
2017年java中高級筆試面試題及答案11-11
面試題精選02-18
分享面試題目 教育職業(yè)面試題11-20
熱門(mén)就業(yè)行業(yè)面試題精選:編輯行業(yè)面試題!11-19
Microsoft 面試題11-19
蘋(píng)果 面試題11-19
熱門(mén)就業(yè)行業(yè)面試題精選 銷(xiāo)售行業(yè)面試題11-20
java面試的經(jīng)驗11-20
java面試的測試11-20