版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認(rèn)領(lǐng)
文檔簡介
java常見面試題史上最全最經(jīng)典希望對你有用資料僅供參考1.Java基礎(chǔ)部分基礎(chǔ)部分的順序:基本語法,類相關(guān)的語法,內(nèi)部類的語法,繼承相關(guān)的語法,異常的語法,線程的語法,集合的語法,io的語法,虛擬機方面的語法。1、一個".java"源文件中是否能夠包括多個類(不是內(nèi)部類)?有什么限制?能夠有多個類,但只能有一個public的類,而且public的類名必須與文件名相一致。2、Java有沒有g(shù)oto?java中的保留字,現(xiàn)在沒有在java中使用。3、說說&和&&的區(qū)別。&和&&都能夠用作邏輯與的運算符,表示邏輯與(and),當(dāng)運算符兩邊的表示式的結(jié)果都為true時,整個運算結(jié)果才為true,否則,只要有一方為false,則結(jié)果為false。&&還具有短路的功能,即如果第一個表示式為false,則不再計算第二個表示式。&還能夠用作位運算符,當(dāng)&操作符兩邊的表示式不是boolean類型時,&表示按位與操作。4、在JAVA中如何跳出當(dāng)前的多重嵌套循環(huán)?在Java中,要想跳出多重循環(huán),能夠在外面的循環(huán)語句前定義一個標(biāo)號,然后在里層循環(huán)體的代碼中使用帶有標(biāo)號的break語句,即可跳出外層循環(huán)。5、switch語句能否作用在byte上,能否作用在long上,能否作用在String上?在switch(expr1)中,expr1只能是一個整數(shù)表示式或者枚舉常量(更大字體),整數(shù)表示式能夠是int基本類型或Integer包裝類型,由于,byte,short,char都能夠隱含轉(zhuǎn)換為int,因此,這些類型以及這些類型的包裝類型也是能夠的。顯然,long和String類型都不符合switch的語法規(guī)定,而且不能被隱式轉(zhuǎn)換成int類型,因此,它們不能作用于swtich語句中。6、shorts1=1;s1=s1+1;有什么錯?shorts1=1;s1+=1;有什么錯?對于shorts1=1;s1=s1+1;由于s1+1運算時會自動提升表示式的類型,因此結(jié)果是int型,再賦值給short類型s1時,編譯器將報告需要強制轉(zhuǎn)換類型的錯誤。對于shorts1=1;s1+=1;由于+=是java語言規(guī)定的運算符,java編譯器會對它進行特殊處理,因此能夠正確編譯。7、char型變量中能不能存貯一個中文漢字?為什么?char型變量是用來存儲Unicode編碼的字符的,unicode編碼字符集中包含了漢字,因此,char型變量中當(dāng)然能夠存儲漢字啦。不過,如果某個特殊的漢字沒有被包含在unicode編碼字符集中,那么,這個char型變量中就不能存儲這個特殊漢字。補充說明:unicode編碼占用兩個字節(jié),因此,char類型的變量也是占用兩個字節(jié)。8、用最有效率的方法算出2乘以8等於幾?2<<3,10、使用final關(guān)鍵字修飾一個變量時,是引用不能變,還是引用的對象不能變?使用final關(guān)鍵字修飾一個變量時,是指引用變量不能變,引用變量所指向的對象中的內(nèi)容還是能夠改變的。11、"=="和equals方法究竟有什么區(qū)別?==操作符專門用來比較兩個變量的值是否相等,也就是用于比較變量所對應(yīng)的內(nèi)存中所存儲的數(shù)值是否相同,要比較兩個基本類型的數(shù)據(jù)或兩個引用變量是否相等,只能用==操作符。如果一個變量指向的數(shù)據(jù)是對象類型的,那么,這時候涉及了兩塊內(nèi)存,對象本身占用一塊內(nèi)存(堆內(nèi)存),變量也占用一塊內(nèi)存,例如Objetobj=newObject();變量obj是一個內(nèi)存,newObject()是另一個內(nèi)存,此時,變量obj所對應(yīng)的內(nèi)存中存儲的數(shù)值就是對象占用的那塊內(nèi)存的首地址。對于指向?qū)ο箢愋偷淖兞?,如果要比較兩個變量是否指向同一個對象,即要看這兩個變量所對應(yīng)的內(nèi)存中的數(shù)值是否相等,這時候就需要用==操作符進行比較。equals方法是用于比較兩個獨立對象的內(nèi)容是否相同,就好比去比較兩個人的長相是否相同,它比較的兩個對象是獨立的。例如,對于下面的代碼:Stringa=newString("foo");Stringb=newString("foo");兩條new語句創(chuàng)立了兩個對象,然后用a/b這兩個變量分別指向了其中一個對象,這是兩個不同的對象,它們的首地址是不同的,即a和b中存儲的數(shù)值是不相同的,因此,表示式a==b將返回false,而這兩個對象中的內(nèi)容是相同的,因此,表示式a.equals(b)將返回true。12、靜態(tài)變量和實例變量的區(qū)別?在語法定義上的區(qū)別:靜態(tài)變量前要加static關(guān)鍵字,而實例變量前則不加。在程序運行時的區(qū)別:實例變量屬于某個對象的屬性,必須創(chuàng)立了實例對象,其中的實例變量才會被分配空間,才能使用這個實例變量。靜態(tài)變量不屬于某個實例對象,而是屬于類,因此也稱為類變量,只要程序加載了類的字節(jié)碼,不用創(chuàng)立任何實例對象,靜態(tài)變量就會被分配空間,靜態(tài)變量就能夠被使用了??傊瑢嵗兞勘仨殑?chuàng)立對象后才能夠經(jīng)過這個對象來使用,靜態(tài)變量則能夠直接使用類名來引用。13、是否能夠從一個static方法內(nèi)部發(fā)出對非static方法的調(diào)用?不能夠。因為非static方法是要與對象關(guān)聯(lián)在一起的,必須創(chuàng)立一個對象后,才能夠在該對象上進行方法調(diào)用,而static方法調(diào)用時不需要創(chuàng)立對象,能夠直接調(diào)用。也就是說,當(dāng)一個static方法被調(diào)用時,可能還沒有創(chuàng)立任何實例對象,如果從一個static方法中發(fā)出對非static方法的調(diào)用,那個非static方法是關(guān)聯(lián)到哪個對象上的呢?這個邏輯無法成立,因此,一個static方法內(nèi)部發(fā)出對非static方法的調(diào)用。14、Integer與int的區(qū)別int是java提供的8種原始數(shù)據(jù)類型之一。Java為每個原始類型提供了封裝類,Integer是java為int提供的封裝類。int的默認(rèn)值為0,而Integer的默認(rèn)值為null,即Integer能夠區(qū)分出未賦值和值為0的區(qū)別,int則無法表示出未賦值的情況。例如,要想表示出沒有參加考試和考試成績?yōu)?的區(qū)別,則只能使用Integer。在JSP開發(fā)中,Integer的默認(rèn)為null,因此用el表示式在文本框中顯示時,值為空白字符串,而int默認(rèn)的默認(rèn)值為0,因此用el表示式在文本框中顯示時,結(jié)果為0,因此,int不適合作為web層的表單數(shù)據(jù)的類型。在Hibernate中,如果將OID定義為Integer類型,那么Hibernate就能夠根據(jù)其值是否為null而判斷一個對象是否是臨時的,如果將OID定義為了int類型,還需要在hbm映射文件中設(shè)置其unsaved-value屬性為0。另外,Integer提供了多個與整數(shù)相關(guān)的操作方法,例如,將一個字符串轉(zhuǎn)換成整數(shù),Integer中還定義了表示整數(shù)的最大值和最小值的常量。15、Math.round(11.5)等於多少?Math.round(-11.5)等於多少?Math類中提供了三個與取整有關(guān)的方法:ceil、floor、round,這些方法的作用與它們的英文名稱的含義相對應(yīng),例如,ceil的英文意義是天花板,該方法就表示向上取整,Math.ceil(11.3)的結(jié)果為12,Math.ceil(-11.3)的結(jié)果是-11;floor的英文意義是地板,該方法就表示向下取整,Math.ceil(11.6)的結(jié)果為11,Math.ceil(-11.6)的結(jié)果是-12;最難掌握的是round方法,它表示“四舍五入”,算法為Math.floor(x+0.5),即將原來的數(shù)字加上0.5后再向下取整,因此,Math.round(11.5)的結(jié)果為12,Math.round(-11.5)的結(jié)果為-11。16、下面的代碼有什么不妥之處?1.if(username.equals(“zxx”){}2.intx=1;returnx==1?true:false;17、請說出作用域public,private,protected,以及不寫時的區(qū)別這四個作用域的可見范圍如下表所示。說明:如果在修飾的元素上面沒有寫任何訪問修飾符,則表示friendly。作用域當(dāng)前類同一package子孫類其它packagepublic√√√√protected√√√×friendly√√××private√×××18、Overload和Override的區(qū)別。Overloaded的方法是否能夠改變返回值的類型?重載Overload表示同一個類中能夠有多個名稱相同的方法,但這些方法的參數(shù)列表各不相同(即參數(shù)個數(shù)或類型不同)。重寫Override表示子類中的方法能夠與父類中的某個方法的名稱和參數(shù)完全相同,經(jīng)過子類創(chuàng)立的實例對象調(diào)用這個方法時,將調(diào)用子類中的定義方法,這相當(dāng)于把父類中定義的那個完全相同的方法給覆蓋了,這也是面向?qū)ο缶幊痰亩鄳B(tài)性的一種表現(xiàn)。在覆蓋要注意以下的幾點:1、覆蓋的方法的標(biāo)志必須要和被覆蓋的方法的標(biāo)志完全匹配,才能達(dá)到覆蓋的效果;2、覆蓋的方法的返回值必須和被覆蓋的方法的返回一致;3、覆蓋的方法所拋出的異常必須和被覆蓋方法的所拋出的異常一致,或者是其子類;4、被覆蓋的方法不能為private,否則在其子類中只是新定義了一個方法,并沒有對其進行覆蓋。在使用重載要注意以下的幾點:1、在使用重載時只能經(jīng)過不同的參數(shù)樣式。例如,不同的參數(shù)類型,不同的參數(shù)個數(shù),不同的參數(shù)順序(當(dāng)然,同一方法內(nèi)的幾個參數(shù)類型必須不一樣,例如能夠是fun(int,float),可是不能為fun(int,int));2、不能經(jīng)過訪問權(quán)限、返回類型、拋出的異常進行重載;3、方法的異常類型和數(shù)目不會對重載造成影響;4、對于繼承來說,如果某一方法在父類中是訪問權(quán)限是priavte,那么就不能在子類對其進行重載,如果定義的話,也只是定義了一個新方法,而不會達(dá)到重載的效果。如果幾個Overloaded的方法的參數(shù)列表不一樣,它們的返回者類型當(dāng)然也能夠不一樣。如果兩個方法的參數(shù)列表完全一樣,是否能夠讓它們的返回值不同來實現(xiàn)重載Overload。這是不行的19、構(gòu)造器Constructor是否可被override?構(gòu)造器Constructor不能被繼承,因此不能重寫Override,但能夠被重載Overload。20、接口是否可繼承接口?抽象類是否可實現(xiàn)(implements)接口?抽象類是否可繼承具體類(concreteclass)?抽象類中是否能夠有靜態(tài)的main方法?接口能夠繼承接口。抽象類能夠?qū)崿F(xiàn)(implements)接口,抽象類是否可繼承具體類。抽象類中能夠有靜態(tài)的main方法。只有記住抽象類與普通類的唯一區(qū)別就是不能創(chuàng)立實例對象和允許有abstract方法。21、寫clone()方法時,一般都有一行代碼,是什么?clone有缺省行為,super.clone();因為首先要把父類中的成員復(fù)制到位,然后才是復(fù)制自己的成員。22、面向?qū)ο蟮奶卣饔心男┓矫婷嫦驅(qū)ο蟮木幊陶Z言有4個主要的特征。1封裝:封裝是保證軟件部件具有優(yōu)良的模塊性的基礎(chǔ),封裝的目標(biāo)就是要實現(xiàn)軟件部件的“高內(nèi)聚、低耦合”,防止程序相互依賴性而帶來的變動影響。把握一個原則:把對同一事物進行操作的方法和相關(guān)的方法放在同一個類中,把方法和它操作的數(shù)據(jù)放在同一個類中。抽象:抽象就是找出一些事物的相似和共性之處,然后將這些事物歸為一個類,這個類只考慮這些事物的相似和共性之處,而且會忽略與當(dāng)前主題和目標(biāo)無關(guān)的那些方面,將注意力集中在與當(dāng)前目標(biāo)有關(guān)的方面。繼承:在定義和實現(xiàn)一個類的時候,能夠在一個已經(jīng)存在的類的基礎(chǔ)之上來進行,把這個已經(jīng)存在的類所定義的內(nèi)容作為自己的內(nèi)容,并能夠加入若干新的內(nèi)容,或修改原來的方法使之更適合特殊的需要,這就是繼承。繼承是子類自動共享父類數(shù)據(jù)和方法的機制,這是類之間的一種關(guān)系,提高了軟件的可重用性和可擴展性。多態(tài):多態(tài)是指程序中定義的引用變量所指向的具體類型和經(jīng)過該引用變量發(fā)出的方法調(diào)用在編程時并不確定,而是在程序運行期間才確定,即一個引用變量倒底會指向哪個類的實例對象,該引用變量發(fā)出的方法調(diào)用到底是哪個類中實現(xiàn)的方法,必須在由程序運行期間才能決定。因為在程序運行時才確定具體的類,這樣,不用修改源程序代碼,就能夠讓引用變量綁定到各種不同的類實現(xiàn)上,從而導(dǎo)致該引用調(diào)用的具體方法隨之改變,即不修改程序代碼就能夠改變程序運行時所綁定的具體代碼,讓程序能夠選擇多個運行狀態(tài),這就是多態(tài)性。多態(tài)性增強了軟件的靈活性和擴展性。23、java中實現(xiàn)多態(tài)的機制是什么?靠的是父類或接口定義的引用變量能夠指向子類或具體實現(xiàn)類的實例對象,而程序調(diào)用的方法在運行期才動態(tài)綁定,就是引用變量所指向的具體實例對象的方法,也就是內(nèi)存里正在運行的那個對象的方法,而不是引用變量的類型中定義的方法。24、abstractclass和interface有什么區(qū)別?含有abstract修飾符的class即為抽象類,abstract類不能創(chuàng)立的實例對象。含有abstract方法的類必須定義為abstractclass,abstractclass類中的方法不必是抽象的。abstractclass類中定義抽象方法必須在具體(Concrete)子類中實現(xiàn),因此,不能有抽象構(gòu)造方法或抽象靜態(tài)方法。如果的子類沒有實現(xiàn)抽象父類中的所有抽象方法,那么子類也必須定義為abstract類型。接口(interface)能夠說成是抽象類的一種特例,接口中的所有方法都必須是抽象的。接口中的方法定義默認(rèn)為publicabstract類型,接口中的成員變量類型默認(rèn)為publicstaticfinal。下面比較一下兩者的語法區(qū)別:1.抽象類能夠有構(gòu)造方法,接口中不能有構(gòu)造方法。2.抽象類中能夠有普通成員變量,接口中沒有普通成員變量3.抽象類中能夠包含非抽象的普通方法,接口中的所有方法必須都是抽象的,不能有非抽象的普通方法。4.抽象類中的抽象方法的訪問類型能夠是public,protected和(默認(rèn)類型,雖然eclipse下不報錯,但應(yīng)該也不行),但接口中的抽象方法只能是public類型的,而且默認(rèn)即為publicabstract類型。5.抽象類中能夠包含靜態(tài)方法,接口中不能包含靜態(tài)方法6.抽象類和接口中都能夠包含靜態(tài)成員變量,抽象類中的靜態(tài)成員變量的訪問類型能夠任意,但接口中定義的變量只能是publicstaticfinal類型,而且默認(rèn)即為publicstaticfinal類型。7.一個類能夠?qū)崿F(xiàn)多個接口,但只能繼承一個抽象類。25、abstract的method是否可同時是static,是否可同時是native,是否可同時是synchronized?abstract的method不能夠是static的,因為抽象的方法是要被子類實現(xiàn)的,而static與子類扯不上關(guān)系!native方法表示該方法要用另外一種依賴平臺的編程語言實現(xiàn)的,不存在著被子類實現(xiàn)的問題,因此,它也不能是抽象的,不能與abstract混用。關(guān)于synchronized與abstract合用的問題,我覺得也不行,因為在我?guī)啄甑膶W(xué)習(xí)和開發(fā)中,從來沒見到過這種情況,而且我覺得synchronized應(yīng)該是作用在一個具體的方法上才有意義。而且,方法上的synchronized同步所使用的同步鎖對象是this,而抽象方法上無法確定this是什么。26、什么是內(nèi)部類?StaticNestedClass和InnerClass的不同。內(nèi)部類就是在一個類的內(nèi)部定義的類,內(nèi)部類中不能定義靜態(tài)成員,內(nèi)部類能夠直接訪問外部類中的成員變量,內(nèi)部類能夠定義在外部類的方法外面,也能夠定義在外部類的方法體中。在方法外部定義的內(nèi)部類前面能夠加上static關(guān)鍵字,從而成為StaticNestedClass,它不再具有內(nèi)部類的特性,所有,從狹義上講,它不是內(nèi)部類。StaticNestedClass與普通類在運行時的行為和功能上沒有什么區(qū)別,只是在編程引用時的語法上有一些差別,它能夠定義成public、protected、默認(rèn)的、private等多種類型,而普通類只能定義成public和默認(rèn)的這兩種類型。在外面引用StaticNestedClass類的名稱為“外部類名.內(nèi)部類名”。在外面不需要創(chuàng)立外部類的實例對象,就能夠直接創(chuàng)立StaticNestedClass,例如,假設(shè)Inner是定義在Outer類中的StaticNestedClass,那么能夠使用如下語句創(chuàng)立Inner類:Outer.Innerinner=newOuter.Inner();由于staticNestedClass不依賴于外部類的實例對象,因此,staticNestedClass能訪問外部類的非static成員變量。當(dāng)在外部類中訪問StaticNestedClass時,能夠直接使用StaticNestedClass的名字,而不需要加上外部類的名字了,在StaticNestedClass中也能夠直接引用外部類的static的成員變量,不需要加上外部類的名字。在靜態(tài)方法中定義的內(nèi)部類也是StaticNestedClass,這時候不能在類前面加static關(guān)鍵字,靜態(tài)方法中的StaticNestedClass與普通方法中的內(nèi)部類的應(yīng)用方式很相似,它除了能夠直接訪問外部類中的static的成員變量,還能夠訪問靜態(tài)方法中的局部變量,可是,該局部變量前必須加final修飾符。27、內(nèi)部類能夠引用它的包含類的成員嗎?有沒有什么限制?完全能夠。如果不是靜態(tài)內(nèi)部類,那沒有什么限制!如果你把靜態(tài)嵌套類當(dāng)作內(nèi)部類的一種特例,那在這種情況下不能夠訪問外部類的普通成員變量,而只能訪問外部類中的靜態(tài)成員,28、AnonymousInnerClass(匿名內(nèi)部類)是否能夠extends(繼承)其它類,是否能夠implements(實現(xiàn))interface(接口)?能夠繼承其它類或?qū)崿F(xiàn)其它接口。不但是能夠,而是必須!29、super.getClass()方法調(diào)用下面程序的輸出結(jié)果是多少?importjava.util.Date;publicclassTestextendsDate{publicstaticvoidmain(String[]args){newTest().test();}publicvoidtest(){System.out.println(super.getClass().getName());}}結(jié)果是Test。在test方法中,直接調(diào)用getClass().getName()方法,返回的是Test類名,由于getClass()在Object類中定義成了final,子類不能覆蓋該方法,因此,在test方法中調(diào)用getClass().getName()方法,其實就是在調(diào)用從父類繼承的getClass()方法,等效于調(diào)用super.getClass().getName()方法,因此,super.getClass().getName()方法返回的也應(yīng)該是Test。如果想得到父類的名稱,應(yīng)該用如下代碼:getClass().getSuperClass().getName();30、String是最基本的數(shù)據(jù)類型嗎?基本數(shù)據(jù)類型包括byte、int、char、long、float、double、boolean和short。java.lang.String類是final類型的,因此不能夠繼承這個類、不能修改這個類。為了提高效率節(jié)省空間,我們應(yīng)該用StringBuffer類31、Strings="Hello";s=s+"world!";這兩行代碼執(zhí)行后,原始的String對象中的內(nèi)容到底變了沒有?沒有。因為String被設(shè)計成不可變(immutable)類,因此它的所有對象都是不可變對象。在這段代碼中,s原先指向一個String對象,內(nèi)容是"Hello",然后我們對s進行了+操作,那么s所指向的那個對象是否發(fā)生了改變呢?答案是沒有。這時,s不指向原來那個對象了,而指向了另一個String對象,內(nèi)容為"Helloworld!",原來那個對象還存在于內(nèi)存之中,只是s這個引用變量不再指向它了。32、是否能夠繼承String類?String類是final類故不能夠繼承。33、Strings=newString("xyz");創(chuàng)立了幾個StringObject?二者之間有什么區(qū)別?兩個或一個,”xyz”對應(yīng)一個對象,這個對象放在字符串常量緩沖區(qū),常量”xyz”不論出現(xiàn)多少遍,都是緩沖區(qū)中的那一個。NewString每寫一遍,就創(chuàng)立一個新的對象,它一句那個常量”xyz”對象的內(nèi)容來創(chuàng)立出一個新String對象。如果以前就用過’xyz’,這句代表就不會創(chuàng)立”xyz”自己了,直接從緩沖區(qū)拿。34、String和StringBuffer的區(qū)別JAVA平臺提供了兩個類:String和StringBuffer,它們能夠儲存和操作字符串,即包含多個字符的字符數(shù)據(jù)。這個String類提供了數(shù)值不可改變的字符串。而這個StringBuffer類提供的字符串進行修改。當(dāng)你知道字符數(shù)據(jù)要改變的時候你就能夠使用StringBuffer。典型地,你能夠使用StringBuffers來動態(tài)構(gòu)造字符數(shù)據(jù)。另外,String實現(xiàn)了equals方法,newString(“abc”).equals(newString(“abc”)的結(jié)果為true,而StringBuffer沒有實現(xiàn)equals方法,因此,newStringBuffer(“abc”).equals(newStringBuffer(“abc”)的結(jié)果為false。接著要舉一個具體的例子來說明,我們要把1到100的所有數(shù)字拼起來,組成一個串。StringBuffersbf=newStringBuffer();for(inti=0;i<100;i++){sbf.append(i);}上面的代碼效率很高,因為只創(chuàng)立了一個StringBuffer對象,而下面的代碼效率很低,因為創(chuàng)立了101個對象。Stringstr=newString();for(inti=0;i<100;i++){str=str+i;}String覆蓋了equals方法和hashCode方法,而StringBuffer沒有覆蓋equals方法和hashCode方法,因此,將StringBuffer對象存儲進Java集合類中時會出現(xiàn)問題。35、如何把一段逗號分割的字符串轉(zhuǎn)換成一個數(shù)組?如果不查jdkapi,我很難寫出來!我能夠說說我的思路:1 用正則表示式,代碼大概為:String[]result=orgStr.split(“,”);2 用StingTokenizer,代碼為:StringTokenizertokener=StringTokenizer(orgStr,”,”);String[]result=newString[tokener.countTokens()];Inti=0;while(tokener.hasNext(){result[i++]=toker.nextToken();}36、數(shù)組有沒有l(wèi)ength()這個方法?String有沒有l(wèi)ength()這個方法?數(shù)組沒有l(wèi)ength()這個方法,有l(wèi)ength的屬性。String有有l(wèi)ength()這個方法。37、下面這條語句一共創(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");第一條語句打印的結(jié)果為false,第二條語句打印的結(jié)果為true,這說明javac編譯能夠?qū)ψ址A恐苯酉嗉拥谋硎臼竭M行優(yōu)化,不必要等到運行期去進行加法運算處理,而是在編譯時去掉其中的加號,直接將其編譯成一個這些常量相連的結(jié)果。題目中的第一行代碼被編譯器在編譯時優(yōu)化后,相當(dāng)于直接定義了一個”abcd”的字符串,因此,上面的代碼應(yīng)該只創(chuàng)立了一個String對象。寫如下兩行代碼,Strings="a"+"b"+"c"+"d";System.out.println(s=="abcd");最終打印的結(jié)果應(yīng)該為true。38、try{}里有一個return語句,那么緊跟在這個try后的finally{}里的code會不會被執(zhí)行,什么時候被執(zhí)行,在return前還是后?結(jié)論:finally中的代碼比return和break語句后執(zhí)行40、final,finally,finalize的區(qū)別。final用于聲明屬性,方法和類,分別表示屬性不可變,方法不可覆蓋,類不可繼承。內(nèi)部類要訪問局部變量,局部變量必須定義成final類型。finally是異常處理語句結(jié)構(gòu)的一部分,表示總是執(zhí)行。finalize是Object類的一個方法,在垃圾收集器執(zhí)行的時候會調(diào)用被回收對象的此方法,能夠覆蓋此方法提供垃圾收集時的其它資源回收,例如關(guān)閉文件等。JVM不保證此方法總被調(diào)用41、運行時異常與一般異常有何異同?異常表示程序運行過程中可能出現(xiàn)的非正常狀態(tài),運行時異常表示虛擬機的一般操作中可能遇到的異常,是一種常見運行錯誤。java編譯器要求方法必須聲明拋出可能發(fā)生的非運行時異常,可是并不要求必須聲明拋出未被捕獲的運行時異常。42、error和exception有什么區(qū)別?error表示恢復(fù)不是不可能但很困難的情況下的一種嚴(yán)重問題。比如說內(nèi)存溢出。不可能指望程序能處理這樣的情況。exception表示一種設(shè)計或?qū)崿F(xiàn)問題。也就是說,它表示如果程序運行正常,從不會發(fā)生的情況。43、Java中的異常處理機制的簡單原理和應(yīng)用。異常是指java程序運行時(非編譯)所發(fā)生的非正常情況或錯誤。Java對異常進行了分類,不同類型的異常分別用不同的Java類表示,所有異常的根類為java.lang.Throwable,Throwable下面又派生了兩個子類:Error和Exception,Error表示應(yīng)用程序本身無法克服和恢復(fù)的一種嚴(yán)重問題,程序只有死的份了,例如,說內(nèi)存溢出和線程死鎖等系統(tǒng)問題。Exception表示程序還能夠克服和恢復(fù)的問題,其中又分為系統(tǒng)異常和普通異常,系統(tǒng)異常是軟件本身缺陷所導(dǎo)致的問題,也就是軟件開發(fā)人員考慮不周所導(dǎo)致的問題,軟件使用者無法克服和恢復(fù)這種問題,但在這種問題下還能夠讓軟件系統(tǒng)繼續(xù)運行或者讓軟件死掉,例如,數(shù)組腳本越界(ArrayIndexOutOfBoundsException),空指針異常(NullPointerException)、類轉(zhuǎn)換異常(ClassCastException);普通異常是運行環(huán)境的變化或異常所導(dǎo)致的問題,是用戶能夠克服的問題,例如,網(wǎng)絡(luò)斷線,硬盤空間不夠,發(fā)生這樣的異常后,程序不應(yīng)該死掉。java為系統(tǒng)異常和普通異常提供了不同的解決方案,編譯器強制普通異常必須try..catch處理或用throws聲明繼續(xù)拋給上層調(diào)用方法處理,因此普通異常也稱為checked異常,而系統(tǒng)異常能夠處理也能夠不處理,因此,編譯器不強制用try..catch處理或用throws聲明,因此系統(tǒng)異常也稱為unchecked異常。44、請寫出你最常見到的5個runtimeexception。所謂系統(tǒng)異常,就是…..,它們都是RuntimeException的子類,在jdkdoc中查RuntimeException類,就能夠看到其所有的子類列表,也就是看到了所有的系統(tǒng)異常。我比較有印象的系統(tǒng)異常有:NullPointerException、ArrayIndexOutOfBoundsException、ClassCastException。45、JAVA語言如何進行異常處理,關(guān)鍵字:throws,throw,try,catch,finally分別代表什么意義?在try塊中能夠拋出異常嗎?46、java中有幾種方法能夠?qū)崿F(xiàn)一個線程?用什么關(guān)鍵字修飾同步方法?stop()和suspend()方法為何不推薦使用?java5以前,有如下兩種:第一種:newThread(){}.start();這表示調(diào)用Thread子類對象的run方法,newThread(){}表示一個Thread的匿名子類的實例對象,子類加上run方法后的代碼如下:newThread(){publicvoidrun(){}}.start();第二種:newThread(newRunnable(){}).start();這表示調(diào)用Thread對象接受的Runnable對象的run方法,newRunnable(){}表示一個Runnable的匿名子類的實例對象,runnable的子類加上run方法后的代碼如下:newThread(newRunnable(){publicvoidrun(){}}).start();從java5開始,還有如下一些線程池創(chuàng)立多線程的方式:ExecutorServicepool=Executors.newFixedThreadPool(3)for(inti=0;i<10;i++){pool.execute(newRunable(){publicvoidrun(){}});}Executors.newCachedThreadPool().execute(newRunable(){publicvoidrun(){}});Executors.newSingleThreadExecutor().execute(newRunable(){publicvoidrun(){}});有兩種實現(xiàn)方法,分別使用newThread()和newThread(runnable)形式,第一種直接調(diào)用thread的run方法,因此,我們往往使用Thread子類,即newSubThread()。第二種調(diào)用runnable的run方法。有兩種實現(xiàn)方法,分別是繼承Thread類與實現(xiàn)Runnable接口用synchronized關(guān)鍵字修飾同步方法反對使用stop(),是因為它不安全。它會解除由線程獲取的所有鎖定,而且如果對象處于一種不連貫狀態(tài),那么其它線程能在那種狀態(tài)下檢查和修改它們。結(jié)果很難檢查出真正的問題所在。suspend()方法容易發(fā)生死鎖。調(diào)用suspend()的時候,目標(biāo)線程會停下來,但卻依然持有在這之前獲得的鎖定。此時,其它任何線程都不能訪問鎖定的資源,除非被"掛起"的線程恢復(fù)運行。對任何線程來說,如果它們想恢復(fù)目標(biāo)線程,同時又試圖使用任何一個鎖定的資源,就會造成死鎖。因此不應(yīng)該使用suspend(),而應(yīng)在自己的Thread類中置入一個標(biāo)志,指出線程應(yīng)該活動還是掛起。若標(biāo)志指出線程應(yīng)該掛起,便用wait()命其進入等待狀態(tài)。若標(biāo)志指出線程應(yīng)當(dāng)恢復(fù),則用一個notify()重新啟動線程。47、sleep()和wait()有什么區(qū)別?(網(wǎng)上的答案:sleep是線程類(Thread)的方法,導(dǎo)致此線程暫停執(zhí)行指定時間,給執(zhí)行機會給其它線程,可是監(jiān)控狀態(tài)依然保持,到時后會自動恢復(fù)。調(diào)用sleep不會釋放對象鎖。wait是Object類的方法,對此對象調(diào)用wait方法導(dǎo)致本線程放棄對象鎖,進入等待此對象的等待鎖定池,只有針對此對象發(fā)出notify方法(或notifyAll)后本線程才進入對象鎖定池準(zhǔn)備獲得對象鎖進入運行狀態(tài)。)48、同步和異步有何異同,在什么情況下分別使用她們?舉例說明。如果數(shù)據(jù)將在線程間共享。例如正在寫的數(shù)據(jù)以后可能被另一個線程讀到,或者正在讀的數(shù)據(jù)可能已經(jīng)被另一個線程寫過了,那么這些數(shù)據(jù)就是共享數(shù)據(jù),必須進行同步存取。當(dāng)應(yīng)用程序在對象上調(diào)用了一個需要花費很長時間來執(zhí)行的方法,而且不希望讓程序等待方法的返回時,就應(yīng)該使用異步編程,在很多情況下采用異步途徑往往更有效率。49.下面兩個方法同步嗎?(自己創(chuàng)造)classTest{synchronizedstaticvoidsayHello3(){}synchronizedvoidgetX(){}}50、多線程有幾種實現(xiàn)方法?同步有幾種實現(xiàn)方法?多線程有兩種實現(xiàn)方法,分別是繼承Thread類與實現(xiàn)Runnable接口同步的實現(xiàn)方面有兩種,分別是synchronized,wait與notifywait():使一個線程處于等待狀態(tài),而且釋放所持有的對象的lock。sleep():使一個正在運行的線程處于睡眠狀態(tài),是一個靜態(tài)方法,調(diào)用此方法要捕捉InterruptedException異常。notify():喚醒一個處于等待狀態(tài)的線程,注意的是在調(diào)用此方法的時候,并不能確切的喚醒某一個等待狀態(tài)的線程,而是由JVM確定喚醒哪個線程,而且不是按優(yōu)先級。Allnotity():喚醒所有處入等待狀態(tài)的線程,注意并不是給所有喚醒線程一個對象的鎖,而是讓它們競爭51、啟動一個線程是用run()還是start()?.啟動一個線程是調(diào)用start()方法,使線程就緒狀態(tài),以后能夠被調(diào)度為運行狀態(tài),一個線程必須關(guān)聯(lián)一些具體的執(zhí)行代碼,run()方法是該線程所關(guān)聯(lián)的執(zhí)行代碼。52、當(dāng)一個線程進入一個對象的一個synchronized方法后,其它線程是否可進入此對象的其它方法?分幾種情況:1.其它方法前是否加了synchronized關(guān)鍵字,如果沒加,則能。2.如果這個方法內(nèi)部調(diào)用了wait,則能夠進入其它synchronized方法。3.如果其它個方法都加了synchronized關(guān)鍵字,而且內(nèi)部沒有調(diào)用wait,則不能。4.如果其它方法是static,它用的同步鎖是當(dāng)前類的字節(jié)碼,與非靜態(tài)的方法不能同步,因為非靜態(tài)的方法用的是this。53、線程的基本概念、線程的基本狀態(tài)以及狀態(tài)之間的關(guān)系一個程序中能夠有多條執(zhí)行線索同時執(zhí)行,一個線程就是程序中的一條執(zhí)行線索,每個線程上都關(guān)聯(lián)有要執(zhí)行的代碼,即能夠有多段程序代碼同時運行,每個程序至少都有一個線程,即main方法執(zhí)行的那個線程。如果只是一個cpu,它怎么能夠同時執(zhí)行多段程序呢?這是從宏觀上來看的,cpu一會執(zhí)行a線索,一會執(zhí)行b線索,切換時間很快,給人的感覺是a,b在同時執(zhí)行,好比大家在同一個辦公室上網(wǎng),只有一條鏈接到外部網(wǎng)線,其實,這條網(wǎng)線一會為a傳數(shù)據(jù),一會為b傳數(shù)據(jù),由于切換時間很短暫,因此,大家感覺都在同時上網(wǎng)。狀態(tài):就緒,運行,synchronize阻塞,wait和sleep掛起,結(jié)束。wait必須在synchronized內(nèi)部調(diào)用。調(diào)用線程的start方法后線程進入就緒狀態(tài),線程調(diào)度系統(tǒng)將就緒狀態(tài)的線程轉(zhuǎn)為運行狀態(tài),遇到synchronized語句時,由運行狀態(tài)轉(zhuǎn)為阻塞,當(dāng)synchronized獲得鎖后,由阻塞轉(zhuǎn)為運行,在這種情況能夠調(diào)用wait方法轉(zhuǎn)為掛起狀態(tài),當(dāng)線程關(guān)聯(lián)的代碼執(zhí)行完后,線程變?yōu)榻Y(jié)束狀態(tài)。54、簡述synchronized和java.util.concurrent.locks.Lock的異同?主要相同點:Lock能完成synchronized所實現(xiàn)的所有功能主要不同點:Lock有比synchronized更精確的線程語義和更好的性能。synchronized會自動釋放鎖,而Lock一定要求程序員手工釋放,而且必須在finally從句中釋放。Lock還有更強大的功能,例如,它的tryLock方法能夠非阻塞方式去拿鎖。55、設(shè)計4個線程,其中兩個線程每次對j增加1,另外兩個線程對j每次減少1。寫出程序。以下程序使用內(nèi)部類實現(xiàn)線程,對j增減的時候沒有考慮順序問題。56、子線程循環(huán)10次,接著主線程循環(huán)100,接著又回到子線程循環(huán)10次,接著再回到主線程又循環(huán)100,如此循環(huán)50次,請寫出程序。57、介紹Collection框架的結(jié)構(gòu)答:隨意發(fā)揮題,天南海北誰便談,只要讓別覺得你知識淵博,理解透徹即可。58、Collection框架中實現(xiàn)比較要實現(xiàn)什么接口comparable/comparator59、ArrayList和Vector的區(qū)別答:這兩個類都實現(xiàn)了List接口(List接口繼承了Collection接口),她們都是有序集合,即存儲在這兩個集合中的元素的位置都是有順序的,相當(dāng)于一種動態(tài)的數(shù)組,我們以后能夠按位置索引號取出某個元素,,而且其中的數(shù)據(jù)是允許重復(fù)的,這是HashSet之類的集合的最大不同處,HashSet之類的集合不能夠按索引號去檢索其中的元素,也不允許有重復(fù)的元素(原來題目問的與hashset沒有任何關(guān)系,但為了說清楚ArrayList與Vector的功能,我們使用對比喻式,更有利于說明問題)。接著才說ArrayList與Vector的區(qū)別,這主要包括兩個方面:.(1)同步性:Vector是線程安全的,也就是說是它的方法之間是線程同步的,而ArrayList是線程序不安全的,它的方法之間是線程不同步的。如果只有一個線程會訪問到集合,那最好是使用ArrayList,因為它不考慮線程安全,效率會高些;如果有多個線程會訪問到集合,那最好是使用Vector,因為不需要我們自己再去考慮和編寫線程安全的代碼。備注:對于Vector&ArrayList、Hashtable&HashMap,要記住線程安全的問題,記住Vector與Hashtable是舊的,是java一誕生就提供了的,它們是線程安全的,ArrayList與HashMap是java2時才提供的,它們是線程不安全的。因此,我們講課時先講老的。(2)數(shù)據(jù)增長:ArrayList與Vector都有一個初始的容量大小,當(dāng)存儲進它們里面的元素的個數(shù)超過了容量時,就需要增加ArrayList與Vector的存儲空間,每次要增加存儲空間時,不是只增加一個存儲單元,而是增加多個存儲單元,每次增加的存儲單元的個數(shù)在內(nèi)存空間利用與程序效率之間要取得一定的平衡。Vector默認(rèn)增長為原來兩倍,而ArrayList的增長策略在文檔中沒有明確規(guī)定(從源代碼看到的是增長為原來的1.5倍)。ArrayList與Vector都能夠設(shè)置初始的空間大小,Vector還能夠設(shè)置增長的空間大小,而ArrayList沒有提供設(shè)置增長空間的方法??偨Y(jié):即Vector增長原來的一倍,ArrayList增加原來的0.5倍。60、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或value61、List和Map區(qū)別?一個是存儲單列數(shù)據(jù)的集合,另一個是存儲鍵和值這樣的雙列數(shù)據(jù)的集合,List中存儲的數(shù)據(jù)是有順序,而且允許重復(fù);Map中存儲的數(shù)據(jù)是沒有順序的,其鍵是不能重復(fù)的,它的值是能夠有重復(fù)的。62、List,Set,Map是否繼承自Collection接口?List,Set是,Map不是63、List、Map、Set三個接口,存取元素時,各有什么特點?首先,List與Set具有相似性,它們都是單列元素的集合,因此,它們有一個功共同的父接口,叫Collection。Set里面不允許有重復(fù)的元素,所謂重復(fù),即不能有兩個相等(注意,不是僅僅是相同)的對象List表示有先后順序的集合,注意,不是那種按年齡、按大小、按價格之類的排序。當(dāng)我們多次調(diào)用add(Obje)方法時,每次加入的對象就像火車站買票有排隊順序一樣,按先來后到的順序排序。有時候,也能夠插隊,即調(diào)用add(intindex,Obje)方法,就能夠指定當(dāng)前對象在集合中的存放位置。一個對象能夠被重復(fù)存儲進List中,每調(diào)用一次add方法,這個對象就被插入進集合中一次,其實,并不是把這個對象本身存儲進了集合中,而是在集合中用一個索引變量指向這個對象,當(dāng)這個對象被add多次時,即相當(dāng)于集合中有多個索引指向了這個對象。List除了能夠以Iterator接口取得所有的元素,再逐一遍歷各個元素之外,還能夠調(diào)用get(indexi)來明確說明取第幾個。Map與List和Set不同,它是雙列的集合,其中有put方法,定義如下:put(objkey,objvalue),每次存儲時,要存儲一對key/value,不能存儲重復(fù)的key,這個重復(fù)的規(guī)則也是按equals比較相等。取則能夠根據(jù)key獲得相應(yīng)的value,即get(Objectkey)返回值為key所對應(yīng)的value。另外,也能夠獲得所有的key的結(jié)合,還能夠獲得所有的value的結(jié)合,還能夠獲得key和value組合成的Map.Entry對象的集合。List以特定次序來持有元素,可有重復(fù)元素。Set無法擁有重復(fù)元素,內(nèi)部排序。Map保存key-value值,value可多值。HashSet按照hashcode值的某種運算方式進行存儲,而不是直接按hashCode值的大小進行存儲。例如,"abc">78,"def">62,"xyz">65在hashSet中的存儲順序不是62,65,78,這些問題感謝以前一個叫崔健的學(xué)員提出,最后經(jīng)過查看源代碼給她解釋清楚,看本次培訓(xùn)學(xué)員當(dāng)中有多少能看懂源碼。LinkedHashSet按插入的順序存儲,那被存儲對象的hashcode方法還有什么作用呢?學(xué)員想想!hashset集合比較兩個對象是否相等,首先看hashcode方法是否相等,然后看equals方法是否相等。new兩個Student插入到HashSet中,看HashSet的size,實現(xiàn)hashcode和equals方法后再看size。同一個對象能夠在Vector中加入多次。往集合里面加元素,相當(dāng)于集合里用一根繩子連接到了目標(biāo)對象。往HashSet中卻加不了多次的。64、說出ArrayList,Vector,LinkedList的存儲性能和特性ArrayList和Vector都是使用數(shù)組方式存儲數(shù)據(jù),此數(shù)組元素數(shù)大于實際存儲的數(shù)據(jù)以便增加和插入元素,它們都允許直接按序號索引元素,可是插入元素要涉及數(shù)組元素移動等內(nèi)存操作,因此索引數(shù)據(jù)快而插入數(shù)據(jù)慢,Vector由于使用了synchronized方法(線程安全),一般性能上較ArrayList差,而LinkedList使用雙向鏈表實現(xiàn)存儲,按序號索引數(shù)據(jù)需要進行前向或后向遍歷,可是插入數(shù)據(jù)時只需要記錄本項的前后項即可,因此插入速度較快。LinkedList也是線程不安全的,LinkedList提供了一些方法,使得LinkedList能夠被當(dāng)作堆棧和隊列來使用。65、去掉一個Vector集合中重復(fù)的元素VectornewVector=newVector();For(inti=0;i<vector.size();i++){Objectobj=vector.get(i);if(!newVector.contains(obj);newVector.add(obj);}還有一種簡單的方式,HashSetset=newHashSet(vector);66、Collection和Collections的區(qū)別。Collection是集合類的上級接口,繼承與她的接口主要有Set和List.Collections是針對集合類的一個幫助類,她提供一系列靜態(tài)方法實現(xiàn)對各種集合的搜索、排序、線程安全化等操作。67、Set里的元素是不能重復(fù)的,那么用什么方法來區(qū)分重復(fù)與否呢?是用==還是equals()?它們有何區(qū)別?Set里的元素是不能重復(fù)的,元素重復(fù)與否是使用equals()方法進行判斷的。equals()和==方法決定引用值是否指向同一對象equals()在類中被覆蓋,為的是當(dāng)兩個分離的對象的內(nèi)容和類型相配的話,返回真值68、你所知道的集合類都有哪些?主要方法?最常見的集合類是List和Map。List的具體實現(xiàn)包括ArrayList和Vector,它們是可變大小的列表,比較適合構(gòu)建、存儲和操作任何類型對象的元素列表。List適用于按數(shù)值索引訪問元素的情形。Map提供了一個更通用的元素存儲方法。Map集合類用于存儲元素對(稱作"鍵"和"值"),其中每個鍵映射到一個值。ArrayList/VectoràListàCollectionHashSet/TreeSetàSetPropetiesàHashTableàMapTreemap/HashMap我記的不是方法名,而是思想,我知道它們都有增刪改查的方法,但這些方法的具體名稱,我記得不是很清楚,對于set,大概的方法是add,remove,contains;對于map,大概的方法就是put,remove,contains等,因為,我只要在eclispe下按點操作符,很自然的這些方法就出來了。我記住的一些思想就是List類會有g(shù)et(intindex)這樣的方法,因為它能夠按順序取元素,而set類中沒有g(shù)et(intindex)這樣的方法。List和set都能夠迭代出所有元素,迭代時先要得到一個iterator對象,因此,set和list類都有一個iterator方法,用于返回那個iterator對象。map能夠返回三個集合,一個是返回所有的key的集合,另外一個返回的是所有value的集合,再一個返回的key和value組合成的EntrySet對象的集合,map也有g(shù)et方法,參數(shù)是key,返回值是key對應(yīng)的value。69、兩個對象值相同(x.equals(y)==true),但卻可有不同的hashcode,這句話對不對?對。如果對象要保存在HashSet或HashMap中,它們的equals相等,那么,它們的hashcode值就必須相等。如果不是要保存在HashSet或HashMap,則與hashcode沒有什么關(guān)系了,這時候hashcode不等是能夠的,例如arrayList存儲的對象就不用實現(xiàn)hashcode,當(dāng)然,我們沒有理由不實現(xiàn),一般都會去實現(xiàn)的。70、TreeSet里面放對象,如果同時放入了父類和子類的實例對象,那比較時使用的是父類的compareTo方法,還是使用的子類的compareTo方法,還是拋異常?。☉?yīng)該是沒有針對問題的確切的答案,當(dāng)前的add方法放入的是哪個對象,就調(diào)用哪個對象的compareTo方法,至于這個compareTo方法怎么做,就看當(dāng)前這個對象的類中是如何編寫這個方法的)71、說出一些常見的類,包,接口,請各舉5個要讓人家感覺你對javaee開發(fā)很熟,因此,不能僅僅只列corejava中的那些東西,要多列你在做ssh項目中涉及的那些東西。就寫你最近寫的那些程序中涉及的那些類。常見的類:BufferedReaderBufferedWriterFileReaderFileWirterStringIntegerjava.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),HttpSession72、java中有幾種類型的流?JDK為每種類型的流提供了一些抽象類以供繼承,請說出她們分別是哪些類?字節(jié)流,字符流。字節(jié)流繼承于InputStreamOutputStream,字符流繼承于InputStreamReaderOutputStreamWriter。在java.io包中還有許多其它的流,主要是為了提高性能和使用方便。73、字節(jié)流與字符流的區(qū)別要把一片二進制數(shù)據(jù)數(shù)據(jù)逐一輸出到某個設(shè)備中,或者從某個設(shè)備中逐一讀取一片二進制數(shù)據(jù),不論輸入輸出設(shè)備是什么,我們要用統(tǒng)一的方式來完成這些操作,用一種抽象的方式進行描述,這個抽象描述方式起名為IO流,對應(yīng)的抽象類為OutputStream和InputStream,不同的實現(xiàn)類就代表不同的輸入和輸出設(shè)備,它們都是針對字節(jié)進行操作的。在應(yīng)用中,經(jīng)常要完全是字符的一段文本輸出去或讀進來,用字節(jié)流能夠嗎?計算機中的一切最終都是二進制的字節(jié)形式存在。對于“中國”這些字符,首先要得到其對應(yīng)的字節(jié),然后將字節(jié)寫入到輸出流。讀取時,首先讀到的是字節(jié),可是我們要把它顯示為字符,我們需要將字節(jié)轉(zhuǎn)換成字符。由于這樣的需求很廣泛,人家專門提供了字符流的包裝類。底層設(shè)備永遠(yuǎn)只接受字節(jié)數(shù)據(jù),有時候要寫字符串到底層設(shè)備,需要將字符串轉(zhuǎn)成字節(jié)再進行寫入。字符流是字節(jié)流的包裝,字符流則是直接接受字符串,它內(nèi)部將串轉(zhuǎn)成字節(jié),再寫入底層設(shè)備,這為我們向IO設(shè)別寫入或讀取字符串提供了一點點方便。74、什么是java序列化,如何實現(xiàn)java序列化?或者請解釋Serializable接口的作用。我們有時候?qū)⒁粋€java對象變成字節(jié)流的形式傳出去或者從一個字節(jié)流中恢復(fù)成一個java對象,例如,要將java對象存儲到硬盤或者傳送給網(wǎng)絡(luò)上的其它計算機,這個過程我們能夠自己寫代碼去把一個java對象變成某個格式的字節(jié)流再傳輸,可是,jre本身就提供了這種支持,我們能夠調(diào)用OutputStream的writeObject方法來做,如果要讓java幫我們做,要被傳輸?shù)膶ο蟊仨殞崿F(xiàn)serializable接口,這樣,javac編譯時就會進行特殊處理,編譯的類才能夠被writeObject方法操作,這就是所謂的序列化。需要被序列化的類必須實現(xiàn)Serializable接口,該接口是一個mini接口,其中沒有需要實現(xiàn)的方法,implementsSerializable只是為了標(biāo)注該對象是可被序列化的。例如,在web開發(fā)中,如果對象被保存在了Session中,tomcat在重啟時要把Session對象序列化到硬盤,這個對象就必須實現(xiàn)Serializable接口。如果對象要經(jīng)過分布式系統(tǒng)進行網(wǎng)絡(luò)傳輸或經(jīng)過rmi等遠(yuǎn)程調(diào)用,這就需要在網(wǎng)絡(luò)上傳輸對象,被傳輸?shù)膶ο缶捅仨殞崿F(xiàn)Serializable接口。75、描述一下JVM加載class文件的原理機制?JVM中類的裝載是由ClassLoader和它的子類來實現(xiàn)的,JavaClassLoader是一個重要的Java運行時系統(tǒng)組件。它負(fù)責(zé)在運行時查找和裝入類文件的類。76、heap和stack有什么區(qū)別。java的內(nèi)存分為兩類,一類是棧內(nèi)存,一類是堆內(nèi)存。棧內(nèi)存是指程序進入一個方法時,會為這個方法單獨分配一塊私屬存儲空間,用于存儲這個方法內(nèi)部的局部變量,當(dāng)這個方法結(jié)束時,分配給這個方法的棧會釋放,這個棧中的變量也將隨之釋放。堆是與棧作用不同的內(nèi)存,一般用于存放不放在當(dāng)前方法棧中的那些數(shù)據(jù),例如,使用new創(chuàng)立的對象都放在堆里,因此,它不會隨方法的結(jié)束而消失。方法中的局部變量使用final修飾后,放在堆中,而不是棧中。77、GC是什么?為什么要有GC?GC是垃圾收集的意思(GabageCollection),內(nèi)存處理是編程人員容易出現(xiàn)問題的地方,忘記或者錯誤的內(nèi)存回收會導(dǎo)致程序或系統(tǒng)的不穩(wěn)定甚至崩潰,Java提供的GC功能能夠自動監(jiān)測對象是否超過作用域從而達(dá)到自動回收內(nèi)存的目的,Java語言沒有提供釋放已分配內(nèi)存的顯示操作方法。78、垃圾回收的優(yōu)點和原理。并考慮2種回收機制。Java語言中一個顯著的特點就是引入了垃圾回收機制,使c++程序員最頭疼的內(nèi)存管理的問題迎刃而解,它使得Java程序員在編寫程序的時候不再需要考慮內(nèi)存管理。由于有個垃圾回收機制,Java中的對象不再有"作用域"的概念,只有對象的引用才有"作用域"。垃圾回收能夠有效的防止內(nèi)存泄露,有效的使用能夠使用的內(nèi)存。垃圾回收器一般是作為一個單獨的低級別的線程運行,不可預(yù)知的情況下對內(nèi)存堆中已經(jīng)死亡的或者長時間沒有使用的對象進行清楚和回收,程序員不能實時的調(diào)用垃圾回收器對某個對象或所有對象進行垃圾回收?;厥諜C制有分代復(fù)制垃圾回收和標(biāo)記垃圾回收,增量垃圾回收。79、垃圾回收器的基本原理是什么?垃圾回收器能夠馬上回收內(nèi)存嗎?有什么辦法主動通知虛擬機進行垃圾回收?對于GC來說,當(dāng)程序員創(chuàng)立對象時,GC就開始監(jiān)控這個對象的地址、大小以及使用情況。一般,GC采用有向圖的方式記錄和管理堆(heap)中的所有對象。經(jīng)過這種方式確定哪些對象是"可達(dá)的",哪些對象是"不可達(dá)的"。當(dāng)GC確定一些對象為"不可達(dá)"時,GC就有責(zé)任回收這些內(nèi)存空間。能夠。程序員能夠手動執(zhí)行System.gc(),通知GC運行,可是Java語言規(guī)范并不保證GC一定會執(zhí)行。80、什么時候用assert。assertion(斷言)在軟件開發(fā)中是一種常見的調(diào)試方式,很多開發(fā)語言中都支持這種機制。在實現(xiàn)中,assertion就是在程序中的一條語句,它對一個boolean表示式進行檢查,一個正確程序必須保證這個boolean表示式的值為true;如果該值為false,說明程序已經(jīng)處于不正確的狀態(tài)下,assert將給出警告或退出。一般來說,assertion用于保證程序最基本、關(guān)鍵的正確性。assertion檢查一般在開發(fā)和測試時開啟。為了提高性能,在軟件發(fā)布后,assertion檢查一般是關(guān)閉的。81、java中會存在內(nèi)存泄漏嗎,請簡單描述。所謂內(nèi)存泄露就是指一個不再被程序使用的對象或變量一直被占據(jù)在內(nèi)存中。java中有垃圾回收機制,它能夠保證一對象不再被引用的時候,即對象編程了孤兒的時候,對象將自動被垃圾回收器從內(nèi)存中清除掉。由于Java使用有向圖的方式進行垃圾回收管理,能夠消除引用循環(huán)的問題,例如有兩個對象,相互引用,只要它們和根進程不可達(dá)的,那么GC也是能夠回收它們的82、能不能自己寫個類,也叫java.lang.String?能夠,但在應(yīng)用的時候,需要用自己的類加載器去加載,否則,系統(tǒng)的類加載器永遠(yuǎn)只是去加載jre.jar包中的那個java.lang.String。由于在tomcat的web應(yīng)用程序中,都是由webapp自己的類加載器先自己加載WEB-INF/classess目錄中的類,然后才委托上級的類加載器加載,如果我們在tomcat的web應(yīng)用程序中寫一個java.lang.String,這時候Servlet程序加載的就是我們自己寫的java.lang.String,可是這么干就會出很多潛在的問題,原來所有用了java.lang.String類的都將出現(xiàn)問題。例如,運行下面的程序:packagejava.lang;publicclassString{publicstaticvoidmain(String[]args){//TODOAuto-generatedmethodstubSystem.out.println("string");}}報告的錯誤如下:java.lang.NoSuchMethodError:mainExceptioninthread"main"這是因為加載了jre自帶的java.lang.String,而該類中沒有main方法。83.Java代碼查錯1.abstractclassName{privateStringname;publicabstractbooleanisStupidName(Stringname){}}大俠們,這有何錯誤?答案:錯。abstractmethod必須以分號結(jié)尾,且不帶花括號。2.publicclassSomething{voiddoSomething(){privateStrings="";intl=s.length();}}有錯嗎?答案:錯。局部變量前不能放置任何訪問修飾符(private,public,和protected)。final能夠用來修飾局部變量(final如同abstract和strictfp,都是非訪問修飾符,strictfp只能修飾class和method而非variable)。3.abstractclassSomething{privateabstractStringdoSomething();}這仿佛沒什么錯吧?答案:錯。abstract的methods不能以private修飾。abstract的methods就是讓子類implement(實現(xiàn))具體細(xì)節(jié)的,怎么能夠用private把abstractmethod封鎖起來呢?(同理,abstractmethod前不能加final)。4.publicclassSomething{publicintaddOne(finalintx){return++x;}}這個比較明顯。答案:錯。intx被修飾成final,意味著x不能在addOnemethod中被修改。5.publicclassSomething{publicstaticvoidmain(String[]args){Othero=newOther();newSomething().addOne(o);}publicvoidaddOne(finalOthero){o.i++;}}classOther{publicinti;}和上面的很相似,都是關(guān)于final的問題,這有錯嗎?答案:正確。在addOnemethod中,參數(shù)o被修飾成final。如果在addOnemethod里我們修改了o的reference(比如:o=newOther();),那么如同上例這題也是錯的。但這里修改的是o的membervairable(成員變量),而o的reference并沒有改變。6.classSomething{inti;publicvoiddoSomething(){System.out.println("i="+i);}}有什么錯呢?看不出來啊。答案:正確。輸出的是"i=0"。inti屬於instantvariable(實例變量,或叫成員變量)。instantvariable有default的defaultvalue是0。7.classSomething{finalinti;publicvoiddoSomething(){System.out.println("i="+i);}}和上面一題只有一個地方不同,就是多了一個final。這難道就錯了嗎?答案:錯。finalinti是個final的instantvariable(實例變量,或叫成員變量)。final的instantvariable沒有defaultvalue,必須在constructor(構(gòu)造器)結(jié)束之前被賦予一個明確的值。能夠修改為"finalinti=0;"。8.publicclassSomething{publicstaticvoidmain(String[]args){Somethings=newSomething();System.out.println("s.doSomething()returns"+doSomething());}publicStringdoSomething(){return"Dosomething...";}}看上去很完美。答案:錯??瓷先ピ趍ain里calldoSomething沒有什么問題,畢竟兩個methods都在同一個class里。但仔細(xì)看,main是static的。staticmethod不能直接callnon-staticmethods??筛某?System.out.println("s.doSomething()returns"+s.doSomething());"。同理,staticmethod不能訪問non-staticinstantvariable。9.此處,Something類的文件名叫OtherThing.javaclassSomething{privatestaticvoidmain(String[]something_to_do){System.out.println("Dosomething...");}}這個仿佛很明顯。答案:正確。從來沒有人說過Java的Class名字必須和其文件名相同。但publicclass的名字必須和文件名相同。10.interfaceA{intx=0;}classB{intx=1;}classCextendsBimplementsA{publicvoidpX(){System.out.println(x);}publicstaticvoidmain(String[]args){newC().pX();}}答案:錯誤。在編譯時會發(fā)生錯誤(錯誤描述不同的JVM有不同的信息,意思就是未明確的x調(diào)用,兩個x都匹配(就象在同時importjava.util和java.sql兩個包時直接聲明Date一樣)。對于父類的變量,能夠用super.x來明確,而接口的屬性默認(rèn)隱含為publicstaticfinal.因此能夠經(jīng)過A.x來明確。11.interfacePlayable{voidplay();}interfaceBounceable{voidplay();}interfaceRollableextendsPlayable,Bounceable{Ballba
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 通信工程招投標(biāo)與合同成本控制
- 電力工程師招聘合同及管理規(guī)定
- 旅游區(qū)景觀橋施工合同
- 會議室地暖系統(tǒng)安裝合同
- 加工貿(mào)易公司內(nèi)墻施工合同
- 小學(xué)教學(xué)樓智能醫(yī)療系統(tǒng)建設(shè)合同
- 酒店會議系統(tǒng)改造施工合同
- 運動場館租賃合同模板
- 倉儲物流套筒連接施工合同
- 2025田地租賃合同
- 2024年江西省公務(wù)員考試《行測》真題及答案解析
- 現(xiàn)代藥物制劑與新藥研發(fā)智慧樹知到答案2024年蘇州大學(xué)
- 《馬克思主義發(fā)展史》題集
- 軍事理論-綜合版智慧樹知到期末考試答案章節(jié)答案2024年國防大學(xué)
- 北京市朝陽區(qū)2023-2024學(xué)年七年級上學(xué)期期末檢測語文試卷+
- 失效分析的現(xiàn)狀與發(fā)展趨勢
- 外研版三起點小學(xué)英語四年級上冊1-10模塊教學(xué)反思
- 《魏公子列傳》知識點
- QGDW 10272-2018 大型電廠接入系統(tǒng)設(shè)計內(nèi)容深度規(guī)定
- 三菱PLC控制花樣噴泉控制系統(tǒng)設(shè)計
- 一年級10以內(nèi)加減法口算題(100道題_可直接打印)
評論
0/150
提交評論