2019年Java面試題基礎系列228道
Java面試題(一)
第一篇更新1~20題的答案解析
第二篇更新21~50題答案解析
juejin.im/post/5dea1d…
第三篇更新51~95題答案解析
juejin.im/post/5decd3…
Java面試題(二)
第四篇更新1~20題答案解析

Java面試題(二)
21、存在兩個類,B 繼承 A ,C 繼承 B,我們能將 B 轉換為 C 麼?如 C = (C) B;
22、哪個類包含 clone 方法?是 Cloneable 還是 Object?
23、Java 中 ++ 操作符是執行緒安全的嗎?
23、不是執行緒安全的操作。它涉及到多個指令,如讀取變數值,增加,然後儲存回記憶體,這個過程可能會出現多個執行緒交差。
24、a = a + b 與 a += b 的區別
25、我能在不進行強制轉換的情況下將一個 double 值賦值給 long型別的變數嗎?
26、3*0.1 == 0.3 將會返回什麼?true 還是 false?
27、int 和 Integer 哪個會佔用更多的記憶體?
28、為什麼 Java 中的 String 是不可變的(Immutable)?
31、64 位 JVM 中,int 的長度是多數?
32、Serial 與 Parallel GC 之間的不同之處?
33、32 位和 64 位的 JVM,int 型別變數的長度是多數?
34、Java 中 WeakReference 與 SoftReference 的區別?
35、WeakHashMap 是怎麼工作的?
36、JVM 選項 -XX:+UseCompressedOops 有什麼作用?為什麼要使用?
37、怎樣通過 Java 程式來判斷 JVM 是 32 位 還是 64 位?
38、32 位 JVM 和 64 位 JVM 的最大堆記憶體分別是多數?
39、JRE、JDK、JVM 及 JIT 之間有什麼不同?
40、解釋 Java 堆空間及 GC?
41、你能保證 GC 執行嗎?
42、怎麼獲取 Java 程式使用的記憶體?堆使用的百分比?
43、Java 中堆和棧有什麼區別?
44、“a==b”和”a.equals(b)”有什麼區別?
45、a.hashCode() 有什麼用?與 a.equals(b) 有什麼關係?
46、final、finalize 和 finally 的不同之處?
47、Java 中的編譯期常量是什麼?使用它又什麼風險?
48、List、Set、Map 和 Queue 之間的區別(答案)
49、poll() 方法和 remove() 方法的區別?
50、Java 中 LinkedHashMap 和 PriorityQueue 的區別是什麼?
本篇更新21-50題的答案

21、存在兩個類,B 繼承 A,C 繼承 B,我們能將 B 轉換為C 麼?如 C = (C) B;
這屬於強制型別轉換,如果被轉換的B例項不是C型別,會有異常
比如你的ABC分別對應動物,貓,黑貓。
向上轉型就是比如
C c = new C();
B b = c;
你把c轉型為B,黑貓是貓嗎?是啊,所以這是ok的。
但是反過來
B b = new B();
C c = (C)b;
這就不ok了,只知道這個b是一隻貓,他不一定是黑貓。
但如果這個b已經確定是一隻黑貓了,那就可以轉型了
B b = new C();
C c = (C)b;
這裡的b本來就是黑貓啊。
22、哪個類包含 clone 方法?是 Cloneable 還是 Object?
java.lang.Cloneable 是一個標示性介面,不包含任何方法,clone 方法在object 類中定義。並且需要知道 clone() 方法是一個本地方法,這意味著它是由c 或 c++ 或 其他本地語言實現的。
23、Java 中 ++ 操作符是執行緒安全的嗎?
不是執行緒安全的操作。它涉及到多個指令,如讀取變數值,增加,然後儲存回記憶體,這個過程可能會出現多個執行緒交差。
24、a = a + b 與 a += b 的區別
+= 隱式的將加操作的結果型別強制轉換為持有結果的型別。如果兩這個整型相加,如 byte、short 或者 int,首先會將它們提升到 int 型別,然後在執行加法操作。如果加法操作的結果比 a 的最大值要大,則 a+b 會出現編譯錯誤,但是
byte a = 127;
byte b = 127;
b = a + b;
// error : cannot convert from int to byte
b += a;
// ok複製程式碼
(譯者注:這個地方應該表述的有誤,其實無論 a+b 的值為多少,編譯器都會報錯,因為 a+b 操作會將 a、b 提升為 int 型別,所以將 int 型別賦值給 byte就會編譯出錯)
25、我能在不進行強制轉換的情況下將一個 double 值賦值給long 型別的變數嗎?
不行,你不能在沒有強制型別轉換的前提下將一個 double 值賦值給 long 型別的變數,因為 double 型別的範圍比 long 型別更廣,所以必須要進行強制轉換。
26、3*0.1 == 0.3 將會返回什麼?true 還是 false?
false,因為有些浮點數不能完全精確的表示出來。
27、int 和 Integer 哪個會佔用更多的記憶體?
Integer 物件會佔用更多的記憶體。Integer 是一個物件,需要儲存物件的後設資料。但是 int 是一個原始型別的資料,所以佔用的空間更少。
28、為什麼 Java 中的 String 是不可變的(Immutable)?
Java 中的 String 不可變是因為 Java 的設計者認為字串使用非常頻繁,將字串設定為不可變可以允許多個客戶端之間共享相同的字串。
29、我們能在 Switch 中使用 String 嗎?
從 Java 7 開始,我們可以在 switch case 中使用字串,但這僅僅是一個語法糖。內部實現在 switch 中使用字串的 hash code。
30、Java 中的構造器鏈是什麼?
當你從一個構造器中呼叫另一個構造器,就是 Java 中的構造器鏈。這種情況只在過載了類的構造器的時候才會出現。
31、64 位 JVM 中,int 的長度是多數?
Java 中,int 型別變數的長度是一個固定值,與平臺無關,都是 32 位。意思就是說,在32位和64位的java虛擬機器中,int 型別的長度是相同的。
32、Serial 與 Parallel GC 之間的不同之處?
Serial 與 Parallel 在 GC 執行的時候都會引起 stop-the-world。它們之間主要不同 serial 收集器是預設的複製收集器,執行 GC 的時候只有一個執行緒,而parallel 收集器使用多個 GC 執行緒來執行。
33、32 位和 64 位的 JVM,int 型別變數的長度是多數?
32 位和 64 位的 JVM 中,int 型別變數的長度是相同的,都是 32 位或者 4個位元組。
34、Java 中 WeakReference 與 SoftReference 的區別?
雖然 WeakReference 與 SoftReference 都有利於提高 GC 和 記憶體的效率,但是 WeakReference ,一旦失去最後一個強引用,就會被 GC 回收,而軟引用雖然不能阻止被回收,但是可以延遲到 JVM 記憶體不足的時候。
35、WeakHashMap 是怎麼工作的?
WeakHashMap 的工作與正常的 HashMap 類似,但是使用弱引用作為 key,意思就是當 key 物件沒有任何引用時,key/value 將會被回收。
36、JVM 選項 -XX:+UseCompressedOops 有什麼作用?為什麼要使用?
當你將你的應用從 32 位的 JVM 遷移到 64 位的 JVM 時,由於物件的指標從32 位增加到了 64 位,因此堆記憶體會突然增加,差不多要翻倍。這也會對 CPU快取(容量比記憶體小很多)的資料產生不利的影響。因為,遷移到 64 位的 JVM主要動機在於可以指定最大堆大小,通過壓縮 OOP 可以節省一定的記憶體。通過-XX:+UseCompressedOops 選項,JVM 會使用 32 位的 OOP,而不是 64 位的 OOP。
37、怎樣通過 Java 程式來判斷 JVM 是 32 位 還是 64位?
你可以檢查某些系統屬性如 sun.arch.data.model 或 os.arch 來獲取該資訊。
38、32 位 JVM 和 64 位 JVM 的最大堆記憶體分別是多數?
理論上說上 32 位的 JVM 堆記憶體可以到達 2^32,即 4GB,但實際上會比這個小很多。不同作業系統之間不同,如 Windows 系統大約 1.5 GB,Solaris 大約3GB。64 位 JVM 允許指定最大的堆記憶體,理論上可以達到 2^64,這是一個非常大的數字,實際上你可以指定堆記憶體大小到 100GB。甚至有的 JVM,如 Azul,堆記憶體到 1000G 都是可能的。
39、JRE、JDK、JVM 及 JIT 之間有什麼不同?
JRE 代表 Java 執行 時(Java run-time),是 運 行 Java 引用所必須的。JDK 代表 Java 開發工具(Java development kit),是 Java 程式的開發工具,如 Java編譯器,它也包含 JRE。JVM 代表 Java 虛擬機器(Java virtual machine),它的責任是執行 Java 應用。JIT 代表即時編譯(Just In Time compilation),當程式碼執行的次數超過一定的閾值時,會將 Java 位元組碼轉換為原生程式碼,如,主要的熱點程式碼會被準換為原生程式碼,這樣有利大幅度提高 Java 應用的效能。

40、解釋 Java 堆空間及 GC?
當通過 Java 命令啟動 Java 程式的時候,會為它分配記憶體。記憶體的一部分用於建立堆空間,當程式中建立物件的時候,就從對空間中分配記憶體。GC 是 JVM 內部的一個程式,回收無效物件的記憶體用於將來的分配。
41、你能保證 GC 執行嗎?
不能,雖然你可以呼叫 System.gc() 或者 Runtime.gc(),但是沒有辦法保證 GC的執行。
42、怎麼獲取 Java 程式使用的記憶體?堆使用的百分比?
可以通過 java.lang.Runtime 類中與記憶體相關方法來獲取剩餘的記憶體,總記憶體及最大堆記憶體。通過這些方法你也可以獲取到堆使用的百分比及堆記憶體的剩餘空間。Runtime.freeMemory() 方法返回剩餘空間的位元組數,Runtime.totalMemory()方法總記憶體的位元組數,Runtime.maxMemory() 返回最大記憶體的位元組數。
43、Java 中堆和棧有什麼區別?
JVM 中堆和棧屬於不同的記憶體區域,使用目的也不同。棧常用於儲存方法幀和區域性變數,而物件總是在堆上分配。棧通常都比堆小,也不會在多個執行緒之間共享,而堆被整個 JVM 的所有執行緒共享。
44、“a==b”和”a.equals(b)”有什麼區別?
如果 a 和 b 都是物件,則 a==b 是比較兩個物件的引用,只有當 a 和 b 指向的是堆中的同一個物件才會返回 true,而 a.equals(b) 是進行邏輯比較,所以通常需要重寫該方法來提供邏輯一致性的比較。例如,String 類重寫 equals() 方法,所以可以用於兩個不同物件,但是包含的字母相同的比較。
45、a.hashCode() 有什麼用?與 a.equals(b) 有什麼關係?
hashCode() 方法是相應物件整型的 hash 值。它常用於基於 hash 的集合類,如 Hashtable、HashMap、LinkedHashMap 等等。它與 equals() 方法關係特別緊密。根據 Java 規範,兩個使用 equal() 方法來判斷相等的物件,必須具有相同的 hash code。
46、final、finalize 和 finally 的不同之處?
final 是一個修飾符,可以修飾變數、方法和類。如果 final 修飾變數,意味著該變數的值在初始化後不能被改變。finalize 方法是在物件被回收之前呼叫的方法,給物件自己最後一個復活的機會,但是什麼時候呼叫 finalize 沒有保證。finally是一個關鍵字,與 try 和 catch 一起用於異常的處理。finally 塊一定會被執行,無論在 try 塊中是否有發生異常。
47、Java 中的編譯期常量是什麼?使用它又什麼風險?
公共靜態不可變(public static final )變數也就是我們所說的編譯期常量,這裡的 public 可選的。實際上這些變數在編譯時會被替換掉,因為編譯器知道這些變數的值,並且知道這些變數在執行時不能改變。這種方式存在的一個問題是你使用了一個內部的或第三方庫中的公有編譯時常量,但是這個值後面被其他人改變了,但是你的客戶端仍然在使用老的值,甚至你已經部署了一個新的 jar。為了避免這種情況,當你在更新依賴 JAR 檔案時,確保重新編譯你的程式。
48、List、Set、Map 和 Queue 之間的區別(答案)
List 是一個有序集合,允許元素重複。它的某些實現可以提供基於下標值的常量訪問時間,但是這不是 List 介面保證的。Set 是一個無序集合。
49、poll() 方法和 remove() 方法的區別?
poll() 和 remove() 都是從佇列中取出一個元素,但是 poll() 在獲取元素失敗的時候會返回空,但是 remove() 失敗的時候會丟擲異常。
50、Java 中 LinkedHashMap 和 PriorityQueue 的區別是什麼?
PriorityQueue 保證最高或者最低優先順序的的元素總是在佇列頭部,但是LinkedHashMap 維持的順序是元素插入的順序。當遍歷一個 PriorityQueue時,沒有任何順序保證,但是 LinkedHashMap 課保證遍歷順序是元素插入的順序。
最後
歡迎大家關注我的公種浩【程式設計師追風】,整理了1000道2019年多家公司java面試題400多頁pdf文件,文章都會在裡面更新,整理的資料也會放在裡面。
喜歡文章記得關注我點個贊喲,感謝支援!