java高頻面試題(2023最新)





一.java基礎(chǔ)
1.八大基礎(chǔ)類型
數(shù)字型: 字節(jié)類型(byte)、短整型short、整型int、長整型Long、單精度浮點數(shù)float、雙精度浮點數(shù)double
字符型: 字符類型char、
布爾型: 布爾類型boolean、
2.java三大特性
封裝: 使用private關(guān)鍵字,讓對象私有,防止無關(guān)的程序去使用。
繼承: 繼承某個類,使子類可以使用父類的屬性和方法。
多態(tài): 同一個行為,不同的子類具有不同的表現(xiàn)形式。
3.重載和重寫的區(qū)別
重載: 發(fā)生在同一類中,函數(shù)名必須一樣,參數(shù)類型、參數(shù)個數(shù)、參數(shù)順序、返回值、修飾符可以不一樣。
重寫: 發(fā)生在父子類中,函數(shù)名、參數(shù)、返回值必須一樣,訪問修飾符必須大于等于父類,異常要小于等于父類,父類方法是private不能重寫。
4.pubilc、protected、(dafault)不寫、private修飾符的作用范圍
pubilc: 同類、同包、子類、不同包都可以使用。
protected: 同類、同包、子類可以使用,不同包不能。
(dafault)不寫: 同類、同包可以使用,子類、不同包不能。
private: 只有同類可以。
5.==和equals的區(qū)別
==: 基礎(chǔ)類型比較的值,引用類型比較的是地址值。
equals: 沒有重寫比較地址值是否相等,重寫比較的內(nèi)容是否相對。比如String類重寫equals,源碼首先比較是否都是String對象,然后再向下比較。
6.hashcode()值相同,equals就一定為true
不一定,因為 "重地"和"通話"的hashcode值就相同,但是equals()就為false。
但是equals()為true,那么hashcode一定相同。
7.為什么重寫equals(),就要重寫hashcode()?
保證同一對象,如果不重寫hashcode,可能會出現(xiàn)equals比較一樣,但是hashcode不一樣的情況。
8.short s = 1;s = s + 1;(程序1)和 short s = 1; s += 1;(程序2)是否都能正常運行
程序1會編譯報錯,因為 s + 1的1是int類型,因為類型不兼容。強制轉(zhuǎn)換失敗。
程序2可以正常運行,因為java在復(fù)合賦值解釋是 E1 += E2,等價于 E1 = (T)(E1 + E2),T是E1的類型,因此s += 1等價于 s = (short)(s + 1),所以進行了強制類型的轉(zhuǎn)換,所以可以正常編譯。
9.說出下面程序的運行結(jié)果,及原因

因為Integer = a,相當(dāng)于自動裝箱(基礎(chǔ)類型轉(zhuǎn)為包裝類),因為Integer引入了IntegerCache來緩存一定的值,IntegerCache默認(rèn)是 -128~127,所以128超過了范圍,a和b不是相同對象,c和d是相同對象。
可以通過jvm啟動時,修改緩存的上限。
10.&和&&的區(qū)別
&&: 如果一邊為假,就不比較另一邊。具有短路行
&: 兩邊都為假,結(jié)果才為假,多用于位運算。
11.String、StringBuffer、StringBuilder的區(qū)別
String: 適用于少量字符串。創(chuàng)建之后不可更改,對String的修改會生成新的String對象。
StringBuilder: 適用于大量字符串,線程不安全,性能更快。單線程使用
StringBuffer: 適用于大量字符串,線程安全。多線程使用,用synchronized關(guān)鍵字修飾。
12.String rap = new String(“ctrl”);創(chuàng)建了幾個對象?
一個或兩個,如果常量池存在,那就在堆創(chuàng)建一個實例對象,否則常量池也需要創(chuàng)建一個。
13.什么是反射
在運行過程中,對于任何一個類都能獲取它的屬性和方法,任何一個對象都能調(diào)用其方法,動態(tài)獲取信息和動態(tài)調(diào)用,就是反射。
14.淺拷貝和深拷貝的區(qū)別
淺拷貝: 基礎(chǔ)數(shù)據(jù)類型復(fù)制值,引用類型復(fù)制引用地址,修改一個對象的值,另一個對象也隨之改變。
深拷貝: 基礎(chǔ)數(shù)據(jù)類型復(fù)制值,引用類型在新的內(nèi)存空間復(fù)制值,新老對象不共享內(nèi)存,修改一個值,不影響另一個。
深拷貝相對淺拷貝速度慢,開銷大。
15.構(gòu)造器能被重寫嗎
不能,可以被重載。
16.并發(fā)和并行
并發(fā): 一個處理器同時處理多個任務(wù)。(一個人同時吃兩個蘋果)
并行: 多個處理器同時處理多個任務(wù)。(兩個人同時吃兩個蘋果)
17.實例變量和類變量。
類變量是被static所修飾的,沒有被static修飾的叫實例變量也叫成員變量。同理也存在類對象和實例對象,類方法和實例方法。

18.說出下面程序的運行結(jié)果,及原因

原因:
①執(zhí)行順序是 父類靜態(tài)代碼塊(父類靜態(tài)變量) -> 子類靜態(tài)代碼塊(子類靜態(tài)變量) -> 父類非靜態(tài)代碼塊 -> 父類構(gòu)造方法 -> 子類非靜態(tài)代碼塊 -> 子類構(gòu)造方法
②靜態(tài)代碼塊(靜態(tài)變量)只執(zhí)行一次。
19.抽象類和接口的區(qū)別
抽象類只能單繼承,接口可以實現(xiàn)多個。
抽象類有構(gòu)造方法,接口沒有構(gòu)造方法。
抽象類可以有實例變量,接口中沒有實例變量,有常量。
抽象類可以包含非抽象方法,接口在java7之前所有方法都是抽象的,java8之后可以包含非抽象方法。
抽象類中方法可以是任意修飾符,接口中java8之前都是public,java9支持private。
擴展:普通類是親爹,手把手教你怎么學(xué),抽象類(多個類具有相同的東西,拿出來放抽象類)是師傅,教你一部分秘籍,然后告訴你怎么學(xué)。接口(規(guī)范了某些行為)是干爹,只給你秘籍,怎么學(xué)全靠你。
20.Error和Exception有什么區(qū)別
Error: 程序無法處理,比較嚴(yán)重的問題,程序會立即崩潰,jvm停止運行。
Exception: 程序本身可以處理(向上拋出或者捕獲)。編譯時異常和運行時異常
21.NoClassDefFoundError和ClassNotFoundException區(qū)別
NoClassDefFoundError: 在打包時漏掉了某些類或者打包時存在,然后你把target里的類刪除,然后jvm運行時找不到報錯。
ClassNotFoundException: 在編譯的時候某些類找不到,然后報錯。
22.如果try{} 里有一個 return 語句,那么finally{} 里的代碼會不會被執(zhí)行,什么時候被執(zhí)行,在 return 前還是后?
會執(zhí)行,在return之前執(zhí)行,如果finally有return那么try的return就會失效。
