數(shù)據(jù)類型之間的轉(zhuǎn)換:
如何將字符串轉(zhuǎn)換為基本數(shù)據(jù)類型?
如何將基本數(shù)據(jù)類型轉(zhuǎn)換為字符串?
調(diào)用基本數(shù)據(jù)類型對(duì)應(yīng)的包裝類中的方法parseXXX(String)或valueOf(String)即可返回相應(yīng)基本類型;
一種方法是將基本數(shù)據(jù)類型與空字符串("")連接(+)即可獲得其所對(duì)應(yīng)的字符串;另一種方法是調(diào)用String類中的valueOf()方法返回相應(yīng)字符串
如何實(shí)現(xiàn)字符串的反轉(zhuǎn)及替換?
方法很多,可以自己寫實(shí)現(xiàn)也可以使用String或StringBuffer/StringBuilder中的方法。有一道很常見的面試題是用遞歸實(shí)現(xiàn)字符串反轉(zhuǎn),代碼如下所示:
publicstaticStringreverse(StringoriginStr){if(originStr==null||originStr.length()<=1)returnoriginStr;returnreverse(originStr.substring(1))+originStr.charAt(0);}
怎樣將smxfl.cn編碼的字符串轉(zhuǎn)換為lrzqb.cn編碼的字符串?
代碼如下所示:
Strings1="你好";
Strings2=newString(s1.getBytes("GB2312"),"ISO-8859-1");
打印昨天的當(dāng)前時(shí)刻。
importjava.util.Calendar;classYesterdayCurrent{publicstaticvoidmain(String[]args){Calendarcal=Calendar.getInstance();cal.add(Calendar.DATE,-1);System.out.println(cal.getTime());}}在Java8中,可以用下面的代碼實(shí)現(xiàn)相同的功能。
importjava.time.LocalDateTime;classYesterdayCurrent{publicstaticvoidmain(String[]args){LocalDateTimetoday=LocalDateTime.now();LocalDateTimeyesterday=today.minusDays(1);System.out.println(yesterday);}}
比較一下Java和JavaSciprt。
Javascript與Java是兩個(gè)公司開發(fā)的不同的兩個(gè)產(chǎn)品。Java是原Sun
Microsystems公司推出的面向?qū)ο蟮某绦蛟O(shè)計(jì)語言,特別適合于互聯(lián)網(wǎng)應(yīng)用程序開發(fā);而Javascript是Netscape公司的產(chǎn)品,為了擴(kuò)展Netscape瀏覽器的功能而開發(fā)的一種可以嵌入Web頁面中運(yùn)行的基于對(duì)象和事件驅(qū)動(dòng)的解釋性語言。Javascript的前身是Livescript;而Java的前身是Oak語言。
下面對(duì)兩種語言間的異同作如下比較:
基于對(duì)象和面向?qū)ο螅篔ava是一種真正的面向?qū)ο蟮恼Z言,即使是開發(fā)簡單的程序,必須設(shè)計(jì)對(duì)象;Javascript是種腳本語言,它可以用來制作與網(wǎng)絡(luò)無關(guān)的,與用戶交互作用的復(fù)雜軟件。它是一種基于對(duì)象(Object-based)和事件驅(qū)動(dòng)(Event-Driven)的編程語言,因而它本身提供了非常豐富的內(nèi)部對(duì)象供設(shè)計(jì)人員使用。
解釋和編譯:Java的源代碼在執(zhí)行之前,必須經(jīng)過編譯。Javascript是一種解釋性編程語言,其源代碼不需經(jīng)過編譯,由瀏覽器解釋執(zhí)行。(目前的瀏覽器幾乎都使用了JIT(即時(shí)編譯)技術(shù)來提升Javascript的運(yùn)行效率)強(qiáng)類型變量和類型弱變量:Java采用強(qiáng)類型變量檢查,即所有變量在編譯之前必須作聲明;Javascript中變量是弱類型的,甚至在使用變量前可以不作聲明,Javascript的解釋器在運(yùn)行時(shí)檢查推斷其數(shù)據(jù)類型。代碼格式不一樣。
補(bǔ)充:上面列出的四點(diǎn)是網(wǎng)上流傳的所謂的標(biāo)準(zhǔn)答案。其實(shí)Java和Javascript最重要的區(qū)別是一個(gè)是靜態(tài)語言,一個(gè)是動(dòng)態(tài)語言。目前的編程語言的發(fā)展趨勢(shì)是函數(shù)式語言和動(dòng)態(tài)語言。在Java中類(class)是一等公民,而Javascript中函數(shù)(function)是一等公民,因此Javascript支持函數(shù)式編程,可以使用Lambda函數(shù)和閉包(closure),當(dāng)然Java8也開始支持函數(shù)式編程,提供了對(duì)Lambda表達(dá)式以及函數(shù)式接口的支持。對(duì)于這類問題,在面試的時(shí)候最好還是用自己的語言回答會(huì)更加靠譜,不要背網(wǎng)上所謂的標(biāo)準(zhǔn)答案。
什么時(shí)候用斷言(assert)?
斷言在軟件開發(fā)中是一種常用的調(diào)試方式,很多開發(fā)語言中都支持這種機(jī)制。一般來說,斷言用于保證程序最基本、關(guān)鍵的正確性。斷言檢查通常在開發(fā)和測(cè)試時(shí)開啟。為了保證程序的執(zhí)行效率,在軟件發(fā)布后斷言檢查通常是關(guān)閉的。斷言是一個(gè)包含布爾表達(dá)式的語句,在執(zhí)行這個(gè)語句時(shí)假定該表達(dá)式為true;如果表達(dá)式的值為false,那么系統(tǒng)會(huì)報(bào)告一個(gè)AssertionError。斷言的使用如下面的代碼所示:
assert(a>0);//throwsanAssertionErrorifa<=011
斷言可以有兩種形式:
assertexpression1;
assertexpression1:expression2;
expression1應(yīng)該總是產(chǎn)生一個(gè)布爾值。
expression2可以是得出一個(gè)值的任意表達(dá)式;這個(gè)值用于生成顯示更多調(diào)試信息的字符串消息。
要在運(yùn)行時(shí)啟用斷言,可以在啟動(dòng)JVM時(shí)使用-enableassertions或者-ea標(biāo)記。要在運(yùn)行時(shí)選擇禁用斷言,可以在啟動(dòng)JVM時(shí)使用-da或者-disableassertions標(biāo)記。要在系統(tǒng)類中啟用或禁用斷言,可使用-esa或-dsa標(biāo)記。還可以在包的基礎(chǔ)上啟用或者禁用斷言。
注意:斷言不應(yīng)該以任何方式改變程序的狀態(tài)。簡單的說,如果希望在不滿足某些條件時(shí)阻止代碼的執(zhí)行,就可以考慮用斷言來阻止它。
Error和Exception有什么區(qū)別?
Error表示系統(tǒng)級(jí)的錯(cuò)誤和程序不必處理的異常,是恢復(fù)不是不可能但很困難的情況下的一種嚴(yán)重問題;比如內(nèi)存溢出,不可能指望程序能處理這樣的情況;Exception表示需要捕捉或者需要程序進(jìn)行處理的異常,是一種設(shè)計(jì)或?qū)崿F(xiàn)問題;也就是說,它表示如果程序運(yùn)行正常,從不會(huì)發(fā)生的情況。
try{}里有一個(gè)return語句,那么緊跟在這個(gè)try后的finally{}里的代碼會(huì)不會(huì)被執(zhí)行,什么時(shí)候被執(zhí)行,在return前還是后?
會(huì)執(zhí)行,在方法返回調(diào)用者前執(zhí)行。
注意:在finally中改變返回值的做法是不好的,因?yàn)槿绻嬖趂inally代碼塊,try中的return語句不會(huì)立馬返回調(diào)用者,而是記錄下返回值待finally代碼塊執(zhí)行完畢之后再向調(diào)用者返回其值,然后如果在finally中修改了返回值,就會(huì)返回修改后的值。顯然,在finally中返回或者修改返回值會(huì)對(duì)程序造成很大的困擾,C#中直接用編譯錯(cuò)誤的方式來阻止程序員干這種齷齪的事情,Java中也可以通過提升編譯器的語法檢查級(jí)別來產(chǎn)生警告或錯(cuò)誤,Eclipse中可以在如圖所示的地方進(jìn)行設(shè)置,強(qiáng)烈建議將此項(xiàng)設(shè)置為編譯錯(cuò)誤。
Java語言如何進(jìn)行異常處理,關(guān)鍵字:throws、throw、try、catch、finally分別如何使用?
Java通過面向?qū)ο蟮姆椒ㄟM(jìn)行異常處理,把各種不同的異常進(jìn)行分類,并提供了良好的接口。在Java中,每個(gè)異常都是一個(gè)對(duì)象,它是Throwable類或其子類的實(shí)例。當(dāng)一個(gè)方法出現(xiàn)異常后便拋出一個(gè)異常對(duì)象,該對(duì)象中包含有異常信息,調(diào)用這個(gè)對(duì)象的方法可以捕獲到這個(gè)異常并可以對(duì)其進(jìn)行處理。Java的異常處理是通過5個(gè)關(guān)鍵詞來實(shí)現(xiàn)的:try、catch、throw、throws和finally。一般情況下是用try來執(zhí)行一段程序,如果系統(tǒng)會(huì)拋出(throw)一個(gè)異常對(duì)象,可以通過它的類型來捕獲(catch)它,或通過總是執(zhí)行代碼塊(finally)來處理;try用來指定一塊預(yù)防所有異常的程序;catch子句緊跟在try塊后面,用來指定你想要捕獲的異常的類型;throw語句用來明確地拋出一個(gè)異常;throws用來聲明一個(gè)方法可能拋出的各種異常(當(dāng)然聲明異常時(shí)允許無病呻吟);finally為確保一段代碼不管發(fā)生什么異常狀況都要被執(zhí)行;try語句可以嵌套,每當(dāng)遇到一個(gè)try語句,異常的結(jié)構(gòu)就會(huì)被放入異常棧中,直到所有的try語句都完成。如果下一級(jí)的try語句沒有對(duì)某種異常進(jìn)行處理,異常棧就會(huì)執(zhí)行出棧操作,直到遇到有處理這種異常的try語句或者最終將異常拋給JVM。
運(yùn)行時(shí)異常與受檢異常有何異同?
異常表示程序運(yùn)行過程中可能出現(xiàn)的非正常狀態(tài),運(yùn)行時(shí)異常表示虛擬機(jī)的通常操作中可能遇到的異常,是一種常見運(yùn)行錯(cuò)誤,只要程序設(shè)計(jì)得沒有問題通常就不會(huì)發(fā)生。受檢異常跟程序運(yùn)行的上下文環(huán)境有關(guān),即使程序設(shè)計(jì)無誤,仍然可能因使用的問題而引發(fā)。Java編譯器要求方法必須聲明拋出可能發(fā)生的受檢異常,但是并不要求必須聲明拋出未被捕獲的運(yùn)行時(shí)異常。異常和繼承一樣,是面向?qū)ο蟪绦蛟O(shè)計(jì)中經(jīng)常被濫用的東西,在Effective中
Java中對(duì)異常的使用給出了以下指導(dǎo)原則:
不要將異常處理用于正常的控制流(設(shè)計(jì)良好的API不應(yīng)該強(qiáng)迫它的調(diào)用者為了正常的控制流而使用異常)對(duì)可以恢復(fù)的情況使用受檢異常,對(duì)編程錯(cuò)誤使用運(yùn)行時(shí)異常避免不必要的使用受檢異常(可以通過一些狀態(tài)檢測(cè)手段來避免異常的發(fā)生)優(yōu)先使用標(biāo)準(zhǔn)的異常每個(gè)方法拋出的異常都要有文檔保持異常的原子性不要在catch中忽略掉捕獲到的異常
以上就是北大青鳥長沙麓谷校區(qū)java培訓(xùn)機(jī)構(gòu)小編介紹的“各大互聯(lián)網(wǎng)公司Java面試題匯總”的內(nèi)容,希望對(duì)大家有幫助,更多java最新資訊請(qǐng)繼續(xù)關(guān)注北大青鳥長沙麓谷校區(qū)java培訓(xùn)機(jī)構(gòu)官網(wǎng),每天會(huì)有精彩內(nèi)容分享與你。
Java面試題