溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

Java有哪些常見(jiàn)的面試題

發(fā)布時(shí)間:2021-11-30 14:19:55 來(lái)源:億速云 閱讀:142 作者:iii 欄目:大數(shù)據(jù)

本篇內(nèi)容介紹了“Java有哪些常見(jiàn)的面試題”的有關(guān)知識(shí),在實(shí)際案例的操作過(guò)程中,不少人都會(huì)遇到這樣的困境,接下來(lái)就讓小編帶領(lǐng)大家學(xué)習(xí)一下如何處理這些情況吧!希望大家仔細(xì)閱讀,能夠?qū)W有所成!

1、String s = new String("xyz");創(chuàng)建了幾個(gè)StringObject?是否可以繼承String類?

        兩個(gè)或一個(gè)都有可能,”xyz”對(duì)應(yīng)一個(gè)對(duì)象,這個(gè)對(duì)象放在字符串常量緩沖區(qū),常量”xyz”不管出現(xiàn)多少遍,都是緩沖區(qū)中的那一個(gè)。NewString每寫一遍,就創(chuàng)建一個(gè)新的對(duì)象,它使用常量”xyz”對(duì)象的內(nèi)容來(lái)創(chuàng)建出一個(gè)新String對(duì)象。如果以前就用過(guò)’xyz’,那么這里就不會(huì)創(chuàng)建”xyz”了,直接從緩沖區(qū)拿,這時(shí)創(chuàng)建了一個(gè)StringObject;但如果以前沒(méi)有用過(guò)"xyz",那么此時(shí)就會(huì)創(chuàng)建一個(gè)對(duì)象并放入緩沖區(qū),這種情況它創(chuàng)建兩個(gè)對(duì)象。至于String類是否繼承,答案是否定的,因?yàn)镾tring默認(rèn)final修飾,是不可繼承的。

2、String和StringBuffer的區(qū)別

        JAVA平臺(tái)提供了兩個(gè)類:String和StringBuffer,它們可以儲(chǔ)存和操作字符串,即包含多個(gè)字符的字符數(shù)據(jù)。這個(gè)String類提供了數(shù)值不可改變的字符串。而這個(gè)StringBuffer類提供的字符串可以進(jìn)行修改。當(dāng)你知道字符數(shù)據(jù)要改變的時(shí)候你就可以使用StringBuffer。典型地,你可以使用StringBuffers來(lái)動(dòng)態(tài)構(gòu)造字符數(shù)據(jù)。

     

3、下面這條語(yǔ)句一共創(chuàng)建了多少個(gè)對(duì)象:String s="a"+"b"+"c"+"d";

對(duì)于如下代碼:

String s1 = "a";

String s2 = s1 + "b";

String s3 = "a" + "b";

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

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

第一條語(yǔ)句打印的結(jié)果為false,第二條語(yǔ)句打印的結(jié)果為true,這說(shuō)明javac編譯可以對(duì)字符串常量直接相加的表達(dá)式進(jìn)行優(yōu)化,不必要等到運(yùn)行期再去進(jìn)行加法運(yùn)算處理,而是在編譯時(shí)去掉其中的加號(hào),直接將其編譯成一個(gè)這些常量相連的結(jié)果。

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

          String s ="a" + "b" +"c" + "d";

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

最終打印的結(jié)果應(yīng)該為true。

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

        我們知道finally{}中的語(yǔ)句是一定會(huì)執(zhí)行的,那么這個(gè)可能正常脫口而出就是return之前,return之后可能就出了這個(gè)方法了,鬼知道跑哪里去了,但更準(zhǔn)確的應(yīng)該是在return中間執(zhí)行,請(qǐng)看下面程序代碼的運(yùn)行結(jié)果:

public classTest {

    public static void main(String[]args) {

       System.out.println(newTest().test());;

    }

    static int test()

    {

       intx = 1;

       try

       {

          returnx;

       }

       finally

       {

          ++x;

       }

    }

  

}

---------執(zhí)行結(jié)果 ---------

1

運(yùn)行結(jié)果是1,為什么呢?主函數(shù)調(diào)用子函數(shù)并得到結(jié)果的過(guò)程,好比主函數(shù)準(zhǔn)備一個(gè)空罐子,當(dāng)子函數(shù)要返回結(jié)果時(shí),先把結(jié)果放在罐子里,然后再將程序邏輯返回到主函數(shù)。所謂返回,就是子函數(shù)說(shuō),我不運(yùn)行了,你主函數(shù)繼續(xù)運(yùn)行吧,這沒(méi)什么結(jié)果可言,結(jié)果是在說(shuō)這話之前放進(jìn)罐子里的。

5、final, finally, finalize的區(qū)別。

        final 用于聲明屬性,方法和類,分別表示屬性不可變,方法不可覆蓋,類不可繼承。內(nèi)部類要訪問(wèn)局部變量,局部變量必須定義成final類型。

        finally是異常處理語(yǔ)句結(jié)構(gòu)的一部分,表示總是執(zhí)行。

        finalize是Object類的一個(gè)方法,在垃圾收集器執(zhí)行的時(shí)候會(huì)調(diào)用被回收對(duì)象的此方法,可以覆蓋此方法提供垃圾收集時(shí)的其他資源回收,例如關(guān)閉文件等。但是JVM不保證此方法總被調(diào)用

6、運(yùn)行時(shí)異常與一般異常有何異同?

        異常表示程序運(yùn)行過(guò)程中可能出現(xiàn)的非正常狀態(tài),運(yùn)行時(shí)異常表示虛擬機(jī)的通常操作中可能遇到的異常,是一種常見(jiàn)運(yùn)行錯(cuò)誤。java編譯器要求方法必須聲明拋出可能發(fā)生的非運(yùn)行時(shí)異常,但是并不要求必須聲明拋出未被捕獲的運(yùn)行時(shí)異常。

7、error和exception有什么區(qū)別?

        error 表示恢復(fù)不是不可能但很困難的情況下的一種嚴(yán)重問(wèn)題。比如說(shuō)內(nèi)存溢出。不可能指望程序能處理這樣的情況。exception表示一種設(shè)計(jì)或?qū)崿F(xiàn)問(wèn)題。也就是說(shuō),它表示如果程序運(yùn)行正常,從不會(huì)發(fā)生的情況。

8、簡(jiǎn)單說(shuō)說(shuō)Java中的異常處理機(jī)制的簡(jiǎn)單原理和應(yīng)用。

        異常是指java程序運(yùn)行時(shí)(非編譯)所發(fā)生的非正常情況或錯(cuò)誤,與現(xiàn)實(shí)生活中的事件很相似,現(xiàn)實(shí)生活中的事件可以包含事件發(fā)生的時(shí)間、地點(diǎn)、人物、情節(jié)等信息,可以用一個(gè)對(duì)象來(lái)表示,Java使用面向?qū)ο蟮姆绞絹?lái)處理異常,它把程序中發(fā)生的每個(gè)異常也都分別封裝到一個(gè)對(duì)象來(lái)表示的,該對(duì)象中包含有異常的信息。

        Java對(duì)異常進(jìn)行了分類,不同類型的異常分別用不同的Java類表示,所有異常的根類為java.lang.Throwable,Throwable下面又派生了兩個(gè)子類:

        Error和Exception,Error表示應(yīng)用程序本身無(wú)法克服和恢復(fù)的一種嚴(yán)重問(wèn)題,程序只有奔潰了,例如,說(shuō)內(nèi)存溢出和線程死鎖等系統(tǒng)問(wèn)題。

        Exception表示程序還能夠克服和恢復(fù)的問(wèn)題,其中又分為系統(tǒng)異常和普通異常:

        系統(tǒng)異常是軟件本身缺陷所導(dǎo)致的問(wèn)題,也就是軟件開(kāi)發(fā)人員考慮不周所導(dǎo)致的問(wèn)題,軟件使用者無(wú)法克服和恢復(fù)這種問(wèn)題,但在這種問(wèn)題下還可以讓軟件系統(tǒng)繼續(xù)運(yùn)行或者讓軟件掛掉,例如,數(shù)組腳本越界(ArrayIndexOutOfBoundsException),空指針異常(NullPointerException)、類轉(zhuǎn)換異常(ClassCastException);

        普通異常是運(yùn)行環(huán)境的變化或異常所導(dǎo)致的問(wèn)題,是用戶能夠克服的問(wèn)題,例如,網(wǎng)絡(luò)斷線,硬盤空間不夠,發(fā)生這樣的異常后,程序不應(yīng)該死掉。

java為系統(tǒng)異常和普通異常提供了不同的解決方案,編譯器強(qiáng)制普通異常必須try..catch處理或用throws聲明繼續(xù)拋給上層調(diào)用方法處理,所以普通異常也稱為checked異常,而系統(tǒng)異??梢蕴幚硪部梢圆惶幚?,所以,編譯器不強(qiáng)制用try..catch處理或用throws聲明,所以系統(tǒng)異常也稱為unchecked異常。

9、Java 中堆和棧有什么區(qū)別?
        JVM 中堆和棧屬于不同的內(nèi)存區(qū)域,使用目的也不同。棧常用于保存方法幀和局部變量,而對(duì)象總是在堆上分配。棧通常都比堆小,也不會(huì)在多個(gè)線程之間共享,而堆被整個(gè) JVM 的所有線程共享。

        棧:在函數(shù)中定義的一些基本類型的變量和對(duì)象的引用變量都是在函數(shù)的棧內(nèi)存中分配,當(dāng)在一段代碼塊定義一個(gè)變量時(shí),Java 就在棧中為這個(gè)變量分配內(nèi)存空間,當(dāng)超過(guò)變量的作用域后,Java 會(huì)自動(dòng)釋放掉為該變量分配的內(nèi)存空間,該內(nèi)存空間可以立即被另作它用。

        堆:堆內(nèi)存用來(lái)存放由 new 創(chuàng)建的對(duì)象和數(shù)組,在堆中分配的內(nèi)存,由 Java 虛擬機(jī)的自動(dòng)垃圾回收器來(lái)管理。在堆中產(chǎn)生了一個(gè)數(shù)組或者對(duì)象之后,還可以在棧中定義一個(gè)特殊的變量,讓棧中的這個(gè)變量的取值等于數(shù)組或?qū)ο笤诙褍?nèi)存中的首地址,棧中的這個(gè)變量就成了數(shù)組或?qū)ο蟮囊米兞?,以后就可以在程序中使用棧中的引用變量?lái)訪問(wèn)堆中的數(shù)組或者對(duì)象,引用變量就相當(dāng)于是為數(shù)組或者對(duì)象起的一個(gè)名稱。

10、能將 int 強(qiáng)制轉(zhuǎn)換為 byte 類型的變量嗎?如果該值大于 byte 類型的范圍,將會(huì)出現(xiàn)什么現(xiàn)象?
        我們可以做強(qiáng)制轉(zhuǎn)換,但是 Java 中 int 是 32 位的,而 byte 是 8 位的,所以,如果強(qiáng)制轉(zhuǎn)化,int 類型的高 24 位將會(huì)被丟棄,因?yàn)閎yte 類型的范圍是從 -128 到 128。

“Java有哪些常見(jiàn)的面試題”的內(nèi)容就介紹到這里了,感謝大家的閱讀。如果想了解更多行業(yè)相關(guān)的知識(shí)可以關(guān)注億速云網(wǎng)站,小編將為大家輸出更多高質(zhì)量的實(shí)用文章!

向AI問(wèn)一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI