2023年java面試資料整理_第1頁
2023年java面試資料整理_第2頁
2023年java面試資料整理_第3頁
2023年java面試資料整理_第4頁
2023年java面試資料整理_第5頁
已閱讀5頁,還剩62頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

第1頁共57頁面試題集面試題集共分為以下十部分:一、CoreJava:1—95題1—24頁基礎(chǔ)及語法:1—61題1—13頁異常:62—69題13—15頁集合:70—80題15—18頁線程:81—90題18—21頁IO&Socket:91—95題21—24頁二、OOAD&UML:96—101題24—25頁三、XML:102—105題26—29頁四、SQL:106—109題29—31頁五、JDBC&Hibernate:110—121題31—35頁六、Web:122—161題35—44頁七、EJB&Spring:162—179題44—47頁八、數(shù)據(jù)結(jié)構(gòu)&算法&計(jì)算機(jī)基礎(chǔ):180—187題47—51頁九、C++:188—201題51—55頁十、Weblogic及其它(附加部分)1——13題55—57頁一、CoreJava部分:(共95題:基礎(chǔ)91道,中檔難度4道)基礎(chǔ)及語法部分:(共61題:基礎(chǔ)60道、中檔難度1道)1、面向?qū)ο蟮奶匦杂心男┓矫?【基礎(chǔ)】答:面向?qū)ο蟮奶匦灾匾幸韵聨讉€(gè)方面:1)抽象:抽象就是忽略一個(gè)主題中與當(dāng)前目的無關(guān)的那些方面,以便更充足地注意與當(dāng)前目的有關(guān)的方面。抽象并不打算了解所有問題,而只是選擇其中的一部分,暫時(shí)不用部分細(xì)節(jié)。抽象涉及兩個(gè)方面,一是過程抽象,二是數(shù)據(jù)抽象。2)繼承:繼承是一種聯(lián)結(jié)類的層次模型,并且允許和鼓勵(lì)類的重用,它提供了一種明確表述共性的方法。對(duì)象的一個(gè)新類可以從現(xiàn)有的類中派生,這個(gè)過程稱為類繼承。新類繼承了原始類的特性,新類稱為原始類的派生類(子類),而原始類稱為新類的基類(父類)。派生類可以從它的基類那里繼承方法和實(shí)例變量,并且類可以修改或增長新的方法使之更適合特殊的需要。3)封裝:封裝是把過程和數(shù)據(jù)包圍起來,對(duì)數(shù)據(jù)的訪問只能通過已定義的界面。面向?qū)ο笥?jì)算始于這個(gè)基本概念,即現(xiàn)實(shí)世界可以被描繪成一系列完全自治、封裝的對(duì)象,這些對(duì)象通過一個(gè)受保護(hù)的接口訪問其他對(duì)象。4)多態(tài)性:多態(tài)性是指允許不同類的對(duì)象對(duì)同一消息作出響應(yīng)。多態(tài)性涉及參數(shù)化多態(tài)性和包含多態(tài)性。多態(tài)性語言具有靈活、抽象、行為共享、代碼共享的優(yōu)勢(shì),很好的解決了應(yīng)用程序函數(shù)同名問題。2、作用域public,privat(yī)e,protected,以及不寫時(shí)的區(qū)別?【基礎(chǔ)】答:區(qū)別如下:作用域當(dāng)前類同包子孫類其他public√√√√第2頁共57頁protected√√√×default√√××private√×××不寫時(shí)默認(rèn)為default。3、String是最基本的數(shù)據(jù)類型嗎?【基礎(chǔ)】答:不是。4、float型float(yī)f=3.4是否對(duì)的?【基礎(chǔ)】答:不對(duì)的;精度不準(zhǔn)確,應(yīng)當(dāng)用強(qiáng)制類型轉(zhuǎn)換,如下所示:floatf=(float(yī))3.4。5、語句floatf=1.3;編譯能否通過?【基礎(chǔ)】答:不能;應(yīng)當(dāng)用強(qiáng)制類型轉(zhuǎn)換,如下所示:floatf=(float)1.3;。6、shorts1=1;s1=s1+1;有什么錯(cuò)?shorts1=1;s1+=1;有什么錯(cuò)?【基礎(chǔ)】答:shorts1=1;s1=s1+1;s1+1運(yùn)算結(jié)果是int型,需要強(qiáng)制轉(zhuǎn)換類型;shorts1=1;s1+=1;可以對(duì)的編譯,自動(dòng)類型提高。7、Java有沒有goto?【基礎(chǔ)】答:goto是java中的保存字,現(xiàn)在沒有在java中使用。8、int和Integer有什么區(qū)別?【基礎(chǔ)】答:Java提供兩種不同的類型:引用類型和原始類型(或內(nèi)置類型);int是java的原始數(shù)據(jù)類型,Integer是java為int提供的封裝類。Java為每個(gè)原始類型提供了封裝類:原始類型:boolean,char,byte,short,int,long,float,double封裝類型:Boolean,Character,Byte,Short,Integer,Long,F(xiàn)loat,Double引用類型和原始類型的行為完全不同,并且它們具有不同的語義。引用類型和原始類型具有不同的特性和用法,它們涉及:大小和速度問題,這種類型以哪種類型的數(shù)據(jù)結(jié)構(gòu)存儲(chǔ),當(dāng)引用類型和原始類型用作某個(gè)類的實(shí)例數(shù)據(jù)時(shí)所指定的缺省值。對(duì)象引用實(shí)例變量的缺省值為null,而原始類型實(shí)例變量的缺省值與它們的類型有關(guān)。9、&和&&的區(qū)別?【基礎(chǔ)】答:&是位運(yùn)算符,表達(dá)按位與運(yùn)算,&&是邏輯運(yùn)算符,表達(dá)邏輯與(and)。10、簡(jiǎn)述邏輯操作(&,|,^)與條件操作(&&,||)的區(qū)別?【基礎(chǔ)】答:區(qū)別重要有兩點(diǎn):a.條件操作只能操作布爾型的,而邏輯操作不僅可以操作布爾型,并且可以操作數(shù)值型b.邏輯操作不會(huì)產(chǎn)生短路。11、heap和stack有什么區(qū)別?【基礎(chǔ)】答:棧是一種線形集合,其添加和刪除元素的操作應(yīng)在同一段完畢,棧按照后進(jìn)先出的方式進(jìn)行解決;堆是棧的一個(gè)組成元素。第3頁共57頁12、Math.round(11.5)等于多少?Math.round(-11.5)等于多少?【基礎(chǔ)】答:Math.round(11.5)==12Mat(yī)h.round(-11.5)==-11round方法返回與參數(shù)最接近的長整數(shù),參數(shù)加1/2后求其floor。13、swtich是否能作用在byte上,是否能作用在long上,是否能作用在String上?【基礎(chǔ)】答:switch(expr1)中,expr1是一個(gè)整數(shù)表達(dá)式。因此傳遞給switch和case語句的參數(shù)應(yīng)當(dāng)是int、short、char或者byte。long,string都不能作用于swtich。14、編程題:用最有效率的方法算出2乘以8等於幾?【基礎(chǔ)】答:2<<3。15、有沒有length()這個(gè)方法?String有沒有l(wèi)ength()這個(gè)方法?【基礎(chǔ)】答:數(shù)組沒有l(wèi)ength()這個(gè)方法,有l(wèi)ength的屬性。String有l(wèi)ength()這個(gè)方法。16、在JAVA中,如何跳出當(dāng)前的多重嵌套循環(huán)?【基礎(chǔ)】答:在最外層循環(huán)前加label標(biāo)記,然后用break:label方法即可跳出多重循環(huán)。17、構(gòu)造器Constructor是否可被override?【基礎(chǔ)】答:構(gòu)造器Constructor不能被繼承,因此不能重寫Overriding,但可以被重載Overloading。18、兩個(gè)對(duì)象值相同(x.equals(y)==true),但卻可有不同的hashcode,這句話對(duì)不對(duì)?【基礎(chǔ)】答:不對(duì),有相同的hashcode。19、是否可以繼承String類?【基礎(chǔ)】答:String類是final類,故不可以繼承。20、以下二條語句返回值為true的有:A:“beijing”==“beijing”;B:“beijing”.equalsIgnoreCase(newString(“beijing”));【基礎(chǔ)】答:A和B。21、當(dāng)一個(gè)對(duì)象被當(dāng)作參數(shù)傳遞到一個(gè)方法后,此方法可改變這個(gè)對(duì)象的屬性,并可返回變化后的結(jié)果,那么這里到底是值傳遞還是引用傳遞?【基礎(chǔ)】答:是值傳遞。Java編程語言只有值傳遞參數(shù)。當(dāng)一個(gè)對(duì)象實(shí)例作為一個(gè)參數(shù)被傳遞到方法中時(shí),參數(shù)的值就是對(duì)該對(duì)象的引用。對(duì)象的內(nèi)容可以在被調(diào)用的方法中改變,但對(duì)象的引用是永遠(yuǎn)不會(huì)改變的。22、我們?cè)趙eb應(yīng)用開發(fā)過程中經(jīng)常碰到輸出某種編碼的字符,如iso8859-1等,如何輸出一個(gè)某種編碼的字符串?【基礎(chǔ)】答:publicStringtranslate(Stringstr){第4頁共57頁StringtempStr="";try{tempStr=newString(str.getBytes("ISO-8859-1"),"GBK");tempStr=tempStr.trim();}catch(Exceptione){System.err.println(e.getMessage());}returntempStr;}23、String和StringBuffer的區(qū)別?【基礎(chǔ)】答:JAVA平臺(tái)提供了兩個(gè)類:String和StringBuffer,它們可以儲(chǔ)存和操作字符串,即包含多個(gè)字符的字符數(shù)據(jù)。這個(gè)String類提供了數(shù)值不可改變的字符串。而這個(gè)StringBuffer類提供的字符串進(jìn)行修改。當(dāng)你知道字符數(shù)據(jù)要改變的時(shí)候你就可以使用StringBuffer。典型地,你可以使用StringBuffers來動(dòng)態(tài)構(gòu)造字符數(shù)據(jù)。24、String,StringBufferStringBuilder的區(qū)別?!净A(chǔ)】答:String的長度是不可變的;StringBuffer的長度是可變的,假如你對(duì)字符串中的內(nèi)容經(jīng)常進(jìn)行操作,特別是內(nèi)容要修改時(shí),那么使用StringBuffer,假如最后需要String,那么使用StringBuffer的toString()方法;線程安全;StringBuilder是從JDK5開始,為StringBuffer該類補(bǔ)充了一個(gè)單個(gè)線程使用的等價(jià)類;通常應(yīng)當(dāng)優(yōu)先使用StringBuilder類,由于它支持所有相同的操作,但由于它不執(zhí)行同步,所以速度更快。25、Overload和Override的區(qū)別。Overloaded的方法是否可以改變返回值的類型?【基礎(chǔ)】答:方法的重寫Overriding和重載Overloading是Java多態(tài)性的不同表現(xiàn)。重寫Overriding是父類與子類之間多態(tài)性的一種表現(xiàn),重載Overloading是一個(gè)類中多態(tài)性的一種表現(xiàn)。假如在子類中定義某方法與其父類有相同的名稱和參數(shù),我們說該方法被重寫(Overriding)。子類的對(duì)象使用這個(gè)方法時(shí),將調(diào)用子類中的定義,對(duì)它而言,父類中的定義如同被“屏蔽”了。假如在一個(gè)類中定義了多個(gè)同名的方法,它們或有不同的參數(shù)個(gè)數(shù)或有不同的參數(shù)類型,則稱為方法的重載(Overloading)。Overloaded的方法是可以改變返回值的類型。26、定義類A和類B如下:【基礎(chǔ)】classA{inta=1;doubled=2.0;voidshow(){System.out.println("ClassA:a="+a+"\td="+d);}}classBextendsA{第5頁共57頁floata=3.0f;Stringd="Javaprogram.";voidshow(){super.show();System.out.println("ClassB:a="+a+"\td="+d);}}(1)若在應(yīng)用程序的main方法中有以下語句:Aa=newA();a.show();則輸出的結(jié)果如何?(2)若在應(yīng)用程序的main方法中定義類B的對(duì)象b:Ab=newB();b.show();則輸出的結(jié)果如何?答:輸出結(jié)果為:1)ClassA:a=1d=2.0;2)ClassA:a=1d=2.0ClassB:a=3.0d=Javaprogram。27、描述一下JVM加載class文獻(xiàn)的原理機(jī)制?【基礎(chǔ)】答:JVM中類的裝載是由ClassLoader和它的子類來實(shí)現(xiàn)的,JavaClassLoader是一個(gè)重要的Java運(yùn)營時(shí)系統(tǒng)組件。它負(fù)責(zé)在運(yùn)營時(shí)查找和裝入類文獻(xiàn)的類。28、char型變量中能不能存貯一個(gè)中文漢字?為什么?【基礎(chǔ)】答:可以定義成為一個(gè)中文的,由于java中以u(píng)nicode編碼,一個(gè)char占16個(gè)字節(jié),所以放一個(gè)中文是沒問題的。29、abstractclass和interface有什么區(qū)別?【基礎(chǔ)】答:聲明方法的存在而不去實(shí)現(xiàn)它的類被叫做抽象類(abstractclass),它用于要?jiǎng)?chuàng)建一個(gè)體現(xiàn)某些基本行為的類,并為該類聲明方法,但不能在該類中實(shí)現(xiàn)該類的情況。不能創(chuàng)建abstract類的實(shí)例。然而可以創(chuàng)建一個(gè)變量,其類型是一個(gè)抽象類,并讓它指向具體子類的一個(gè)實(shí)例。不能有抽象構(gòu)造函數(shù)或抽象靜態(tài)方法。Abstract類的子類為它們父類中的所有抽象方法提供實(shí)現(xiàn),否則它們也是抽象類為。取而代之,在子類中實(shí)現(xiàn)該方法。知道其行為的其它類可以在類中實(shí)現(xiàn)這些方法。接口(interface)是抽象類的變體。新型多繼承性可通過實(shí)現(xiàn)這樣的接口而獲得。接口中的所有方法都是抽象的,所有成員變量都是publicstaticfinal的。一個(gè)類可以實(shí)現(xiàn)多個(gè)接口,當(dāng)類實(shí)現(xiàn)特殊接口時(shí),它定義(即將程序體給予)所有這種接口的方法。然后,它可以在實(shí)現(xiàn)了該接口的類的任何對(duì)象上調(diào)用接口的方法。由于有抽象類,它允許使用接口名作為引用變量的類型。通常的動(dòng)態(tài)聯(lián)編將生效。引用可以轉(zhuǎn)換到接口類型或從接口類型轉(zhuǎn)換,instanceof運(yùn)算符可以用來決定某對(duì)象的類是否實(shí)現(xiàn)了接口。第6頁共57頁30、Stat(yī)icNestedClass和InnerClass的不同?【基礎(chǔ)】答:StaticNestedClass是被聲明為靜態(tài)(static)的內(nèi)部類,它可以不依賴于外部類實(shí)例被實(shí)例化。而通常的內(nèi)部類需要在外部類實(shí)例化后才干實(shí)例化。31、java中會(huì)存在內(nèi)存泄漏嗎,請(qǐng)簡(jiǎn)樸描述?!净A(chǔ)】答:會(huì);存在無用但可達(dá)的對(duì)象,這些對(duì)象不能被GC回收,導(dǎo)致花費(fèi)內(nèi)存資源。32、abstract的method是否可同時(shí)是static,是否可同時(shí)是native,是否可同時(shí)是synchronized?【基礎(chǔ)】答:都不能。33、靜態(tài)變量和實(shí)例變量的區(qū)別?【基礎(chǔ)】答:靜態(tài)變量也稱為類變量,歸全類共有,它不依賴于某個(gè)對(duì)象,可通過類名直接訪問;而實(shí)例變量必須依存于某一實(shí)例,只能通過對(duì)象才干訪問到它。34、是否可以從一個(gè)stat(yī)ic方法內(nèi)部發(fā)出對(duì)非stat(yī)ic方法的調(diào)用?【基礎(chǔ)】答:不可以,假如其中包含對(duì)象的method(),不能保證對(duì)象初始化。35、寫clone()方法時(shí),通常都有一行代碼,是什么?【基礎(chǔ)】答:Clone有缺省行為:super.clone(),他負(fù)責(zé)產(chǎn)生對(duì)的大小的空間,并逐位復(fù)制。36、GC是什么?為什么要有GC?【基礎(chǔ)】答:GC是垃圾收集的意思(GabageCollection),內(nèi)存解決是編程人員容易出現(xiàn)問題的地方,忘掉或者錯(cuò)誤的內(nèi)存回收會(huì)導(dǎo)致程序或系統(tǒng)的不穩(wěn)定甚至崩潰,Java提供的GC功能可以自動(dòng)監(jiān)測(cè)對(duì)象是否超過作用域從而達(dá)成自動(dòng)回收內(nèi)存的目的,Java語言沒有提供釋放已分派內(nèi)存的顯示操作方法。Java程序員不用緊張內(nèi)存管理,由于垃圾收集器會(huì)自動(dòng)進(jìn)行管理。要請(qǐng)求垃圾收集,可以調(diào)用下面的方法之一:System.gc()或Runtime.getRuntime().gc()。37、垃圾回收的優(yōu)點(diǎn)和原理。并考慮2種回收機(jī)制?!净A(chǔ)】答:Java語言中一個(gè)顯著的特點(diǎn)就是引入了垃圾回收機(jī)制,使c++程序員最頭疼的內(nèi)存管理的問題迎刃而解,它使得Java程序員在編寫程序的時(shí)候不再需要考慮內(nèi)存管理。由于有個(gè)垃圾回收機(jī)制,Java中的對(duì)象不再有“作用域”的概念,只有對(duì)象的引用才有“作用域”。垃圾回收可以有效的防止內(nèi)存泄露,有效的使用可以使用的內(nèi)存。垃圾回收器通常是作為一個(gè)單獨(dú)的低檔別的線程運(yùn)營,不可預(yù)知的情況下對(duì)內(nèi)存堆中已經(jīng)死亡的或者長時(shí)間沒有使用的對(duì)象進(jìn)行清楚和回收,程序員不能實(shí)時(shí)的調(diào)用垃圾回收器對(duì)某個(gè)對(duì)象或所有對(duì)象進(jìn)行垃圾回收。回收機(jī)制有分代復(fù)制垃圾回收和標(biāo)記垃圾回收,增量垃圾回收。38、垃圾回收器的基本原理是什么?垃圾回收器可以立即回收內(nèi)存嗎?有什么辦法積極告知虛擬機(jī)進(jìn)行垃圾回收?【基礎(chǔ)】答:對(duì)于GC來說,當(dāng)程序員創(chuàng)建對(duì)象時(shí),GC就開始監(jiān)控這個(gè)對(duì)象的地址、大小以及使用情況。通常,GC采用有向圖的方式記錄和管理堆(heap)中的所有對(duì)象。通過這種方式擬定哪些對(duì)象是"可達(dá)的",哪些對(duì)象是"不可達(dá)的"。當(dāng)GC擬定一第7頁共57頁些對(duì)象為"不可達(dá)"時(shí),GC就有責(zé)任回收這些內(nèi)存空間??梢浴3绦騿T可以手動(dòng)執(zhí)行System.gc(),告知GC運(yùn)營,但是Java語言規(guī)范并不保證GC一定會(huì)執(zhí)行。39、Strings=newString(“xyz”);創(chuàng)建了幾個(gè)StringObject?【基礎(chǔ)】答:兩個(gè)對(duì)象,一個(gè)是"xyx",一個(gè)是指向"xyx"的引用對(duì)象s。40、接口是否可繼承接口?抽象類是否可實(shí)現(xiàn)(implements)接口?抽象類是否可繼承實(shí)體類(concreteclass)?【基礎(chǔ)】答:接口可以繼承接口。抽象類可以實(shí)現(xiàn)(implements)接口,抽象類可繼承實(shí)體類,但前提是實(shí)體類必須有明確的構(gòu)造函數(shù)。41、Java的接口和C++的虛類的相同和不同處?!净A(chǔ)】答:由于Java不支持多繼承,而有也許某個(gè)類或?qū)ο笠褂梅謩e在幾個(gè)類或?qū)ο罄锩娴姆椒ɑ驅(qū)傩?現(xiàn)有的單繼承機(jī)制就不能滿足規(guī)定。與繼承相比,接口有更高的靈活性,由于接口中沒有任何實(shí)現(xiàn)代碼。當(dāng)一個(gè)類實(shí)現(xiàn)了接口以后,該類要實(shí)現(xiàn)接口里面所有的方法和屬性,并且接口里面的屬性在默認(rèn)狀態(tài)下面都是publicstatic,所有方法默認(rèn)情況下是public.一個(gè)類可以實(shí)現(xiàn)多個(gè)接口。42、一個(gè)“.java”源文獻(xiàn)中是否可以包含多個(gè)類(不是內(nèi)部類)?有什么限制?【基礎(chǔ)】答:可以;必須只有一個(gè)類名與文獻(xiàn)名相同。43、說出一些常用的類,包,接口,請(qǐng)各舉5個(gè)。【基礎(chǔ)】答:常用的類:BufferedReaderBufferedWriterFileReaderFileWirterStringInteger;常用的包:java.langjava.awtjava.iojava.utiljava.sql;常用的接口:RemoteListMapDocumentNodeList44、AnonymousInnerClass(匿名內(nèi)部類)是否可以extends(繼承)其它類?是否可以implements(實(shí)現(xiàn))interface(接口)?【基礎(chǔ)】答:可以繼承其他類或?qū)崿F(xiàn)其他接口,在swing編程中常用此方式。45、內(nèi)部類可以引用他包含類的成員嗎?有沒有什么限制?【基礎(chǔ)】答:一個(gè)內(nèi)部類對(duì)象可以訪問創(chuàng)建它的外部類對(duì)象的內(nèi)容。46、java中實(shí)現(xiàn)多態(tài)的機(jī)制是什么?【基礎(chǔ)】答:方法的覆蓋Overriding和重載Overloading是java多態(tài)性的不同表現(xiàn);覆蓋Overriding是父類與子類之間多態(tài)性的一種表現(xiàn),重載Overloading是一個(gè)類中多態(tài)性的一種表現(xiàn)。47、在java中一個(gè)類被聲明為final類型,表達(dá)了什么意思?【基礎(chǔ)】答:表達(dá)該類不能被繼承,是頂級(jí)類。48、下面哪些類可以被繼承?【基礎(chǔ)】1)java.lang.Thread(T)第8頁共57頁2)java.lang.Number(T)3)java.lang.Double(F)4)java.lang.Math(F)5)java.lang.Void(F)6)java.lang.Class(F)7)java.lang.ClassLoader(T)答:1、2、7可以被繼承。49、指出下面程序的運(yùn)營結(jié)果:【基礎(chǔ)】classA{static{System.out.print("1");}publicA(){System.out.print("2");}}classBextendsA{static{System.out.print("a");}publicB(){System.out.print("b");}}publicclassHello{publicstaticvoidmain(String[]ars){Aab=newB();//執(zhí)行到此處,結(jié)果:1a2bab=newB();//執(zhí)行到此處,結(jié)果:1a2b2b}}答:輸出結(jié)果為1a2b2b;類的static代碼段,可以看作是類初次加載(虛擬機(jī)加載)執(zhí)行的代碼,而對(duì)于類加載,一方面要執(zhí)行其基類的構(gòu)造,再執(zhí)行其自身的構(gòu)造。50、繼承時(shí)候類的執(zhí)行順序問題,一般都是選擇題,問你將會(huì)打印出什么?【基礎(chǔ)】父類:packagetest;publicclassFatherClass{publicFat(yī)herClass(){System.out.println("FatherClassCreate");}}子類:packagetest;importtest.FatherClass;第9頁共57頁publicclassChildClassextendsFat(yī)herClass{publicChildClass(){System.out.println("ChildClassCreate");}publicstaticvoidmain(String[]args){FatherClassfc=newFatherClass();ChildClasscc=newChildClass();}}答:輸出結(jié)果為:FatherClassCreateFat(yī)herClassCreateChildClassCreate51、內(nèi)部類的實(shí)現(xiàn)方式?【基礎(chǔ)】答:示例代碼如下:packagetest;publicclassOuterClass{privateclassInterClass{publicInterClass(){System.out.println("InterClassCreate");}}publicOuterClass(){InterClassic=newInterClass();System.out.println("OuterClassCreate");}publicstaticvoidmain(String[]args){OuterClassoc=newOuterClass();}}輸出結(jié)果為:InterClassCreateOuterClassCreate52、關(guān)于內(nèi)部類:【基礎(chǔ)】publicclassOuterClass{privatedoubled1=1.0;//insertcodehere}Youneedtoinsertaninnerclassdeclarationatline3,Whichtwoinnerclassdeclarationsarevalid?(Choosetwo.)A.classInnerOne{publicstaticdoublemethoda(){returnd1;}}第10頁共57頁B.publicclassInnerOne{staticdoublemethoda(){returnd1;}}C.privateclassInnerOne{doublemethoda(){returnd1;}}D.staticclassInnerOne{protecteddoublemethoda(){returnd1;}}E.abstractclassInnerOne{publicabstractdoublemethoda();}答:答案為C、E;說明如下:1)靜態(tài)內(nèi)部類可以有靜態(tài)成員,而非靜態(tài)內(nèi)部類則不能有靜態(tài)成員;故A、B錯(cuò);2)靜態(tài)內(nèi)部類的非靜態(tài)成員可以訪問外部類的靜態(tài)變量,而不可訪問外部類的非靜態(tài)變量;故D錯(cuò);3)非靜態(tài)內(nèi)部類的非靜態(tài)成員可以訪問外部類的非靜態(tài)變量;故C對(duì)的。53、數(shù)據(jù)類型之間的轉(zhuǎn)換:1)如何將數(shù)值型字符轉(zhuǎn)換為數(shù)字?2)如何將數(shù)字轉(zhuǎn)換為字符?3)如何取小數(shù)點(diǎn)前兩位并四舍五入?【基礎(chǔ)】答:1)調(diào)用數(shù)值類型相應(yīng)包裝類中的方法parse***(String)或valueOf(String)即可返回相應(yīng)基本類型或包裝類型數(shù)值;2)將數(shù)字與空字符串相加即可獲得其所相應(yīng)的字符串;此外對(duì)于基本類型數(shù)字還可調(diào)用String類中的valueOf(…)方法返回相應(yīng)字符串,而對(duì)于包裝類型數(shù)字則可調(diào)用其toString()方法獲得相應(yīng)字符串;3)可用該數(shù)字構(gòu)造一java.mat(yī)h.BigDecimal對(duì)象,再運(yùn)用其round()方法進(jìn)行四舍五入到保存小數(shù)點(diǎn)后兩位,再將其轉(zhuǎn)換為字符串截取最后兩位。54、字符串操作:如何實(shí)現(xiàn)字符串的反轉(zhuǎn)及替換?【基礎(chǔ)】答:可用字符串構(gòu)造一StringBuffer對(duì)象,然后調(diào)用StringBuffer中的reverse方法即可實(shí)現(xiàn)字符串的反轉(zhuǎn),調(diào)用replace方法即可實(shí)現(xiàn)字符串的替換。55、編碼轉(zhuǎn)換:如何將GB2312編碼的字符串轉(zhuǎn)換為ISO-8859-1編碼的字符串?【基礎(chǔ)】答:示例代碼如下:Strings1="你好";Strings2=newString(s1.getBytes("GB2312"),"ISO-8859-1");56、寫一個(gè)函數(shù),規(guī)定輸入一個(gè)字符串和一個(gè)字符長度,對(duì)該字符串進(jìn)行分隔。【基礎(chǔ)】答:函數(shù)代碼如下:publicString[]split(Stringstr,intchars){第11頁共57頁intn=(str.length()+chars-1)/chars;Stringret[]=newString[n];for(inti=0;i<n;i++){if(i<n-1){ret[i]=str.substring(i*chars,(i+1)*chars);}else{ret[i]=str.substring(i*chars);}}returnret;}57、寫一個(gè)函數(shù),2個(gè)參數(shù),1個(gè)字符串,1個(gè)字節(jié)數(shù),返回截取的字符串,規(guī)定字符串中的中文不能出現(xiàn)亂碼:如(“我ABC”,4)應(yīng)當(dāng)截為“我AB”,輸入(“我ABC漢DEF”,6)應(yīng)當(dāng)輸出為“我ABC”而不是“我ABC+漢的半個(gè)”。【基礎(chǔ)】答:代碼如下:publicStringsubString(Stringstr,intsubBytes){intbytes=0;//用來存儲(chǔ)字符串的總字節(jié)數(shù)for(inti=0;i<str.length();i++){if(bytes==subBytes){returnstr.substring(0,i);}charc=str.charAt(i);if(c<256){bytes+=1;//英文字符的字節(jié)數(shù)看作1}else{bytes+=2;//中文字符的字節(jié)數(shù)看作2if(bytes-subBytes==1){returnstr.substring(0,i);}}}returnstr;}58、日期和時(shí)間:1)如何取得年月日、小時(shí)分秒?2)如何取得從1970年到現(xiàn)在的毫秒數(shù)?3)如何取得某個(gè)日期是當(dāng)月的最后一天?4)如何格式化日期?【基礎(chǔ)】答:1)創(chuàng)建java.util.Calendar實(shí)例(Calendar.getInstance()),調(diào)用其get()方法傳入不同的參數(shù)即可獲得參數(shù)所相應(yīng)的值,如:calendar.get(Calendar.YEAR);//獲得年2)以下方法均可獲得該毫秒數(shù):第12頁共57頁Calendar.getInstance().getTimeInMillis();System.currentTimeMillis();3)示例代碼如下:Calendartime=Calendar.getInstance();time.set(Calendar.DAY_OF_MONTH,time.getActualMaximum(Calendar.DAY_OF_MONTH));4)運(yùn)用java.text.DataFormat(yī)類中的format()方法可將日期格式化。59、Java編程,打印昨天的當(dāng)前時(shí)刻。【基礎(chǔ)】答:publicclassYesterdayCurrent{publicstaticvoidmain(String[]args){Calendarcal=Calendar.getInstance();cal.add(Calendar.DATE,-1);System.out.println(cal.getTime());}}60、java和javasciprt的區(qū)別。【基礎(chǔ)】答:JavaScript與Java是兩個(gè)公司開發(fā)的不同的兩個(gè)產(chǎn)品。Java是SUN公司推出的新一代面向?qū)ο蟮某绦蛟O(shè)計(jì)語言,特別適合于Internet應(yīng)用程序開發(fā);而JavaScript是Netscape公司的產(chǎn)品,其目的是為了擴(kuò)展NetscapeNavigator功能,而開發(fā)的一種可以嵌入Web頁面中的基于對(duì)象和事件驅(qū)動(dòng)的解釋性語言,它的前身是LiveScript;而Java的前身是Oak語言。下面對(duì)兩種語言間的異同作如下比較:1)基于對(duì)象和面向?qū)ο?Java是一種真正的面向?qū)ο蟮恼Z言,即使是開發(fā)簡(jiǎn)樸的程序,必須設(shè)計(jì)對(duì)象;JavaScript是種腳本語言,它可以用來制作與網(wǎng)絡(luò)無關(guān)的,與用戶交互作用的復(fù)雜軟件。它是一種基于對(duì)象(ObjectBased)和事件驅(qū)動(dòng)(EventDriver)的編程語言。因而它自身提供了非常豐富的內(nèi)部對(duì)象供設(shè)計(jì)人員使用;2)解釋和編譯:Java的源代碼在執(zhí)行之前,必須通過編譯;JavaScript是一種解釋性編程語言,其源代碼不需通過編譯,由瀏覽器解釋執(zhí)行;3)強(qiáng)類型變量和類型弱變量:Java采用強(qiáng)類型變量檢查,即所有變量在編譯之前必須作聲明;JavaScript中變量聲明,采用其弱類型。即變量在使用前不需作聲明,而是解釋器在運(yùn)營時(shí)檢查其數(shù)據(jù)類型;4)代碼格式不同樣。61、什么時(shí)候用assert?【中檔難度】答:assertion(斷言)在軟件開發(fā)中是一種常用的調(diào)試方式,很多開發(fā)語言中都支持這種機(jī)制。一般來說,assertion用于保證程序最基本、關(guān)鍵的對(duì)的性。assertion檢查通常在開發(fā)和測(cè)試時(shí)啟動(dòng)。為了提高性能,在軟件發(fā)布后,assertion檢查通常是關(guān)閉的。在實(shí)現(xiàn)中,斷言是一個(gè)包含布爾表達(dá)式的語句,在執(zhí)行這個(gè)語句時(shí)假定該表達(dá)式為true;假如表達(dá)式計(jì)算為false,那么系統(tǒng)第13頁共57頁會(huì)報(bào)告一個(gè)Assertionerror。斷言用于調(diào)試目的:assert(a>0);//throwsanAssertionerrorifa<=0斷言可以有兩種形式:assertExpression1;assertExpression1:Expression2;Expression1應(yīng)當(dāng)總是產(chǎn)生一個(gè)布爾值。Expression2可以是得出一個(gè)值的任意表達(dá)式;這個(gè)值用于生成顯示更多調(diào)試信息的String消息。斷言在默認(rèn)情況下是禁用的,要在編譯時(shí)啟用斷言,需使用source1.4標(biāo)記:javac-source1.4Test.java要在運(yùn)營時(shí)啟用斷言,可使用-enableassertions或者-ea標(biāo)記。要在運(yùn)營時(shí)選擇禁用斷言,可使用-da或者-disableassertions標(biāo)記。要在系統(tǒng)類中啟用斷言,可使用-esa或者-dsa標(biāo)記。還可以在包的基礎(chǔ)上啟用或者禁用斷言??梢栽陬A(yù)計(jì)正常情況下不會(huì)到達(dá)的任何位置上放置斷言。斷言可以用于驗(yàn)證傳遞給私有方法的參數(shù)。但是,斷言不應(yīng)當(dāng)用于驗(yàn)證傳遞給公有方法的參數(shù),由于不管是否啟用了斷言,公有方法都必須檢查其參數(shù)。但是,既可以在公有方法中,也可以在非公有方法中運(yùn)用斷言測(cè)試后置條件。此外,斷言不應(yīng)當(dāng)以任何方式改變程序的狀態(tài)。異常部分:(共8題:基礎(chǔ)8道)62、Java中的異常解決機(jī)制的簡(jiǎn)樸原理和應(yīng)用?【基礎(chǔ)】答:當(dāng)JAVA程序違反了JAVA的語義規(guī)則時(shí),JAVA虛擬機(jī)就會(huì)將發(fā)生的錯(cuò)誤表達(dá)為一個(gè)異常。違反語義規(guī)則涉及2種情況。一種是JAVA類庫內(nèi)置的語義檢查。例如數(shù)組下標(biāo)越界,會(huì)引發(fā)IndexOutOfBoundsException;訪問null的對(duì)象時(shí)會(huì)引發(fā)NullPointerException。另一種情況就是JAVA允許程序員擴(kuò)展這種語義檢查,程序員可以創(chuàng)建自己的異常,并自由選擇在何時(shí)用throw關(guān)鍵字引發(fā)異常。所有的異常都是java.lang.Thowable的子類。63、error和exception有什么區(qū)別?【基礎(chǔ)】答:error表達(dá)系統(tǒng)級(jí)的錯(cuò)誤和程序不必解決的異常,是恢復(fù)不是不也許但很困難的情況下的一種嚴(yán)重問題;比如內(nèi)存溢出,不也許指望程序能解決這樣的情況;exception表達(dá)需要捕獲或者需要程序進(jìn)行解決的異常,是一種設(shè)計(jì)或?qū)崿F(xiàn)問題;也就是說,它表達(dá)假如程序運(yùn)營正常,從不會(huì)發(fā)生的情況。64、try{}里有一個(gè)return語句,那么緊跟在這個(gè)try后的finally{}里的code會(huì)不會(huì)被執(zhí)行,什么時(shí)候被執(zhí)行,在return前還是后?【基礎(chǔ)】答:會(huì)執(zhí)行,在return前執(zhí)行。65、JAVA語言如何進(jìn)行異常解決,關(guān)鍵字:throws,throw,try,catch,finally分別代表什么意義?在try塊中可以拋出異常嗎?【基礎(chǔ)】答:Java通過面向?qū)ο蟮姆椒ㄟM(jìn)行異常解決,把各種不同的異常進(jìn)行分類,并提供了良好的接口。在Java中,每個(gè)異常都是一個(gè)對(duì)象,它是Throwable類或其它子類的實(shí)例。當(dāng)一個(gè)方法出現(xiàn)異常后便拋出一個(gè)異常對(duì)象,該對(duì)象中包具有第14頁共57頁異常信息,調(diào)用這個(gè)對(duì)象的方法可以捕獲到這個(gè)異常并進(jìn)行解決。Java的異常解決是通過5個(gè)關(guān)鍵詞來實(shí)現(xiàn)的:try、catch、throw、throws和finally。一般情況下是用try來執(zhí)行一段程序,假如出現(xiàn)異常,系統(tǒng)會(huì)拋出(throws)一個(gè)異常,這時(shí)候你可以通過它的類型來捕獲(cat(yī)ch)它,或最后(finally)由缺省解決器來解決;try用來指定一塊防止所有“異?!钡某绦?cat(yī)ch子句緊跟在try塊后面,用來指定你想要捕獲的“異?!钡念愋?throw語句用來明確地拋出一個(gè)“異?!?throws用來標(biāo)明一個(gè)成員函數(shù)也許拋出的各種“異?!?Finally為保證一段代碼不管發(fā)生什么“異?!倍急粓?zhí)行一段代碼;可以在一個(gè)成員函數(shù)調(diào)用的外面寫一個(gè)try語句,在這個(gè)成員函數(shù)內(nèi)部寫另一個(gè)try語句保護(hù)其他代碼。每當(dāng)碰到一個(gè)try語句,“異?!钡目蚣芫头诺蕉褩I厦?,直到所有的try語句都完畢。假如下一級(jí)的try語句沒有對(duì)某種“異?!边M(jìn)行解決,堆棧就會(huì)展開,直到碰到有解決這種“異?!钡膖ry語句。66、運(yùn)營時(shí)異常與一般異常有何異同?【基礎(chǔ)】答:異常表達(dá)程序運(yùn)營過程中也許出現(xiàn)的非正常狀態(tài),運(yùn)營時(shí)異常表達(dá)虛擬機(jī)的通常操作中也許碰到的異常,是一種常見運(yùn)營錯(cuò)誤。java編譯器規(guī)定方法必須聲明拋出也許發(fā)生的非運(yùn)營時(shí)異常,但是并不規(guī)定必須聲明拋出未被捕獲的運(yùn)營時(shí)異常。67、給我一個(gè)你最常見到的runtimeexception?【基礎(chǔ)】答:ArithmeticException,ArrayStoreException,BufferOverflowException,BufferUnderflowException,CannotRedoException,CannotUndoException,ClassCastException,CMMException,ConcurrentModificationException,DOMException,EmptyStackException,IllegalArgumentException,IllegalMonitorStateException,IllegalPathStateException,IllegalStat(yī)eException,ImagingOpException,IndexOutOfBoundsException,MissingResourceException,NegativeArraySizeException,NoSuchElementException,NullPointerException,ProfileDat(yī)aException,ProviderException,RasterFormatException,SecurityException,SystemException,UndeclaredThrowableException,UnmodifiableSetException,UnsupportedOperationException68、final,finally,finalize的區(qū)別?【基礎(chǔ)】答:final:修飾符(關(guān)鍵字);假如一個(gè)類被聲明為final,意味著它不能再派生出新的子類,不能作為父類被繼承,因此一個(gè)類不能既被聲明為abstract的,又被聲明為final的;將變量或方法聲明為final,可以保證它們?cè)谑褂弥胁槐桓淖?被聲明為final的變量必須在聲明時(shí)給定初值,而在以后的引用中只能讀取,不可修改;被聲明為final的方法也同樣只能使用,不能重載。finally:再異常解決時(shí)提供finally塊來執(zhí)行任何清除操作;假如拋出一個(gè)異常,那么相匹配的cat(yī)ch子句就會(huì)執(zhí)行,然后控制就會(huì)進(jìn)入finally塊(假如有的話)。finalize:方法名;Java技術(shù)允許使用finalize()方法在垃圾收集器將對(duì)象從內(nèi)存中清除出去之前做必要的清理工作。這個(gè)方法是由垃圾收集器在擬定第15頁共57頁這個(gè)對(duì)象沒有被引用時(shí)對(duì)這個(gè)對(duì)象調(diào)用的。它是在Object類中定義的,因此所有的類都繼承了它。子類覆蓋finalize()方法以整理系統(tǒng)資源或者執(zhí)行其他清理工作。finalize()方法是在垃圾收集器刪除對(duì)象之前對(duì)這個(gè)對(duì)象調(diào)用的。69、類ExampleA繼承Exception,類ExampleB繼承ExampleA;【基礎(chǔ)】有如下代碼片斷:try{thrownewExampleB(“b”);}catch(ExampleAe){System.out.printfln(“ExampleA”);}catch(Exceptione){System.out.printfln(“Exception”);}輸出的內(nèi)容應(yīng)當(dāng)是:A:ExampleAB:ExceptionC:bD:無答:輸出為A。集合部分:(共11題:基礎(chǔ)11道)70、介紹JAVA中的CollectionFrameWork(及如何寫自己的數(shù)據(jù)結(jié)構(gòu))【基礎(chǔ)】答:CollectionFrameWork如下:Collection├List│├LinkedList│├ArrayList│└Vector│└Stack└SetMap├Hashtable├HashMap└WeakHashMapCollection是最基本的集合接口,一個(gè)Collection代表一組Object,即Collection的元素(Elements);Map提供key到value的映射。71、List,Set,Map是否繼承自Collection接口?【基礎(chǔ)】答:List,Set是;Map不是。72、你所知道的集合類都有哪些?重要方法?【基礎(chǔ)】答:最常用的集合類是List和Map。List的具體實(shí)現(xiàn)涉及ArrayList和Vector,它們是可變大小的列表,比較適合構(gòu)建、存儲(chǔ)和操作任何類型對(duì)象的元素列表。List合用于按數(shù)值索引訪問元素的情形。Map提供了一個(gè)更通用的元素存儲(chǔ)方法。Map集合類用于存儲(chǔ)元素對(duì)(稱作“鍵”和“值”),其中每個(gè)鍵映射到一個(gè)值。第16頁共57頁73、說出ArrayList,Vector,LinkedList的存儲(chǔ)性能和特性?【基礎(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方法(線程安全),通常性能上較ArrayList差,而LinkedList使用雙向鏈表實(shí)現(xiàn)存儲(chǔ),按序號(hào)索引數(shù)據(jù)需要進(jìn)行前向或后向遍歷,但是插入數(shù)據(jù)時(shí)只需要記錄本項(xiàng)的前后項(xiàng)即可,所以插入速度較快。74、Collection和Collections的區(qū)別?【基礎(chǔ)】答:Collection是java.util下的接口,它是各種集合的父接口,繼承于它的接口重要有Set和List;Collections是個(gè)java.util下的類,是針對(duì)集合的幫助類,提供一系列靜態(tài)方法實(shí)現(xiàn)對(duì)各種集合的搜索、排序、線程安全化等操作。75、HashMap和Hashtable的區(qū)別?【基礎(chǔ)】答:兩者都實(shí)現(xiàn)了Map接口,是將惟一鍵映射到特定的值上;重要區(qū)別在于:1)HashMap沒有排序,允許一個(gè)null鍵和多個(gè)null值,而Hashtable不允許;2)HashMap把Hashtable的contains方法去掉了,改成containsvalue和containsKey,由于contains方法容易讓人引起誤解;3)Hashtable繼承自Dictionary類,HashMap是Java1.2引進(jìn)的Map接口的實(shí)現(xiàn);4)Hashtable的方法是Synchronize的,而HashMap不是,在多個(gè)線程訪問Hashtable時(shí),不需要自己為它的方法實(shí)現(xiàn)同步,而HashMap就必須為之提供外同步。Hashtable和HashMap采用的hash/rehash算法大體同樣,所以性能不會(huì)有很大的差異。76、Arraylist與Vector區(qū)別?【基礎(chǔ)】答:就ArrayList與Vector重要從二方面來說:1)同步性:Vector是線程安全的(同步),而ArrayList是線程序不安全的;2)數(shù)據(jù)增長:當(dāng)需要增長時(shí),Vector默認(rèn)增長一倍,而ArrayList卻是一半。77、List、Map、Set三個(gè)接口,存取元素時(shí),各有什么特點(diǎn)?【基礎(chǔ)】答:List以特定順序來持有元素,可有反復(fù)元素。Set無法擁有反復(fù)元素,內(nèi)部排序。Map保存key-value值,value可多值。78、Set里的元素是不能反復(fù)的,那么用什么方法來區(qū)分反復(fù)與否呢?是用==還是equals()?它們有何區(qū)別?【基礎(chǔ)】答:Set里的元素是不能反復(fù)的,用equals()方法來區(qū)分反復(fù)與否。覆蓋equals()方法用來判斷對(duì)象的內(nèi)容是否相同,而”==”判斷地址是否相等,用來決定引用值是否指向同一對(duì)象。79、用程序給出隨便大小的10個(gè)數(shù),序號(hào)為1-10,按從小到大順序輸出,并輸出相應(yīng)的序號(hào)?!净A(chǔ)】答:代碼如下:packagetest;importjava.util.ArrayList;第17頁共57頁importjava.util.Collections;importjava.util.Iterator;importjava.util.List;importjava.util.Random;publicclassRandomSort{publicstaticvoidprintRandomBySort(){Randomrandom=newRandom();//創(chuàng)建隨機(jī)數(shù)生成器Listlist=newArrayList();//生成10個(gè)隨機(jī)數(shù),并放在集合list中for(inti=0;i<10;i++){list.add(random.nextInt(1000));}Collections.sort(list);//對(duì)集合中的元素進(jìn)行排序Iterat(yī)orit=list.iterat(yī)or();intcount=0;while(it.hasNext()){//順序輸出排序后集合中的元素System.out.println(++count+":"+it.next());}}publicstaticvoidmain(String[]args){printRandomBySort();}}80、用JAVA實(shí)現(xiàn)一種排序,JAVA類實(shí)現(xiàn)序列化的方法?在COLLECTION框架中,實(shí)現(xiàn)比較要實(shí)現(xiàn)什么樣的接口?【基礎(chǔ)】答:用插入法進(jìn)行排序代碼如下:packagetest;importjava.util.*;classInsertSort{ArrayListal;publicInsertSort(intnum,intmod){al=newArrayList(num);Randomrand=newRandom();System.out.println("TheArrayListSortBefore:");for(inti=0;i<num;i++){al.add(newInteger(Math.abs(rand.nextInt())%mod+1));System.out.println("al["+i+"]="+al.get(i));}}publicvoidSortIt(){tempInt;intMaxSize=1;for(inti=1;i<al.size();i++){第18頁共57頁tempInt=(Integer)al.remove(i);if(tempInt.intValue()>=((Integer)al.get(MaxSize-1)).intValue()){al.a(chǎn)dd(MaxSize,tempInt);MaxSize++;System.out.println(al.toString());}else{for(intj=0;j<MaxSize;j++){if(((Integer)al.get(j)).intValue()>=tempIValue()){al.a(chǎn)dd(j,tempInt);MaxSize++;System.out.println(al.toString());break;}}}}System.out.println("TheArrayListSortAfter:");for(inti=0;i<al.size();i++){System.out.println("al["+i+"]="+al.get(i));}}publicstaticvoidmain(String[]args){InsertSortis=newInsertSort(10,100);is.SortIt();}}JAVA類實(shí)現(xiàn)序例化的方法是實(shí)現(xiàn)java.io.Serializable接口;Collection框架中實(shí)現(xiàn)比較要實(shí)現(xiàn)Comparable接口和Comparat(yī)or接口。線程部分:(共10題:基礎(chǔ)7道,中檔難度3道)81、sleep()和wait()有什么區(qū)別?【基礎(chǔ)】答:slee(cuò)p是線程類(Thread)的方法,導(dǎo)致此線程暫停執(zhí)行指定期間,給執(zhí)行機(jī)會(huì)給其他線程,但是監(jiān)控狀態(tài)仍然保持,屆時(shí)后會(huì)自動(dòng)恢復(fù)。調(diào)用sleep不會(huì)釋放對(duì)象鎖。wait是Object類的方法,對(duì)此對(duì)象調(diào)用wait方法導(dǎo)致本線程放棄對(duì)象鎖,進(jìn)入等待此對(duì)象的等待鎖定池,只有針對(duì)此對(duì)象發(fā)出notify方法(或notifyAll)后本線程才進(jìn)入對(duì)象鎖定池準(zhǔn)備獲得對(duì)象鎖進(jìn)入運(yùn)營狀態(tài)。82、當(dāng)一個(gè)線程進(jìn)入一個(gè)對(duì)象的一個(gè)synchronized方法后,其它線程是否可進(jìn)入此對(duì)象的其它方法?【基礎(chǔ)】答:其它線程只能訪問該對(duì)象的其它非同步方法,同步方法則不能進(jìn)入。第19頁共57頁83、請(qǐng)說出你所知道的線程同步的方法。【基礎(chǔ)】答:wait():使一個(gè)線程處在等待狀態(tài),并且釋放所持有的對(duì)象的lock;sleep():使一個(gè)正在運(yùn)營的線程處在睡眠狀態(tài),是一個(gè)靜態(tài)方法,調(diào)用此方法要捕獲InterruptedException異常;notify():?jiǎn)拘岩粋€(gè)處在等待狀態(tài)的線程,注意的是在調(diào)用此方法的時(shí)候,并不能確切的喚醒某一個(gè)等待狀態(tài)的線程,而是由JVM擬定喚醒哪個(gè)線程,并且不是按優(yōu)先級(jí);notityAll():喚醒所有處入等待狀態(tài)的線程,注意并不是給所有喚醒線程一個(gè)對(duì)象的鎖,而是讓它們競(jìng)爭(zhēng)。84、多線程有幾種實(shí)現(xiàn)方法,都是什么?同步有幾種實(shí)現(xiàn)方法,都是什么?【基礎(chǔ)】答:多線程有兩種實(shí)現(xiàn)方法,分別是繼承Thread類與實(shí)現(xiàn)Runnable接口,同步的實(shí)現(xiàn)方面有兩種,分別是synchronized,wait與notify。85、同步和異步有何異同,在什么情況下分別使用他們?舉例說明。【基礎(chǔ)】答:假如數(shù)據(jù)將在線程間共享。例如正在寫的數(shù)據(jù)以后也許被另一個(gè)線程讀到,或者正在讀的數(shù)據(jù)也許已經(jīng)被另一個(gè)線程寫過了,那么這些數(shù)據(jù)就是共享數(shù)據(jù),必須進(jìn)行同步存取。當(dāng)應(yīng)用程序在對(duì)象上調(diào)用了一個(gè)需要花費(fèi)很長時(shí)間來執(zhí)行的方法,并且不希望讓程序等待方法的返回時(shí),就應(yīng)當(dāng)使用異步編程,在很多情況下采用異步途徑往往更有效率。86、啟動(dòng)一個(gè)線程是用run()還是start()?【基礎(chǔ)】答:啟動(dòng)一個(gè)線程是調(diào)用start()方法,使線程所代表的虛擬解決機(jī)處在可運(yùn)營狀態(tài),這意味著它可以由JVM調(diào)度并執(zhí)行。這并不意味著線程就會(huì)立即運(yùn)營。run()方法可以產(chǎn)生必須退出的標(biāo)志來停止一個(gè)線程。87、線程的基本概念、線程的基本狀態(tài)以及狀態(tài)之間的關(guān)系?【基礎(chǔ)】答:線程指在程序執(zhí)行過程中,可以執(zhí)行程序代碼的一個(gè)執(zhí)行單位,每個(gè)程序至少都有一個(gè)線程,也就是程序自身;Java中的線程有四種狀態(tài)分別是:運(yùn)營、就緒、掛起、結(jié)束。88、簡(jiǎn)述synchronized和java.util.concurrent.locks.Lock的異同?【中檔難度】答:重要相同點(diǎn):Lock能完畢synchronized所實(shí)現(xiàn)的所有功能;重要不同點(diǎn):Lock有比synchronized更精確的線程語義和更好的性能。synchronized會(huì)自動(dòng)釋放鎖,而Lock一定規(guī)定程序員手工釋放,并且必須在finally從句中釋放。89、java中有幾種方法可以實(shí)現(xiàn)一個(gè)線程?用什么關(guān)鍵字修飾同步方法?stop()和suspend()方法為什么不推薦使用?【中檔難度】答:有兩種實(shí)現(xiàn)方法,分別是繼承Thread類與實(shí)現(xiàn)Runnable接口;用synchronized關(guān)鍵字修飾同步方法;反對(duì)使用stop(),是由于它不安全。它會(huì)解除由線程獲取的所有鎖定,并且假如對(duì)象處在一種不連貫狀態(tài),那么其他線程能在那種狀態(tài)下檢查和修改它們。結(jié)果很難檢查出真正的問題所在;第20頁共57頁suspend()方法容易發(fā)生死鎖。調(diào)用suspend()的時(shí)候,目的線程會(huì)停下來,但卻仍然持有在這之前獲得的鎖定。此時(shí),其他任何線程都不能訪問鎖定的資源,除非被“掛起”的線程恢復(fù)運(yùn)營。對(duì)任何線程來說,假如它們想恢復(fù)目的線程,同時(shí)又試圖使用任何一個(gè)鎖定的資源,就會(huì)導(dǎo)致死鎖。故不應(yīng)當(dāng)使用suspend(),而應(yīng)在自己的Thread類中置入一個(gè)標(biāo)志,指出線程應(yīng)當(dāng)活動(dòng)還是掛起。若標(biāo)志指出線程應(yīng)當(dāng)掛起,便用wait()命其進(jìn)入等待狀態(tài)。若標(biāo)志指出線程應(yīng)當(dāng)恢復(fù),則用一個(gè)notify()重新啟動(dòng)線程。90、設(shè)計(jì)4個(gè)線程,其中兩個(gè)線程每次對(duì)j增長1,另兩個(gè)線程對(duì)j每次減少1;寫出程序?!局袡n難度】答:以下程序使用內(nèi)部類實(shí)現(xiàn)線程,對(duì)j增減的時(shí)候沒有考慮順序問題:publicclassTestThread{privateintj;publicTestThread(intj){this.j=j;}privat(yī)esynchronizedvoidinc(){j++;System.out.println(j+"--Inc--"+Thread.currentThread().getName());}privat(yī)esynchronizedvoiddec(){j--;System.out.println(j+"--Dec--"+Thread.currentThread().getName());}publicvoidrun(){(newDec()).start();newThread(newInc()).start();(newDec()).start();newThread(newInc()).start();}classDecextendsThread{publicvoidrun(){for(inti=0;i<100;i++){dec();}}}classIncimplementsRunnable{publicvoidrun(){for(inti=0;i<100;i++){inc();}}}第21頁共57頁publicstaticvoidmain(String[]args){(newTestThread(5)).run();}}IO流及Socket部分:(共5題:基礎(chǔ)5道)91、什么是java序列化,如何實(shí)現(xiàn)java序列化?【基礎(chǔ)】答:序列化就是一種用來解決對(duì)象流的機(jī)制,所謂對(duì)象流也就是將對(duì)象的內(nèi)容進(jìn)行流化??梢詫?duì)流化后的對(duì)象進(jìn)行讀寫操作,也可將流化后的對(duì)象傳輸于網(wǎng)絡(luò)之間。序列化是為了解決在對(duì)對(duì)象流進(jìn)行讀寫操作時(shí)所引發(fā)的問題;序列化的實(shí)現(xiàn):將需要被序列化的類實(shí)現(xiàn)Serializable接口,該接口沒有需實(shí)現(xiàn)的方法,implementsSerializable只是為了標(biāo)注該對(duì)象是可被序列化的,然后使用一個(gè)輸出流(如FileOutputStream)來構(gòu)造一個(gè)ObjectOutputStream(對(duì)象流)對(duì)象,接著,使用ObjectOutputStream對(duì)象的writeObject(Objectobj)方法就可以將參數(shù)為obj的對(duì)象寫出(即保存其狀態(tài)),要恢復(fù)的話則用輸入流。92、java中有幾種類型的流?JDK為每種類型的流提供了一些抽象類以供繼承,請(qǐng)說出他們分別是哪些類?【基礎(chǔ)】答:字節(jié)流,字符流。字節(jié)流繼承于InputStream、OutputStream,字符流繼承于Reader、Writer。在java.io包中尚有許多其他的流,重要是為了提高性能和使用方便。93、文獻(xiàn)和目錄(IO)操作:1)如何列出某個(gè)目錄下的所有文獻(xiàn)?2)如何列出某個(gè)目錄下的所有子目錄?3)如何判斷一個(gè)文獻(xiàn)或目錄是否存在?4)如何讀寫文獻(xiàn)?【基礎(chǔ)】答:1)示例代碼如下:Filefile=newFile("e:\\總結(jié)");File[]files=file.listFiles();for(inti=0;i<files.length;i++){if(files[i].isFile())System.out.println(files[i]);}2)示例代碼如下:Filefile=newFile("e:\\總結(jié)");File[]files=file.listFiles();for(inti=0;i<files.length;i++){if(files[i].isDirectory())System.out.println(files[i]);}3)創(chuàng)建File對(duì)象,調(diào)用其exsit()方法即可返回是否存在,如:System.out.println(newFile("d:\\t.txt").exists());4)示例代碼如下://讀文獻(xiàn):FileInputStreamfin=newFileInputStream("e:\\tt.txt");第22頁共57頁byte[]bs=newbyte[100];while(true){intlen=fin.read(bs);if(len<=0)break;System.out.print(newString(bs,0,len));}fin.close();//寫文獻(xiàn):FileWriterfw=newFileWriter("e:\\test.txt");fw.write("helloworld!"+System.getProperty("line.separator"));fw.write("你好!北京!");fw.close();94、寫一個(gè)方法,輸入一個(gè)文獻(xiàn)名和一個(gè)字符串,記錄這個(gè)字符串在這個(gè)文獻(xiàn)中出現(xiàn)的次數(shù)?!净A(chǔ)】答:代碼如下:publicintcountWords(Stringfile,Stringfind)throwsException{intcount=0;Readerin=newFileReader(file);intc;while((c=in.read())!=-1){while(c==find.charAt(0)){for(inti=1;i<find.length();i++){c=in.read();if(c!=find.charAt(i))break;if(i==find.length()-1)count++;}}}returncount;}95、Java的通信編程,編程題(或問答),用JAVASOCKET編程,讀服務(wù)器幾個(gè)字符,再寫入本地顯示?【基礎(chǔ)】答:Server端程序:packagetest;importjav.*;importjava.io.*;publicclassServer{privateServerSocketss;privat(yī)eSocketsocket;privateBufferedReaderin;privat(yī)ePrintWriterout;publicServer(){try{第23頁共57頁ss=newServerSocket(10000);while(true){socket=ss.accept();StringRemoteIP=socket.getInetAddress().getHostAddress();StringRemotePort=":"+socket.getLocalPort();System.out.println("Aclientcomein!IP:"+RemoteIP+RemotePort);in=newBufferedReader(newInputStreamReader(socket.getInputStream()));Stringline=in.readLine();System.out.println("Cleintsendis:"+line);out=newPrintWriter(socket.getOutputStream(),true);out.println("YourMessageReceived!");out.close();in.close();socket.close();}}catch(IOExceptione){out.println("wrong");}}publicstaticvoidmain(String[]args){newServer();}}Client端程序:packagetest;importjava.io.*;importjava.net.*;publicclassClient{Socketsocket;BufferedReaderin;PrintWriterout;publicClient(){try{System.out.println("TrytoConnectto12:10000");socket=newSocket("127.0.0.1",10000);System.out.println("TheServerConnected!");System.out.println("PleaseentersomeCharacter:");BufferedReaderline=newBufferedReader(newInputStreamReader(System.in));out=newPrintWriter(socket.getOutputStream(),true);第24頁共57頁out.println(line.readLine());in=newBufferedReader(newInputStreamReader(socket.getInputStream()));System.out.println(in.readLine());out.close();in.close();socket.close();}catch(IOExceptione){out.println("Wrong");}}publicstat(yī)icvoidmain(String[]args){newClient();}}二、OOA/D與UML部分:(共6題:基礎(chǔ)2道,中檔難度4道)96、UML是什么?常用的幾種圖?【基礎(chǔ)】答:UML是標(biāo)準(zhǔn)建模語言;常用圖涉及:用例圖,靜態(tài)圖(涉及類圖、對(duì)象圖和包圖),行為圖,交互圖(順序圖,合作圖),實(shí)現(xiàn)圖。97、編程題:寫一個(gè)Singleton出來?!净A(chǔ)】答:Singleton模式重要作用是保證在Java應(yīng)用程序中,一個(gè)類Class只有一個(gè)實(shí)例存在。舉例:定義一個(gè)類,它的構(gòu)造函數(shù)為private的,它有一個(gè)static的private的該類變量,在類初始化時(shí)實(shí)例話,通過一個(gè)public的getInstance方法獲取對(duì)它的引用,繼而調(diào)用其中的方法。第一種形式:publicclassSingleton{privateSingleton(){}privatestaticSingletoninstance=newSingleton();publicstaticSingletongetInstance(){returninstance;}}第二種形式:publicclassSingleton{privat(yī)estaticSingletoninstance=null;publicstaticsynchronizedSingletongetInstance(){if(instance==null)instance=newSingleton();returninstance;}}第25頁共57頁其他形式:定義一個(gè)類,它的構(gòu)造函數(shù)為private的,所有方法為stat(yī)ic的。一般認(rèn)為第一種形式要更加安全些。98、說說你所熟悉或聽說過的j2ee中的幾種常用模式?及對(duì)設(shè)計(jì)模式

溫馨提示

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

評(píng)論

0/150

提交評(píng)論