2019年Java面試題基礎系列228道(5)

2一、存在兩個類,B 繼承 A,C 繼承 B,咱們能將 B 轉換爲C 麼?如 C = (C) B;java

這屬於強制類型轉換,若是被轉換的B實例不是C類型,會有異常c++

好比你的ABC分別對應動物,貓,黑貓。安全

向上轉型就是好比app

C c = new C();工具

B b = c;性能

你把c轉型爲B,黑貓是貓嗎?是啊,因此這是ok的。開發工具

可是反過來spa

B b = new B();操作系統

C c = (C)b;線程

這就不ok了,只知道這個b是一隻貓,他不必定是黑貓。

但若是這個b已經肯定是一隻黑貓了,那就能夠轉型了

B b = new C();

C c = (C)b;

這裏的b原本就是黑貓啊。

2二、哪一個類包含 clone 方法?是 Cloneable 仍是 Object?

  java.lang.Cloneable 是一個標示性接口,不包含任何方法,clone 方法在object 類中定義。而且須要知道 clone() 方法是一個本地方法,這意味着它是由c 或 c++ 或 其餘本地語言實現的。

2三、Java 中 ++ 操做符是線程安全的嗎?

  不是線程安全的操做。它涉及到多個指令,如讀取變量值,增長,而後存儲回內存,這個過程可能會出現多個線程交差。

2四、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就會編譯出錯)

2五、我能在不進行強制轉換的狀況下將一個 double 值賦值給long 類型的變量嗎?

  不行,你不能在沒有強制類型轉換的前提下將一個 double 值賦值給 long 類型的變量,由於 double 類型的範圍比 long 類型更廣,因此必需要進行強制轉換。

2六、3*0.1 == 0.3 將會返回什麼?true 仍是 false?

  false,由於有些浮點數不能徹底精確的表示出來。

2七、int 和 Integer 哪一個會佔用更多的內存?

  Integer 對象會佔用更多的內存。Integer 是一個對象,須要存儲對象的元數據。可是 int 是一個原始類型的數據,因此佔用的空間更少。

2八、爲何 Java 中的 String 是不可變的(Immutable)?

  Java 中的 String 不可變是由於 Java 的設計者認爲字符串使用很是頻繁,將字符串設置爲不可變能夠容許多個客戶端之間共享相同的字符串。

2九、咱們能在 Switch 中使用 String 嗎?

  從 Java 7 開始,咱們能夠在 switch case 中使用字符串,但這僅僅是一個語法糖。內部實如今 switch 中使用字符串的 hash code。

30、Java 中的構造器鏈是什麼?

  當你從一個構造器中調用另外一個構造器,就是 Java 中的構造器鏈。這種狀況只在重載了類的構造器的時候纔會出現。

3一、64 位 JVM 中,int 的長度是多數?

  Java 中,int 類型變量的長度是一個固定值,與平臺無關,都是 32 位。意思就是說,在32位和64位的java虛擬機中,int 類型的長度是相同的。

3二、Serial 與 Parallel GC 之間的不一樣之處?

  Serial 與 Parallel 在 GC 執行的時候都會引發 stop-the-world。它們之間主要不一樣 serial 收集器是默認的複製收集器,執行 GC 的時候只有一個線程,而parallel 收集器使用多個 GC 線程來執行。

3三、32 位和 64 位的 JVM,int 類型變量的長度是多數?

  32 位和 64 位的 JVM 中,int 類型變量的長度是相同的,都是 32 位或者 4個字節。

3四、Java 中 WeakReference 與 SoftReference 的區別?

  

3五、WeakHashMap 是怎麼工做的?

  WeakHashMap 的工做與正常的 HashMap 相似,可是使用弱引用做爲 key,意思就是當 key 對象沒有任何引用時,key/value 將會被回收。

3六、JVM 選項 -XX:+UseCompressedOops 有什麼做用?爲何要使用?

  到 64 位的 JVM主要動機在於能夠指定最大堆大小,經過壓縮 OOP 能夠節省必定的內存。經過-XX:+UseCompressedOops 選項,JVM 會使用 32 位的 OOP,而不是 64 位的 OOP。

3七、怎樣經過 Java 程序來判斷 JVM 是 32 位 仍是 64位?

  你能夠檢查某些系統屬性如 sun.arch.data.model 或 os.arch 來獲取該信息。

3八、32 位 JVM 和 64 位 JVM 的最大堆內存分別是多數?

理論上說上 32 位的 JVM 堆內存能夠到達 2^32,即 4GB,但實際上會比這個小不少。不一樣操做系統之間不一樣,如 Windows 系統大約 1.5 GB,Solaris 大約3GB。64 位 JVM 容許指定最大的堆內存,理論上能夠達到 2^64,這是一個很是大的數字,實際上你能夠指定堆內存大小到 100GB。甚至有的 JVM,如 Azul,堆內存到 1000G 都是可能的。

3九、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 內部的一個進程,回收無效對象的內存用於未來的分配。

4一、你能保證 GC 執行嗎?

   不能,雖然你能夠調用 System.gc() 或者 Runtime.gc(),可是沒有辦法保證 GC的執行。

4二、怎麼獲取 Java 程序使用的內存?堆使用的百分比?

能夠經過 java.lang.Runtime 類中與內存相關方法來獲取剩餘的內存,總內存及最大堆內存。經過這些方法你也能夠獲取到堆使用的百分比及堆內存的剩餘空間。Runtime.freeMemory() 方法返回剩餘空間的字節數,Runtime.totalMemory()方法總內存的字節數,Runtime.maxMemory() 返回最大內存的字節數。

4三、Java 中堆和棧有什麼區別?

JVM 中堆和棧屬於不一樣的內存區域,使用目的也不一樣。棧經常使用於保存方法幀和局部變量,而對象老是在堆上分配。棧一般都比堆小,也不會在多個線程之間共享,而堆被整個 JVM 的全部線程共享。

4四、「a==b」和」a.equals(b)」有什麼區別?

若是 a 和 b 都是對象,則 a==b 是比較兩個對象的引用,只有當 a 和 b 指向的是堆中的同一個對象纔會返回 true,而 a.equals(b) 是進行邏輯比較,因此一般須要重寫該方法來提供邏輯一致性的比較。例如,String 類重寫 equals() 方法,因此能夠用於兩個不一樣對象,可是包含的字母相同的比較。

4五、a.hashCode() 有什麼用?與 a.equals(b) 有什麼關係?

hashCode() 方法是相應對象整型的 hash 值。它經常使用於基於 hash 的集合類,如 Hashtable、HashMap、LinkedHashMap 等等。它與 equals() 方法關係特別緊密。根據 Java 規範,兩個使用 equal() 方法來判斷相等的對象,必須具備相同的 hash code。

4六、final、finalize 和 finally 的不一樣之處?

final 是一個修飾符,能夠修飾變量、方法和類。若是 final 修飾變量,意味着該變量的值在初始化後不能被改變。finalize 方法是在對象被回收以前調用的方法,給對象本身最後一個復活的機會,可是何時調用 finalize 沒有保證。finally是一個關鍵字,與 try 和 catch 一塊兒用於異常的處理。finally 塊必定會被執行,不管在 try 塊中是否有發生異常。

4七、Java 中的編譯期常量是什麼?使用它又什麼風險?

公共靜態不可變(public static final )變量也就是咱們所說的編譯期常量,這裏的 public 可選的。實際上這些變量在編譯時會被替換掉,由於編譯器知道這些變量的值,而且知道這些變量在運行時不能改變。這種方式存在的一個問題是你使用了一個內部的或第三方庫中的公有編譯時常量,可是這個值後面被其餘人改變了,可是你的客戶端仍然在使用老的值,甚至你已經部署了一個新的 jar。爲了不這種狀況,當你在更新依賴 JAR 文件時,確保從新編譯你的程序。

4八、List、Set、Map 和 Queue 之間的區別(答案)

List 是一個有序集合,容許元素重複。它的某些實現能夠提供基於下標值的常量訪問時間,可是這不是 List 接口保證的。Set 是一個無序集合。

4九、poll() 方法和 remove() 方法的區別?

poll() 和 remove() 都是從隊列中取出一個元素,可是 poll() 在獲取元素失敗的時候會返回空,可是 remove() 失敗的時候會拋出異常。

50、Java 中 LinkedHashMap 和 PriorityQueue 的區別是什麼?

PriorityQueue 保證最高或者最低優先級的的元素老是在隊列頭部,可是LinkedHashMap 維持的順序是元素插入的順序。當遍歷一個 PriorityQueue時,沒有任何順序保證,可是 LinkedHashMap 課保證遍歷順序是元素插入的順序。

40、解釋 Java 堆空間及 GC?

當經過 Java 命令啓動 Java 進程的時候,會爲它分配內存。內存的一部分用於建立堆空間,當程序中建立對象的時候,就從對空間中分配內存。GC 是 JVM 內部的一個進程,回收無效對象的內存用於未來的分配。

4一、你能保證 GC 執行嗎?

不能,雖然你能夠調用 System.gc() 或者 Runtime.gc(),可是沒有辦法保證 GC的執行。

4二、怎麼獲取 Java 程序使用的內存?堆使用的百分比?

能夠經過 java.lang.Runtime 類中與內存相關方法來獲取剩餘的內存,總內存及最大堆內存。經過這些方法你也能夠獲取到堆使用的百分比及堆內存的剩餘空間。Runtime.freeMemory() 方法返回剩餘空間的字節數,Runtime.totalMemory()方法總內存的字節數,Runtime.maxMemory() 返回最大內存的字節數。

4三、Java 中堆和棧有什麼區別?

JVM 中堆和棧屬於不一樣的內存區域,使用目的也不一樣。棧經常使用於保存方法幀和局部變量,而對象老是在堆上分配。棧一般都比堆小,也不會在多個線程之間共享,而堆被整個 JVM 的全部線程共享。

4四、「a==b」和」a.equals(b)」有什麼區別?

若是 a 和 b 都是對象,則 a==b 是比較兩個對象的引用,只有當 a 和 b 指向的是堆中的同一個對象纔會返回 true,而 a.equals(b) 是進行邏輯比較,因此一般須要重寫該方法來提供邏輯一致性的比較。例如,String 類重寫 equals() 方法,因此能夠用於兩個不一樣對象,可是包含的字母相同的比較。

4五、a.hashCode() 有什麼用?與 a.equals(b) 有什麼關係?

hashCode() 方法是相應對象整型的 hash 值。它經常使用於基於 hash 的集合類,如 Hashtable、HashMap、LinkedHashMap 等等。它與 equals() 方法關係特別緊密。根據 Java 規範,兩個使用 equal() 方法來判斷相等的對象,必須具備相同的 hash code。

4六、final、finalize 和 finally 的不一樣之處?

final 是一個修飾符,能夠修飾變量、方法和類。若是 final 修飾變量,意味着該變量的值在初始化後不能被改變。finalize 方法是在對象被回收以前調用的方法,給對象本身最後一個復活的機會,可是何時調用 finalize 沒有保證。finally是一個關鍵字,與 try 和 catch 一塊兒用於異常的處理。finally 塊必定會被執行,不管在 try 塊中是否有發生異常。

4七、Java 中的編譯期常量是什麼?使用它又什麼風險?

公共靜態不可變(public static final )變量也就是咱們所說的編譯期常量,這裏的 public 可選的。實際上這些變量在編譯時會被替換掉,由於編譯器知道這些變量的值,而且知道這些變量在運行時不能改變。這種方式存在的一個問題是你使用了一個內部的或第三方庫中的公有編譯時常量,可是這個值後面被其餘人改變了,可是你的客戶端仍然在使用老的值,甚至你已經部署了一個新的 jar。爲了不這種狀況,當你在更新依賴 JAR 文件時,確保從新編譯你的程序。

4八、List、Set、Map 和 Queue 之間的區別(答案)

List 是一個有序集合,容許元素重複。它的某些實現能夠提供基於下標值的常量訪問時間,可是這不是 List 接口保證的。Set 是一個無序集合。

4九、poll() 方法和 remove() 方法的區別?

poll() 和 remove() 都是從隊列中取出一個元素,可是 poll() 在獲取元素失敗的時候會返回空,可是 remove() 失敗的時候會拋出異常。

50、Java 中 LinkedHashMap 和 PriorityQueue 的區別是什麼?

PriorityQueue 保證最高或者最低優先級的的元素老是在隊列頭部,可是LinkedHashMap 維持的順序是元素插入的順序。當遍歷一個 PriorityQueue時,沒有任何順序保證,可是 LinkedHashMap 課保證遍歷順序是元素插入的順序。

相關文章
相關標籤/搜索