前段時間給大家發(fā)過一份 java 面試題的思維導圖,接下來我會用通俗、簡潔、易記的話將其整理成一系列的文章,加深自己印象的同時,也希望能助大家跳槽成功!
1. 說說 java 的基本數(shù)據(jù)類型以及所占的字節(jié)數(shù)。
byte、short、int、long,1、2、4、8;boolean、char、float、double,1、2、4、8。
2. 談談你對接口和抽象類的理解。
抽象類是對一組事務的共同點進行提取,比如貓和狗,對它們的共同點進行提取,抽象成一個動物類; 接口是對一組行為的規(guī)范,實現(xiàn)接口就必須實現(xiàn)接口里面定義的方法,比如 List 接口規(guī)范了它有 add、remove 等方法,那么 List 的實現(xiàn)類就必須按照它的規(guī)范去實現(xiàn) add、remove 等方法。
3. 各權限修飾符有什么區(qū)別?
public 修飾的任一地方都可以訪問; protect 修飾的同一包下的以及它的子類可以訪問; 不寫(default),只有同一包下的可以訪問; private 修飾的只有當前類以及當前類的內部類能訪問。
4. switch 可以作用在哪些類型上?
byte、short、int、char、String、enum
5. 什么是內部類?優(yōu)點是什么?
寫在一個類里面的類,叫做內部類。優(yōu)點是對外部不可見,有很好的封裝性,而且可以訪問私有變量。
6. 什么是 java 的多態(tài)?
多態(tài)就是要到運行時才能確定類型,體現(xiàn)為重載和重寫。
7. 為什么重寫了 equals 方法就要重寫 hashCode 方法?
因為有個規(guī)定,兩個對象相等那么 hashCode 值就得相同,而 hashCode 值本來是根據(jù)對象在內存中的地址值計算出來的,對象不同那么 hashCode 一定不會相同,所以如果重寫了 equals 方法,就一定得重寫 hashCode 方法。
8. 類的初始化順序你知道嗎?
加載的先后順序是:父類靜態(tài)成員變量、父類靜態(tài)代碼塊、子類靜態(tài)變量、子類靜態(tài)代碼塊、父類非靜態(tài)變量、父類非靜態(tài)代碼塊、父類構造函數(shù)、子類非靜態(tài)變量、子類非靜態(tài)代碼塊、子類構造函數(shù)。
9. String、StringBuffer 和 StringBuilder有什么不同?
String 用 final 修飾了,是不可變的,重新賦值會指向新的對象,因為 final 修飾,所以線程安全; JVM 中有個字符串常量池,jdk1.7 之前這個常量池在方法區(qū),也就是永久代,jdk1.7 及之后字符串常量池在堆內存中; new 一個 String 對象的時候,會在堆內存中生成對象,同時把這個對象放到字符串常量池中; 直接賦值 String 的時候,首先會看字符串常量池中有沒有,有就直接拿來用,沒有就先往常量池放一份再拿來用; 用加號拼接字符串,如果是兩個常量拼接,編譯期就直接拼接好,然后放到常量池中,如果有變量拼接,那就會調用 StringBuilder 的 append 方法在堆中生成新對象,但是這個并不會放到常量池中; 它有個 intern 方法,jdk1.7 以前,會把該方法的調用者放到常量池中,jdk1.7 及之后,會把調用者的引用放到常量池中。 StringBuffer 是線程安全的、可變的,效率較低; StringBuilder 線程不安全、可變,效率較高。
10. Math.round(11.5) 和 Math.round(-11.5) 的結果分別是什么?
12 和 -11,四舍五入是操作數(shù)加上 0.5 然后向下取整。
11. float f = 3.4、short s = 1, s = s + 1、s += 1 是否正確?
float f = 3.4 是錯誤的,浮點型默認是 double,double 類型的用 float 接收屬于向下轉型,需要強轉; short s = 1 是錯誤的,整型默認是 int,int 類型用 short 接收也是向下轉型,要強轉; s = s + 1還是錯誤的,需要強轉;s += 1 是正確的,+= 隱含了強轉。
12. 假如 Integer i1 = 150,Integer i2 = 150,那么 i1 和 i2 是否相等?
Integer 有個緩沖池,-128~127這個范圍內的直接從緩沖池取出,超過這個范圍會在堆中生成新對象,所以 i1 和 i2 不相等。
13. 與(&)、或(|)、異或(^) 操作符你知道嗎?
與,都為 1 時結果才為 1; 或,有 1 時結果就為 1; 異或,一個為 0 一個為 1 時結果才是 1。
14. java 反射怎么理解?
在運行過程中可以獲取任意一類的任意屬性和方法,可以調用任意一類的屬性和方法,這種動態(tài)獲取信息動態(tài)調用對象的機制叫反射。
15. 反射有幾種方式?
反射有三種方式,一種是通過對象調用 getClass() 方法; 一種是用 Class.forName("className") 方法; 還有一種是直接 對象.class 。
16. 反射有什么優(yōu)缺點?
優(yōu)點是可以動態(tài)判斷類型,動態(tài)加載類,提高代碼的靈活性; 缺點是反射需要經(jīng)過一系列的 JVM 操作,性能不太好。
17. 反射的應用場景有哪些?
比如 JDBC 加載數(shù)據(jù)庫驅動、動態(tài)代理、Spring xml 方式加載 bean。
18. java 中的異常體系你知道嗎?
最頂層的抽象類是 Throwable,它有兩個子類,Error 和 Exception; Error 是虛擬機無法處理的系統(tǒng)錯誤,比如棧內存溢出 StackOverflowError、內存溢出 OutOfMemoryError; Exception 是異常,分為編譯期異常和運行時異常; 編譯期異常就是程序必須處理的,不處理你的開發(fā)工具就會有錯誤提示的,比如 IOException、ClassNotFoundException; 運行時異常就是要等程序運行時才會發(fā)生的異常,比如 NullPointerException、IndexOutOfBoundsException、ConcurrentModificationException 等。
19. 異??梢栽趺刺幚??
拋出(Throw)、捕獲(try catch)、聲明(Throws)。
20. 你知道 finally 嗎?
finally,配合 try catch 使用,try 中寫要捕獲異常的代碼, catch 中寫捕獲到異常后的操作,finally 中寫一定要執(zhí)行的代碼,比如關閉資源、釋放連接等。
21. finally 中的代碼一定會執(zhí)行嗎?
在程序發(fā)生異常之前或 try 中的代碼塊正常執(zhí)行完之前,調用了 System.exist(),finally 中代碼不會執(zhí)行; 程序所在線程死亡,finally 中的代碼不會執(zhí)行。
22. 在 try 或 catch 中調用了 return,finally 還會執(zhí)行嗎?
會,且在 return 之前執(zhí)行。
掃描二維碼