這76道Java面試題及答案祝你能成功通過面試_第1頁
這76道Java面試題及答案祝你能成功通過面試_第2頁
這76道Java面試題及答案祝你能成功通過面試_第3頁
這76道Java面試題及答案祝你能成功通過面試_第4頁
這76道Java面試題及答案祝你能成功通過面試_第5頁
已閱讀5頁,還剩14頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

這76道Java面試題及答案,祝你能成功通過面試

每天互聯(lián)網寒冬,其實哪里有什么互聯(lián)網寒冬,只不過是你穿的少而已,有那個時間去關懷互聯(lián)網寒冬會倒下多少人,還不如來刷幾道Java面試題!話不多說,直接開干!

1、一個.java源文件中是否可以包括多個類(不是內部類)?有什么限制?

可以有多個類,但只能有一個public的類,并且public的類名必需與文件名相全都。

2、Java有沒有goto?

java中的保留字,現(xiàn)在沒有在java中使用。

3、說說和的區(qū)分。

和都可以用作規(guī)律與的運算符,表示規(guī)律與(and),當運算符兩邊的表達式的結果都為true時,整個運算結果才為true,否則,只要有一方為false,則結果為false。

還具有短路的功能,即假如第一個表達式為false,則不再計算其次個表達式。

還可以用作位運算符,當操作符兩邊的表達式不是boolean類型時,表示按位與操作。

4、在JAVA中如何跳出當前的多重嵌套循環(huán)?

在Java中,要想跳出多重循環(huán),可以在外面的循環(huán)語句前定義一個標號,然后在里層循環(huán)體的代碼中使用帶有標號的break語句,即可跳出外層循環(huán)。

5、switch語句能否作用在byte上,能否作用在long上,能否作用在String上?

在switch(expr1)中,expr1只能是一個整數(shù)表達式或者枚舉常量(更大字體),整數(shù)表達式可以是int基本類型或Integer包裝類型,由于,byte,short,char都可以隱含轉換為int,所以,這些類型以及這些類型的包裝類型也是可以的。明顯,long和String類型都不符合switch的語法規(guī)定,并且不能被隱式轉換成int類型,所以,它們不能作用于swtich語句中。

6、shorts1=1;s1=s1+1;有什么錯?shorts1=1;s1+=1;有什么錯?

對于shorts1=1;s1=s1+1;由于s1+1運算時會自動提升表達式的類型,所以結果是int型,再賦值給short類型s1時,編譯器將報告需要強制轉換類型的錯誤。

對于shorts1=1;s1+=1;由于+=是java語言規(guī)定的運算符,java編譯器會對它進行特別處理,因此可以正確編譯。

7、char型變量中能不能存貯一個中文漢字?為什么?

char型變量是用來存儲Unicode編碼的字符的,unicode編碼字符集中包含了漢字,所以,char型變量中當然可以存儲漢字啦。不過,假如某個特別的漢字沒有被包含在unicode編碼字符集中,那么,這個char型變量中就不能存儲這個特別漢字。補充說明:unicode編碼占用兩個字節(jié),所以,char類型的變量也是占用兩個字節(jié)。

8、用最有效率的方法算出2乘以8等於幾?

23,

9、使用final關鍵字修飾一個變量時,是引用不能變,還是引用的對象不能變?

使用final關鍵字修飾一個變量時,是指引用變量不能變,引用變量所指向的對象中的內容還是可以轉變的。

10、==和equals方法畢竟有什么區(qū)分?

==操作符特地用來比較兩個變量的值是否相等,也就是用于比較變量所對應的內存中所存儲的數(shù)值是否相同,要比較兩個基本類型的數(shù)據(jù)或兩個引用變量是否相等,只能用==操作符。

假如一個變量指向的數(shù)據(jù)是對象類型的,那么,這時候涉及了兩塊內存,對象本身占用一塊內存(堆內存),變量也占用一塊內存,例如Objetobj=newObject();變量obj是一個內存,newObject()是另一個內存,此時,變量obj所對應的內存中存儲的數(shù)值就是對象占用的那塊內存的首地址。對于指向對象類型的變量,假如要比較兩個變量是否指向同一個對象,即要看這兩個變量所對應的內存中的數(shù)值是否相等,這時候就需要用==操作符進行比較。

equals方法是用于比較兩個獨立對象的內容是否相同,就好比去比較兩個人的長相是否相同,它比較的兩個對象是獨立的。例如,對于下面的代碼:

Stringa=newString(foo);

Stringb=newString(foo);

兩條new語句創(chuàng)建了兩個對象,然后用a/b這兩個變量分別指向了其中一個對象,這是兩個不同的對象,它們的首地址是不同的,即a和b中存儲的數(shù)值是不相同的,所以,表達式a==b將返回false,而這兩個對象中的內容是相同的,所以,表達式a.equals(b)將返回true。

11、靜態(tài)變量和實例變量的區(qū)分?

在語法定義上的區(qū)分:靜態(tài)變量前要加static關鍵字,而實例變量前則不加。

在程序運行時的區(qū)分:實例變量屬于某個對象的屬性,必需創(chuàng)建了實例對象,其中的實例變量才會被安排空間,才能使用這個實例變量。靜態(tài)變量不屬于某個實例對象,而是屬于類,所以也稱為類變量,只要程序加載了類的字節(jié)碼,不用創(chuàng)建任何實例對象,靜態(tài)變量就會被安排空間,靜態(tài)變量就可以被使用了。

總之,實例變量必需創(chuàng)建對象后才可以通過這個對象來使用,靜態(tài)變量則可以直接使用類名來引用。

12、是否可以從一個static方法內部發(fā)出對非static方法的調用?

不行以。由于非static方法是要與對象關聯(lián)在一起的,必需創(chuàng)建一個對象后,才可以在該對象上進行方法調用,而static方法調用時不需要創(chuàng)建對象,可以直接調用。也就是說,當一個static方法被調用時,可能還沒有創(chuàng)建任何實例對象,假如從一個static方法中發(fā)出對非static方法的調用,那個非static方法是關聯(lián)到哪個對象上的呢?這個規(guī)律無法成立,所以,一個static方法內部發(fā)出對非static方法的調用。

13、Integer與int的區(qū)分

int是java供應的8種原始數(shù)據(jù)類型之一。Java為每個原始類型供應了封裝類,Integer是java為int供應的封裝類。int的默認值為0,而Integer的默認值為null,即Integer可以區(qū)分出未賦值和值為0的區(qū)分,int則無法表達出未賦值的狀況。例如,要想表達出沒有參與考試和考試成果為0的區(qū)分,則只能使用Integer。

在JSP開發(fā)中,Integer的默認為null,所以用el表達式在文本框中顯示時,值為空白字符串,而int默認的默認值為0,所以用el表達式在文本框中顯示時,結果為0,所以,int不適合作為web層的表單數(shù)據(jù)的類型。

在Hibernate中,假如將OID定義為Integer類型,那么Hibernate就可以依據(jù)其值是否為null而推斷一個對象是否是臨時的,假如將OID定義為了int類型,還需要在hbm映射文件中設置其unsaved-value屬性為0。

另外,Integer供應了多個與整數(shù)相關的操作方法,例如,將一個字符串轉換成整數(shù),Integer中還定義了表示整數(shù)的最大值和最小值的常量。

14、Math.round(11.5)等於多少?Math.round(-11.5)等於多少?

Math類中供應了三個與取整有關的方法:ceil、floor、round,這些方法的作用與它們的英文名稱的含義相對應,例如,ceil的英文意義是天花板,該方法就表示向上取整,Math.ceil(11.3)的結果為12,Math.ceil(-11.3)的結果是-11;floor的英文意義是地板,該方法就表示向下取整,Math.ceil(11.6)的結果為11,Math.ceil(-11.6)的結果是-12;最難把握的是round方法,它表示“四舍五入”,算法為Math.floor(x+0.5),即將原來的數(shù)字加上0.5后再向下取整,所以,Math.round(11.5)的結果為12,Math.round(-11.5)的結果為-11。

15、下面的代碼有什么不妥之處?

1.if(username.equals(“zxx”){}

2.intx=1;

returnx==1?true:false;

16、請說出作用域public,private,protected,以及不寫時的區(qū)分

這四個作用域的可見范圍如下表所示。

說明:假如在修飾的元素上面沒有寫任何訪問修飾符,則表示friendly。

作用域當前類同一package子孫類其他package

public√√√√

protected√√√×

friendly√√××

private√×××

17、Overload和Override的區(qū)分。Overloaded的方法是否可以轉變返回值的類型?

重載Overload表示同一個類中可以有多個名稱相同的方法,但這些方法的參數(shù)列表各不相同(即參數(shù)個數(shù)或類型不同)。

重寫Override表示子類中的方法可以與父類中的某個方法的名稱和參數(shù)完全相同,通過子類創(chuàng)建的實例對象調用這個方法時,將調用子類中的定義方法,這相當于把父類中定義的那個完全相同的方法給掩蓋了,這也是面對對象編程的多態(tài)性的一種表現(xiàn)。

在掩蓋要留意以下的幾點:

01、掩蓋的方法的標志必需要和被掩蓋的方法的標志完全匹配,才能達到掩蓋的效果;

02、掩蓋的方法的返回值必需和被掩蓋的方法的返回全都;

03、掩蓋的方法所拋出的特別必需和被掩蓋方法的所拋出的特別全都,或者是其子類;

04、被掩蓋的方法不能為private,否則在其子類中只是新定義了一個方法,并沒有對其進行掩蓋。

在使用重載要留意以下的幾點:

01、在使用重載時只能通過不同的參數(shù)樣式。例如,不同的參數(shù)類型,不同的參數(shù)個數(shù),不同的參數(shù)挨次(當然,同一方法內的幾個參數(shù)類型必需不一樣,例如可以是fun(int,float),但是不能為fun(int,int));

02、不能通過訪問權限、返回類型、拋出的特別進行重載;

03、方法的特別類型和數(shù)目不會對重載造成影響;

04、對于繼承來說,假如某一方法在父類中是訪問權限是priavte,那么就不能在子類對其進行重載,假如定義的話,也只是定義了一個新方法,而不會達到重載的效果。

假如幾個Overloaded的方法的參數(shù)列表不一樣,它們的返回者類型當然也可以不一樣。假如兩個方法的參數(shù)列表完全一樣,是否可以讓它們的返回值不同來實現(xiàn)重載Overload。這是不行的

18、構造器Constructor是否可被override?

構造器Constructor不能被繼承,因此不能重寫Override,但可以被重載Overload。

19、接口是否可繼承接口?抽象類是否可實現(xiàn)(implements)接口?抽象類是否可繼承詳細類(concreteclass)?抽象類中是否可以有靜態(tài)的main方法?

接口可以繼承接口。抽象類可以實現(xiàn)(implements)接口,抽象類是否可繼承詳細類。抽象類中可以有靜態(tài)的main方法。

只有記住抽象類與一般類的唯一區(qū)分就是不能創(chuàng)建實例對象和允許有abstract方法。

20、寫clone()方法時,通常都有一行代碼,是什么?

clone有缺省行為,super.clone();由于首先要把父類中的成員復制到位,然后才是復制自己的成員。

21、面對對象的特征有哪些方面

面對對象的編程語言有4個主要的特征。

1封裝:封裝是保證軟件部件具有優(yōu)良的模塊性的基礎,封裝的目標就是要實現(xiàn)軟件部件的“高內聚、低耦合”,防止程序相互依靠性而帶來的變動影響。把握一個原則:把對同一事物進行操作的方法和相關的方法放在同一個類中,把方法和它操作的數(shù)據(jù)放在同一個類中。

抽象:抽象就是找出一些事物的相像和共性之處,然后將這些事物歸為一個類,這個類只考慮這些事物的相像和共性之處,并且會忽視與當前主題和目標無關的那些方面,將留意力集中在與當前目標有關的方面。

繼承:在定義和實現(xiàn)一個類的時候,可以在一個已經存在的類的基礎之上來進行,把這個已經存在的類所定義的內容作為自己的內容,并可以加入若干新的內容,或修改原來的方法使之更適合特別的需要,這就是繼承。繼承是子類自動共享父類數(shù)據(jù)和方法的機制,這是類之間的一種關系,提高了軟件的可重用性和可擴展性。

多態(tài):多態(tài)是指程序中定義的引用變量所指向的詳細類型和通過該引用變量發(fā)出的方法調用在編程時并不確定,而是在程序運行期間才確定,即一個引用變量倒底會指向哪個類的實例對象,該引用變量發(fā)出的方法調用究竟是哪個類中實現(xiàn)的方法,必需在由程序運行期間才能打算。由于在程序運行時才確定詳細的類,這樣,不用修改源程序代碼,就可以讓引用變量綁定到各種不同的類實現(xiàn)上,從而導致該引用調用的詳細方法隨之轉變,即不修改程序代碼就可以轉變程序運行時所綁定的詳細代碼,讓程序可以選擇多個運行狀態(tài),這就是多態(tài)性。多態(tài)性增加了軟件的敏捷性和擴展性。

22、java中實現(xiàn)多態(tài)的機制是什么?

靠的是父類或接口定義的引用變量可以指向子類或詳細實現(xiàn)類的實例對象,而程序調用的方法在運行期才動態(tài)綁定,就是引用變量所指向的詳細實例對象的方法,也就是內存里正在運行的那個對象的方法,而不是引用變量的類型中定義的方法。

23、abstractclass和interface有什么區(qū)分?

含有abstract修飾符的class即為抽象類,abstract類不能創(chuàng)建的實例對象。含有abstract方法的類必需定義為abstractclass,abstractclass類中的方法不必是抽象的。abstractclass類中定義抽象方法必需在詳細(Concrete)子類中實現(xiàn),所以,不能有抽象構造方法或抽象靜態(tài)方法。假如的子類沒有實現(xiàn)抽象父類中的全部抽象方法,那么子類也必需定義為abstract類型。

接口(interface)可以說成是抽象類的一種特例,接口中的全部方法都必需是抽象的。接口中的方法定義默認為publicabstract類型,接口中的成員變量類型默認為publicstaticfinal。

下面比較一下兩者的語法區(qū)分:

1.抽象類可以有構造方法,接口中不能有構造方法。

2.抽象類中可以有一般成員變量,接口中沒有一般成員變量

3.抽象類中可以包含非抽象的一般方法,接口中的全部方法必需都是抽象的,不能有非抽象的一般方法。

4.抽象類中的抽象方法的訪問類型可以是public,protected和(默認類型,雖然eclipse下不報錯,但應當也不行),但接口中的抽象方法只能是public類型的,并且默認即為publicabstract類型。

5.抽象類中可以包含靜態(tài)方法,接口中不能包含靜態(tài)方法

6.抽象類和接口中都可以包含靜態(tài)成員變量,抽象類中的靜態(tài)成員變量的訪問類型可以任意,但接口中定義的變量只能是publicstaticfinal類型,并且默認即為publicstaticfinal類型。

7.一個類可以實現(xiàn)多個接口,但只能繼承一個抽象類。

24、abstract的method是否可同時是static,是否可同時是native,是否可同時是synchronized?

abstract的method不行以是static的,由于抽象的方法是要被子類實現(xiàn)的,而static與子類扯不上關系!

native方法表示該方法要用另外一種依靠平臺的編程語言實現(xiàn)的,不存在著被子類實現(xiàn)的問題,所以,它也不能是抽象的,不能與abstract混用。

關于synchronized與abstract合用的問題,我覺得也不行,由于在我?guī)啄甑膶W習和開發(fā)中,從來沒見到過這種狀況,并且我覺得synchronized應當是作用在一個詳細的方法上才有意義。而且,方法上的synchronized同步所使用的同步鎖對象是this,而抽象方法上無法確定this是什么。

25、什么是內部類?StaticNestedClass和InnerClass的不同。

內部類就是在一個類的內部定義的類,內部類中不能定義靜態(tài)成員,內部類可以直接訪問外部類中的成員變量,內部類可以定義在外部類的方法外面,也可以定義在外部類的方法體中。

在方法外部定義的內部類前面可以加上static關鍵字,從而成為StaticNestedClass,它不再具有內部類的特性,全部,從狹義上講,它不是內部類。StaticNestedClass與一般類在運行時的行為和功能上沒有什么區(qū)分,只是在編程引用時的語法上有一些差別,它可以定義成public、protected、默認的、private等多種類型,而一般類只能定義成public和默認的這兩種類型。在外面引用StaticNestedClass類的名稱為“外部類名.內部類名”。在外面不需要創(chuàng)建外部類的實例對象,就可以直接創(chuàng)建StaticNestedClass,例如,假設Inner是定義在Outer類中的StaticNestedClass,那么可以使用如下語句創(chuàng)建Inner類:

Outer.Innerinner=newOuter.Inner();

由于staticNestedClass不依靠于外部類的實例對象,所以,staticNestedClass能訪問外部類的非static成員變量。當在外部類中訪問StaticNestedClass時,可以直接使用StaticNestedClass的名字,而不需要加上外部類的名字了,在StaticNestedClass中也可以直接引用外部類的static的成員變量,不需要加上外部類的名字。

在靜態(tài)方法中定義的內部類也是StaticNestedClass,這時候不能在類前面加static關鍵字,靜態(tài)方法中的StaticNestedClass與一般方法中的內部類的應用方式很相像,它除了可以直接訪問外部類中的static的成員變量,還可以訪問靜態(tài)方法中的局部變量,但是,該局部變量前必需加final修飾符。

26、內部類可以引用它的包含類的成員嗎?有沒有什么限制?

完全可以。假如不是靜態(tài)內部類,那沒有什么限制!

假如你把靜態(tài)嵌套類當作內部類的一種特例,那在這種狀況下不行以訪問外部類的一般成員變量,而只能訪問外部類中的靜態(tài)成員,

27、AnonymousInnerClass(匿名內部類)是否可以extends(繼承)其它類,是否可以implements(實現(xiàn))interface(接口)?

可以繼承其他類或實現(xiàn)其他接口。不僅是可以,而是必需!

28、super.getClass()方法調用

下面程序的輸出結果是多少?

importjava.util.Date;

publicclassTestextendsDate{

publicstaticvoidmain(Stringargs){

newTest().test();

}

publicvoidtest(){

System.out.println(super.getClass().getName());

}

}

結果是Test。在test方法中,直接調用getClass().getName()方法,返回的是Test類名,由于getClass()在Object類中定義成了final,子類不能掩蓋該方法,所以,在test方法中調用getClass().getName()方法,其實就是在調用從父類繼承的getClass()方法,等效于調用super.getClass().getName()方法,所以,super.getClass().getName()方法返回的也應當是Test。假如想得到父類的名稱,應當用如下代碼:getClass().getSuperClass().getName();

29、String是最基本的數(shù)據(jù)類型嗎?

基本數(shù)據(jù)類型包括byte、int、char、long、float、double、boolean和short。

java.lang.String類是final類型的,因此不行以繼承這個類、不能修改這個類。為了提高效率節(jié)約空間,我們應當用StringBuffer類

30、Strings=Hello;s=s+world!;這兩行代碼執(zhí)行后,原始的String對象中的內容究竟變了沒有?

沒有。由于String被設計成不行變(immutable)類,所以它的全部對象都是不行變對象。在這段代碼中,s原先指向一個String對象,內容是Hello,然后我們對s進行了+操作,那么s所指向的那個對象是否發(fā)生了轉變呢?答案是沒有。這時,s不指向原來那個對象了,而指向了另一個String對象,內容為Helloworld!,原來那個對象還存在于內存之中,只是s這個引用變量不再指向它了。

31、是否可以繼承String類?

String類是final類故不行以繼承。

32、Strings=newString(xyz);創(chuàng)建了幾個StringObject?二者之間有什么區(qū)分?

兩個或一個,”xyz”對應一個對象,這個對象放在字符串常量緩沖區(qū),常量”xyz”不管消失多少遍,都是緩沖區(qū)中的那一個。NewString每寫一遍,就創(chuàng)建一個新的對象,它一句那個常量”xyz”對象的內容來創(chuàng)建出一個新String對象。假如以前就用過’xyz’,這句代表就不會創(chuàng)建”xyz”自己了,直接從緩沖區(qū)拿。

33、String和StringBuffer的區(qū)分

JAVA平臺供應了兩個類:String和StringBuffer,它們可以儲存和操作字符串,即包含多個字符的字符數(shù)據(jù)。這個String類供應了數(shù)值不行轉變的字符串。而這個StringBuffer類供應的字符串進行修改。當你知道字符數(shù)據(jù)要轉變的時候你就可以使用StringBuffer。典型地,你可以使用StringBuffers來動態(tài)構造字符數(shù)據(jù)。另外,String實現(xiàn)了equals方法,newString(“abc”).equals(newString(“abc”)的結果為true,而StringBuffer沒有實現(xiàn)equals方法,所以,newStringBuffer(“abc”).equals(newStringBuffer(“abc”)的結果為false。

接著要舉一個詳細的例子來說明,我們要把1到100的全部數(shù)字拼起來,組成一個串。

StringBuffersbf=newStringBuffer();

for(inti=0;i100;i++)

{

sbf.append(i);

}

上面的代碼效率很高,由于只創(chuàng)建了一個StringBuffer對象,而下面的代碼效率很低,由于創(chuàng)建了101個對象。

Stringstr=newString();

for(inti=0;i100;i++)

{

str=str+i;

}

String掩蓋了equals方法和hashCode方法,而StringBuffer沒有掩蓋equals方法和hashCode方法,所以,將StringBuffer對象存儲進Java集合類中時會消失問題。

34、如何把一段逗號分割的字符串轉換成一個數(shù)組?

假如不查jdkapi,我很難寫出來!我可以說說我的思路:

1用正則表達式,代碼也許為:Stringresult=orgStr.split(“,”);

2用StingTokenizer,代碼為:StringTokenizertokener=StringTokenizer(orgStr,”,”);

Stringresult=newString;

Inti=0;

while(tokener.hasNext(){result=toker.nextToken();}

35、數(shù)組有沒有l(wèi)ength()這個方法?String有沒有l(wèi)ength()這個方法?

數(shù)組沒有l(wèi)ength()這個方法,有l(wèi)ength的屬性。String有有l(wèi)ength()這個方法。

36、下面這條語句一共創(chuàng)建了多少個對象:Strings=a+b+c+d;

答:對于如下代碼:

Strings1=a;

Strings2=s1+b;

Strings3=a+b;

System.out.println(s2==ab);

System.out.println(s3==ab);

第一條語句打印的結果為false,其次條語句打印的結果為true,這說明javac編譯可以對字符串常量直接相加的表達式進行優(yōu)化,不必要等到運行期去進行加法運算處理,而是在編譯時去掉其中的加號,直接將其編譯成一個這些常量相連的結果。

題目中的第一行代碼被編譯器在編譯時優(yōu)化后,相當于直接定義了一個”abcd”的字符串,所以,上面的代碼應當只創(chuàng)建了一個String對象。寫如下兩行代碼,

Strings=a+b+c+d;

System.out.println(s==abcd);

最終打印的結果應當為true。

37、try{}里有一個return語句,那么緊跟在這個try后的finally{}里的code會不會被執(zhí)行,什么時候被執(zhí)行,在return前還是后?

結論:finally中的代碼比return和break語句后執(zhí)行

38、final,finally,finalize的區(qū)分。

final用于聲明屬性,方法和類,分別表示屬性不行變,方法不行掩蓋,類不行繼承。

內部類要訪問局部變量,局部變量必需定義成final類型。

finally是特別處理語句結構的一部分,表示總是執(zhí)行。

finalize是Object類的一個方法,在垃圾收集器執(zhí)行的時候會調用被回收對象的此方法,可以掩蓋此方法供應垃圾收集時的其他資源回收,例如關閉文件等。JVM不保證此方法總被調用

39、運行時特別與一般特別有何異同?

特別表示程序運行過程中可能消失的非正常狀態(tài),運行時特別表示虛擬機的通常操作中可能遇到的特別,是一種常見運行錯誤。java編譯器要求方法必需聲明拋出可能發(fā)生的非運行時特別,但是并不要求必需聲明拋出未被捕獲的運行時特別。

40、error和exception有什么區(qū)分?

error表示恢復不是不行能但很困難的狀況下的一種嚴峻問題。比如說內存溢出。不行能希望程序能處理這樣的狀況。exception表示一種設計或實現(xiàn)問題。也就是說,它表示假如程序運行正常,從不會發(fā)生的狀況。

41、Java中的特別處理機制的簡潔原理和應用。

特別是指java程序運行時(非編譯)所發(fā)生的非正常狀況或錯誤。Java對特別進行了分類,不同類型的特別分別用不同的Java類表示,全部特別的根類為java.lang.Throwable,Throwable下面又派生了兩個子類:Error和Exception,Error表示應用程序本身無法克服和恢復的一種嚴峻問題,程序只有死的份了,例如,說內存溢出和線程死鎖等系統(tǒng)問題。Exception表示程序還能夠克服和恢復的問題,其中又分為系統(tǒng)特別和一般特別,系統(tǒng)特別是軟件本身缺陷所導致的問題,也就是軟件開發(fā)人員考慮不周所導致的問題,軟件使用者無法克服和恢復這種問題,但在這種問題下還可以讓軟件系統(tǒng)連續(xù)運行或者讓軟件死掉,例如,數(shù)組腳本越界(ArrayIndexOutOfBoundsException),空指針特別(NullPointerException)、類轉換特別(ClassCastException);一般特別是運行環(huán)境的變化或特別所導致的問題,是用戶能夠克服的問題,例如,網絡斷線,硬盤空間不夠,發(fā)生這樣的特別后,程序不應當死掉。

java為系統(tǒng)特別和一般特別供應了不同的解決方案,編譯器強制一般特別必需try..catch處理或用throws聲明連續(xù)拋給上層調用方法處理,所以一般特別也稱為checked特別,而系統(tǒng)特別可以處理也可以不處理,所以,編譯器不強制用try..catch處理或用throws聲明,所以系統(tǒng)特別也稱為unchecked特別。

42、請寫出你最常見到的5個runtimeexception。

所謂系統(tǒng)特別,就是…..,它們都是RuntimeException的子類,在jdkdoc中查RuntimeException類,就可以看到其全部的子類列表,也就是看到了全部的系統(tǒng)特別。我比較有印象的系統(tǒng)特別有:NullPointerException、ArrayIndexOutOfBoundsException、ClassCastException。

43、java中有幾種方法可以實現(xiàn)一個線程?用什么關鍵字修飾同步方法?stop()和suspend()方法為何不推舉使用?

java5以前,有如下兩種:

第一種:

newThread(){}.start();這表示調用Thread子類對象的run方法,newThread(){}表示一個Thread的匿名子類的實例對象,子類加上run方法后的代碼如下:

newThread(){

publicvoidrun(){

}

}.start();

其次種:

newThread(newRunnable(){}).start();這表示調用Thread對象接受的Runnable對象的run方法,newRunnable(){}表示一個Runnable的匿名子類的實例對象,runnable的子類加上run方法后的代碼如下:

newThread(newRunnable(){

publicvoidrun(){

}

}

).start();

從java5開頭,還有如下一些線程池創(chuàng)建多線程的方式:

ExecutorServicepool=Executors.newFixedThreadPool(3)

for(inti=0;i10;i++)

{

pool.ute(newRunable(){publicvoidrun(){}});

}

Executors.newCachedThreadPool().ute(newRunable(){publicvoidrun(){}});

Executors.newSingleThreadExecutor().ute(newRunable(){publicvoidrun(){}});

有兩種實現(xiàn)方法,分別使用newThread()和newThread(runnable)形式,第一種直接調用thread的run方法,所以,我們往往使用Thread子類,即newSubThread()。其次種調用runnable的run方法。

有兩種實現(xiàn)方法,分別是繼承Thread類與實現(xiàn)Runnable接口

用synchronized關鍵字修飾同步方法

反對使用stop(),是由于它擔心全。它會解除由線程獵取的全部鎖定,而且假如對象處于一種不連貫狀態(tài),那么其他線程能在那種狀態(tài)下檢查和修改它們。結果很難檢查出真正的問題所在。suspend()方法簡單發(fā)生死鎖。調用suspend()的時候,目標線程會停下來,但卻仍舊持有在這之前獲得的鎖定。此時,其他任何線程都不能訪問鎖定的資源,除非被掛起的線程恢復運行。對任何線程來說,假如它們想恢復目標線程,同時又試圖使用任何一個鎖定的資源,就會造成死鎖。所以不應當使用suspend(),而應在自己的Thread類中置入一個標志,指出線程應當活動還是掛起。若標志指出線程應當掛起,便用wait()命其進入等待狀態(tài)。若標志指出線程應當恢復,則用一個notify()重新啟動線程。

44、sleep()和wait()有什么區(qū)分?

(網上的答案:sleep是線程類(Thread)的方法,導致此線程暫停執(zhí)行指定時間,給執(zhí)行機會給其他線程,但是監(jiān)控狀態(tài)依舊保持,到時后會自動恢復。調用sleep不會釋放對象鎖。wait是Object類的方法,對此對象調用wait方法導致本線程放棄對象鎖,進入等待此對象的等待鎖定池,只有針對此對象發(fā)出notify方法(或notifyAll)后本線程才進入對象鎖定池預備獲得對象鎖進入運行狀態(tài)。)

45、同步和異步有何異同,在什么狀況下分別使用他們?舉例說明。

假如數(shù)據(jù)將在線程間共享。例如正在寫的數(shù)據(jù)以后可能被另一個線程讀到,或者正在讀的數(shù)據(jù)可能已經被另一個線程寫過了,那么這些數(shù)據(jù)就是共享數(shù)據(jù),必需進行同步存取。

當應用程序在對象上調用了一個需要花費很長時間來執(zhí)行的方法,并且不盼望讓程序等待方法的返回時,就應當使用異步編程,在許多狀況下采納異步途徑往往更有效率。

46.下面兩個方法同步嗎?(自己創(chuàng)造)

classTest

{

synchronizedstaticvoidsayHello3()

{

}

synchronizedvoidgetX(){}

}

47、多線程有幾種實現(xiàn)方法?同步有幾種實現(xiàn)方法?

多線程有兩種實現(xiàn)方法,分別是繼承Thread類與實現(xiàn)Runnable接口

同步的實現(xiàn)方面有兩種,分別是synchronized,wait與notify

wait():使一個線程處于等待狀態(tài),并且釋放所持有的對象的lock。

sleep():使一個正在運行的線程處于睡眠狀態(tài),是一個靜態(tài)方法,調用此方法要捕獲InterruptedException特別。

notify():喚醒一個處于等待狀態(tài)的線程,留意的是在調用此方法的時候,并不能準確的喚醒某一個等待狀態(tài)的線程,而是由JVM確定喚醒哪個線程,而且不是按優(yōu)先級。

Allnotity():喚醒全部處入等待狀態(tài)的線程,留意并不是給全部喚醒線程一個對象的鎖,而是讓它們競爭

48、啟動一個線程是用run()還是start()?.

啟動一個線程是調用start()方法,使線程就緒狀態(tài),以后可以被調度為運行狀態(tài),一個線程必需關聯(lián)一些詳細的執(zhí)行代碼,run()方法是該線程所關聯(lián)的執(zhí)行代碼。

49、當一個線程進入一個對象的一個synchronized方法后,其它線程是否可進入此對象的其它方法?

分幾種狀況:

1.其他方法前是否加了synchronized關鍵字,假如沒加,則能。

2.假如這個方法內部調用了wait,則可以進入其他synchronized方法。

3.假如其他個方法都加了synchronized關鍵字,并且內部沒有調用wait,則不能。

4.假如其他方法是static,它用的同步鎖是當前類的字節(jié)碼,與非靜態(tài)的方法不能同步,由于非靜態(tài)的方法用的是this。

50、線程的基本概念、線程的基本狀態(tài)以及狀態(tài)之間的關系

一個程序中可以有多條執(zhí)行線索同時執(zhí)行,一個線程就是程序中的一條執(zhí)行線索,每個線程上都關聯(lián)有要執(zhí)行的代碼,即可以有多段程序代碼同時運行,每個程序至少都有一個線程,即main方法執(zhí)行的那個線程。假如只是一個cpu,它怎么能夠同時執(zhí)行多段程序呢?這是從宏觀上來看的,cpu一會執(zhí)行a線索,一會執(zhí)行b線索,切換時間很快,給人的感覺是a,b在同時執(zhí)行,好比大家在同一個辦公室上網,只有一條鏈接到外部網線,其實,這條網線一會為a傳數(shù)據(jù),一會為b傳數(shù)據(jù),由于切換時間很短暫,所以,大家感覺都在同時上網。

狀態(tài):就緒,運行,synchronize堵塞,wait和sleep掛起,結束。wait必需在synchronized內部調用。

調用線程的start方法后線程進入就緒狀態(tài),線程調度系統(tǒng)將就緒狀態(tài)的線程轉為運行狀態(tài),遇到synchronized語句時,由運行狀態(tài)轉為堵塞,當synchronized獲得鎖后,由堵塞轉為運行,在這種狀況可以調用wait方法轉為掛起狀態(tài),當線程關聯(lián)的代碼執(zhí)行完后,線程變?yōu)榻Y束狀態(tài)。

51、簡述synchronized和java.util.concurrent.locks.Lock的異同?

主要相同點:Lock能完成synchronized所實現(xiàn)的全部功能

主要不同點:Lock有比synchronized更精確的線程語義和更好的性能。synchronized會自動釋放鎖,而Lock肯定要求程序員手工釋放,并且必需在finally從句中釋放。Lock還有更強大的功能,例如,它的tryLock方法可以非堵塞方式去拿鎖。

52、介紹Collection框架的結構

答:隨便發(fā)揮題,天南海北誰便談,只要讓別覺得你學問淵博,理解透徹即可。

53、Collection框架中實現(xiàn)比較要實現(xiàn)什么接口

parable/parator

54、ArrayList和Vector的區(qū)分

答:這兩個類都實現(xiàn)了List接口(List接口繼承了Collection接口),他們都是有序集合,即存儲在這兩個集合中的元素的位置都是有挨次的,相當于一種動態(tài)的數(shù)組,我們以后可以按位置索引號取出某個元素,,并且其中的數(shù)據(jù)是允許重復的,這是HashSet之類的集合的最大不同處,HashSet之類的集合不行以按索引號去檢索其中的元素,也不允許有重復的元素(原來題目問的與hashset沒有任何關系,但為了說清晰ArrayList與Vector的功能,我們使用對比方式,更有利于說明問題)。

接著才說ArrayList與Vector的區(qū)分,這主要包括兩個方面:.

(1)同步性:

Vector是線程平安的,也就是說是它的方法之間是線程同步的,而ArrayList是線程序擔心全的,它的方法之間是線程不同步的。假如只有一個線程會訪問到集合,那最好是使用ArrayList,由于它不考慮線程平安,效率會高些;假如有多個線程會訪問到集合,那最好是使用Vector,由于不需要我們自己再去考慮和編寫線程平安的代碼。

備注:對于VectorArrayList、HashtableHashMap,要記住線程平安的問題,記住Vector與Hashtable是舊的,是java一誕生就供應了的,它們是線程平安的,ArrayList與HashMap是java2時才供應的,它們是線程擔心全的。所以,我們講課時先講老的。

(2)數(shù)據(jù)增長:

ArrayList與Vector都有一個初始的容量大小,當存儲進它們里面的元素的個數(shù)超過了容量時,就需要增加ArrayList與Vector的存儲空間,每次要增加存儲空間時,不是只增加一個存儲單元,而是增加多個存儲單元,每次增加的存儲單元的個數(shù)在內存空間利用與程序效率之間要取得肯定的平衡。Vector默認增長為原來兩倍,而ArrayList的增長策略在文檔中沒有明確規(guī)定(從源代碼看到的是增長為原來的1.5倍)。ArrayList與Vector都可以設置初始的空間大小,Vector還可以設置增長的空間大小,而ArrayList沒有供應設置增長空間的方法。

總結:即Vector增長原來的一倍,ArrayList增加原來的0.5倍。

55、HashMap和Hashtable的區(qū)分

(條理上還需要整理,也是先說相同點,再說不同點)

HashMap是Hashtable的輕量級實現(xiàn)(非線程平安的實現(xiàn)),他們都完成了Map接口,主要區(qū)分在于HashMap允許空(null)鍵值(key),由于非線程平安,在只有一個線程訪問的狀況下,效率要高于Hashtable。

HashMap允許將null作為一個entry的key或者value,而Hashtable不允許。

HashMap把Hashtable的contains方法去掉了,改成containsvalue和containsKey。由于contains方法簡單讓人引起誤會。

Hashtable繼承自Dictionary類,而HashMap是Java1.2引進的Mapinterface的一個實現(xiàn)。

最大的不同是,Hashtable的方法是Synchronize的,而HashMap不是,在多個線程訪問Hashtable時,不需要自己為它的方法實現(xiàn)同步,而HashMap就必需為之供應外同步。

Hashtable和HashMap采納的hash/rehash算法都也許一樣,所以性能不會有很大的差異。

就HashMap與HashTable主要從三方面來說。

一.歷史緣由:Hashtable是基于陳舊的Dictionary類的,HashMap是Java1.2引進的Map接口的一個實現(xiàn)

二.同步性:Hashtable是線程平安的,也就是說是同步的,而HashMap是線程序擔心全的,不是同步的

三.值:只有HashMap可以讓你將空值作為一個表的條目的key或value

56、List和Map區(qū)分?

一個是存儲單列數(shù)據(jù)的集合,另一個是存儲鍵和值這樣的雙列數(shù)據(jù)的集合,List中存儲的數(shù)據(jù)是有挨次,并且允許重復;Map中存儲的數(shù)據(jù)是沒有挨次的,其鍵是不能重復的,它的值是可以有重復的。

57、List,Set,Map是否繼承自Collection接口?

List,Set是,Map不是

58、List、Map、Set三個接口,存取元素時,各有什么特點?

首先,List與Set具有相像性,它們都是單列元素的集合,所以,它們有一個功共同的父接口,叫Collection。Set里面不允許有重復的元素,所謂重復,即不能有兩個相等(留意,不是僅僅是相同)的對象

List表示有先后挨次的集合,留意,不是那種按年齡、按大小、按價格之類的排序。當我們多次調用add(Obje)方法時,每次加入的對象就像火車站買票有排隊挨次一樣,按先來后到的挨次排序。有時候,也可以插隊,即調用add(intindex,Obje)方法,就可以指定當前對象在集合中的存放位置。一個對象可以被反復存儲進List中,每調用一次add方法,這個對象就被插入進集合中一次,其實,并不是把這個對象本身存儲進了集合中,而是在集合中用一個索引變量指向這個對象,當這個對象被add多次時,即相當于集合中有多個索引指向了這個對象。List除了可以以Iterator接口取得全部的元素,再逐一遍歷各個元素之外,還可以調用get(indexi)來明確說明取第幾個。

Map與List和Set不同,它是雙列的集合,其中有put方法,定義如下:put(objkey,objvalue),每次存儲時,要存儲一對key/value,不能存儲重復的key,這個重復的規(guī)章也是按equals比較相等。取則可以依據(jù)key獲得相應的value,即get(Objectkey)返回值為key所對應的value。另外,也可以獲得全部的key的結合,還可以獲得全部的value的結合,還可以獲得key和value組合成的Map.Entry對象的集合。

List以特定次序來持有元素,可有重復元素。Set無法擁有重復元素,內部排序。Map保存key-value值,value可多值。

HashSet根據(jù)hashcode值的某種運算方式進行存儲,而不是直接按hashCode值的大小進行存儲。例如,abc---78,def---62,xyz---65在hashSet中的存儲挨次不是62,65,78,這些問題感謝以前一個叫崔健的學員提出,最終通過查看源代碼給他解釋清晰,看本次培訓學員當中有多少能看懂源碼。LinkedHashSet按插入的挨次存儲,那被存儲對象的hashcode方法還有什么作用呢?學員想想!hashset集合比較兩個對象是否相等,首先看hashcode方法是否相等,然后看equals方法是否相等。new兩個Student插入到HashSet中,看HashSet的size,實現(xiàn)hashcode和equals方法后再看size。

同一個對象可以在Vector中加入多次。往集合里面加元素,相當于集合里用一根繩子連接到了目標對象。往HashSet中卻加不了多次的。

59、說出ArrayList,Vector,LinkedList的存儲性能和特性

ArrayList和Vector都是使用數(shù)組方式存儲數(shù)據(jù),此數(shù)組元素數(shù)大于實際存儲的數(shù)據(jù)以便增加和插入元素,它們都允許直接按序號索引元素,但是插入元素要涉及數(shù)組元素移動等內存操作,所以索引數(shù)據(jù)快而插入數(shù)據(jù)慢,Vector由于使用了synchronized方法(線程平安),通常性能上較ArrayList差,而LinkedList使用雙向鏈表實現(xiàn)存儲,按序號索引數(shù)據(jù)需要進行前向或后向遍歷,但是插入數(shù)據(jù)時只需要記錄本項的前后項即可,所以插入速度較快。

LinkedList也是線程擔心全的,LinkedList供應了一些方法,使得LinkedList可以被當作堆棧和隊列來使用。

60、去掉一個Vector集合中重復的元素

VectornewVector=newVector();

For(inti=0;ivector.size();i++)

{

Objectobj=vector.get(i);

if(!newVector.contains(obj);

newVector.add(obj);

}

還有一種簡潔的方式,HashSetset=newHashSet(vector);

61、Collection和Collections的區(qū)分。

Collection是集合類的上級接口,繼承與他的接口主要有Set和List.

Collections是針對集合類的一個關心類,他供應一系列靜態(tài)方法實現(xiàn)對各種集合的搜尋、排序、線程平安化等操作。

62、Set里的元素是不能重復的,那么用什么方法來區(qū)分重復與否呢?是用==還是equals()?它們有何區(qū)分?

Set里的元素是不能重復的,元素重復與否是使用equals()方法進行推斷的。equals()和==方法打算引用值是否指向同一對象equals()在類中被掩蓋,為的是當兩個分別的對象的內容和類型相配的話,返回真值

63、你所知道的集合類都有哪些?主要方法?

最常用的集合類是List和Map。List的詳細實現(xiàn)包括ArrayList和Vector,它們是可變大小的列表,比較適合構建、存儲和操作任何類型對象的元素列表。List適用于按數(shù)值索引訪問元素的情形。

Map供應了一個更通用的元素存儲方法。Map集合類用于存儲元素對(稱作鍵和值),其中每個鍵映射到一個值。

ArrayList/VectoràList

àCollection

HashSet/TreeSetàSet

PropetiesàHashTable

àMap

Treemap/HashMap

我記的不是方法名,而是思想,我知道它們都有增刪改查的方法,但這些方法的詳細名稱,我記得不是很清晰,對于set,也許的方法是add,remove,contains;對于map,也許的方法就是put,remove,contains等,由于,我只要在eclispe下按點操作符,很自然的這些方法就出來了。我記住的一些思想就是List類會有get(intindex)這樣的方法,由于它可以按挨次取元素,而set類中沒有get(intindex)這樣的方法。List和set都可以迭代出全部元素,迭代時先要得到一個iterator對象,所以,set和list類都有一個iterator方法,用于返回那個iterator對象。map可以返回三個集合,一個是返回全部的key的集合,另外一個返回的是全部value的集合,再一個返回的key和value組合成的EntrySet對象的集合,map也有get方法,參數(shù)是key,返回值是key對應的value。

64、兩個對象值相同(x.equals(y)==true),但卻可有不同的hashcode,這句話對不對?

對。假如對象要保存在HashSet或HashMap中,它們的equals相等,那么,它們的hashcode值就必需相等。

假如不是要保存在HashSet或HashMap,則與hashcode沒有什么關系了,這時候hashcode不等是可以的,例如arrayList存儲的對象就不用實現(xiàn)hashcode,當然,我們沒有理由不實現(xiàn),通常都會去實現(xiàn)的。

65、TreeSet里面放對象,假如同時放入了父類和子類的實例對象,那比較時使用的是父類的pareTo方法,還是使用的子類的pareTo方法,還是拋特別!

(應當是沒有針對問題的準確的答案,當前的add方法放入的是哪個對象,就調用哪個對象的pareTo方法,至于這個pareTo方法怎么做,就看當前這個對象的類中是如何編寫這個方法的)

66、說出一些常用的類,包,接口,請各舉5個

要讓人家感覺你對javaee開發(fā)很熟,所以,不能僅僅只列corejava中的那些東西,要多列你在做ssh項目中涉及的那些東西。就寫你最近寫的那些程序中涉及的那些類。

常用的類:BufferedReaderBufferedWriterFileReaderFileWirterStringInteger

java.util.Date,System,Class,List,HashMap

常用的包;java.langjava.iojava.utiljava.sql,javax.servlet,org.apache.strtuts.action,org.hibernate

常用的接口:RemoteListMapDocumentNodeList,Servlet,HttpServletRequest,HttpServletResponse,Transaction(Hibernate)、Session(Hibernate),HttpSession

67、java中有幾種類型的流?JDK為每種類型的流供應了一些抽象類以供繼承,請說出他們分別是哪些類?

字節(jié)流,字符流。字節(jié)流繼承于InputStreamOutputStream,字符流繼承于InputStreamReaderOutputStreamWriter。在java.io包中還有很多其他的流,主要是為了提高性能和使用便利。

68、字節(jié)流與字符流的區(qū)分

要把一片二進制數(shù)據(jù)數(shù)據(jù)逐一輸出到某個設備中,或者從某個設備中逐一讀取一片二進制數(shù)據(jù),不管輸入輸出設備是什么,我們要用統(tǒng)一的方式來完成這些操作,用一種抽象的方式進行描述,這個抽象描述方式起名為IO流,對應的抽象類為OutputStream和InputStream,不同的實現(xiàn)類就代表不同的輸入

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經權益所有人同意不得將文件中的內容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
  • 6. 下載文件中如有侵權或不適當內容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論