前兩天收集了許多的面試問題,上篇提到了Java面試中的重要話題歸納 點這裡!,正在持續更新中,點選下「關注」不迷路哦~
如果 a 和 b 都是物件,則 a==b 是比較兩個物件的參照,只有當 a 和 b 指向的是堆中的同一個物件才會返回 true,而 a.equals(b) 是進行邏輯比較,所以通常需要重寫該方法來提供邏輯一致性的比較。例如,String 類重寫 equals() 方法,所以可以用於兩個不同物件,但是包含的字母相同的比較。
hashCode() 方法是相應物件整型的 hash 值。它常用於基於 hash 的集合類,如 Hashtable、HashMap、LinkedHashMap等等。它與 equals() 方法關係特別緊密。根據 Java 規範,兩個使用 equal() 方法來判斷相等的物件,必須具有相同的 hash code。
final 是一個修飾符,可以修飾變數、方法和類。如果 final 修飾變數,意味著該變數的值在初始化後不能被改變。Java 技術允許使用 finalize() 方法在垃圾收集器將物件從記憶體中清除出去之前做必要的清理工作。這個方法是由垃圾收集器在確定這個物件沒有被參照時對這個物件呼叫的,但是什麼時候呼叫 finalize 沒有保證。finally 是一個關鍵字,與 try 和 catch 一起用於異常的處理。finally 塊一定會被執行,無論在 try 塊中是否有發生異常。
公共靜態不可變(public static final )變數也就是我們所說的編譯期常數,這裡的 public 可選的。實際上這些變數在編譯時會被替換掉,因為編譯器知道這些變數的值,並且知道這些變數在執行時不能改變。這種方式存在的一個問題是你使用了一個內部的或第三方庫中的公有編譯時常數,但是這個值後面被其他人改變了,但是你的使用者端仍然在使用老的值,甚至你已經部署了一個新的jar。為了避免這種情況,當你在更新依賴 JAR 檔案時,確保重新編譯你的程式。
這部分也包含資料結構、演演算法及陣列的面試問題
List 是一個有序集合,允許元素重複。它的某些實現可以提供基於下標值的常數存取時間,但是這不是 List 介面保證的。Set 是一個無序集合。
poll() 和 remove() 都是從佇列中取出一個元素,但是 poll() 在獲取元素失敗的時候會返回空,但是 remove() 失敗的時候會丟擲異常。
PriorityQueue 保證最高或者最低優先順序的的元素總是在佇列頭部,但是 LinkedHashMap 維持的順序是元素插入的順序。當遍歷一個 PriorityQueue 時,沒有任何順序保證,但是 LinkedHashMap 課保證遍歷順序是元素插入的順序。
最明顯的區別是 ArrrayList 底層的資料結構是陣列,支援隨機存取,而 LinkedList 的底層資料結構書連結串列,不支援隨機存取。使用下標存取一個元素,ArrayList 的時間複雜度是 O(1),而 LinkedList 是 O(n)。更多細節的討論參見答案。
你可以使用有序集合,如 TreeSet 或 TreeMap,你也可以使用有順序的的集合,如 list,然後通過 Collections.sort() 來排序。
你可以使用 Arrays.toString() 和 Arrays.deepToString() 方法來列印陣列。由於陣列沒有實現 toString() 方法,所以如果將陣列傳遞給 System.out.println() 方法,將無法列印出陣列的內容,但是 Arrays.toString() 可以列印每個元素。
需要更多大廠面試資料的話也可以點選直接進入,免費獲取!暗號:CSDN
是雙向連結串列,你可以檢查 JDK 的原始碼。在 Eclipse,你可以使用快捷鍵 Ctrl + T,直接在編輯器中開啟該類。
Java 中的 TreeMap 是使用紅黑樹實現的。
這兩個類有許多不同的地方,下面列出了一部分:a) Hashtable 是 JDK 1 遺留下來的類,而 HashMap 是後來增加的。b)Hashtable 是同步的,比較慢,但 HashMap 沒有同步策略,所以會更快。c)Hashtable 不允許有個空的 key,但是 HashMap 允許出現一個 null key。更多的不同之處參見答案。
在 Java 7 中,ArrayList 的預設大小是 10 個元素,HashMap 的預設大小是16個元素(必須是2的冪)。這就是 Java 7 中 ArrayList 和 HashMap 類的程式碼片段:
// from ArrayList.java JDK 1.7
private static final int DEFAULT_CAPACITY = 10;
//from HashMap.java JDK 7
static final int DEFAULT_INITIAL_CAPACITY = 1 << 4; // aka 16
有可能,兩個不相等的物件可能會有相同的 hashcode 值,這就是為什麼在 hashmap 中會有衝突。相等 hashcode 值的規定只是說如果兩個物件相等,必須有相同的hashcode 值,但是沒有關於不相等物件的任何規定。
不能,根據 hash code 的規定,這是不可能的。
IO 是 Java 面試中一個非常重要的點。你應該很好掌握 Java IO,NIO,NIO2 以及與作業系統,磁碟 IO 相關的基礎知識。下面是 Java IO 中經常問的問題。
包含 Java 中各個部分的最佳實踐,如集合,字串,IO,多執行緒,錯誤和例外處理,設計模式等等。
這是我在寫Java 並行程式的時候遵循的一些最佳實踐:
a)給執行緒命名,這樣可以幫助偵錯。
b)最小化同步的範圍,而不是將整個方法同步,只對關鍵部分做同步。
c)如果可以,更偏向於使用 volatile 而不是 synchronized。
d)使用更高層次的並行工具,而不是使用 wait() 和 notify() 來實現執行緒間通訊,如 BlockingQueue,CountDownLatch 及 Semeaphore。
e)優先使用並行集合,而不是對集合進行同步。並行集合提供更好的可延伸性。
這是我在使用 Java 中 Collectionc 類的一些最佳實踐:a)使用正確的集合類,例如,如果不需要同步列表,使用 ArrayList 而不是 Vector。b)優先使用並行集合,而不是對集合進行同步。並行集合提供更好的可延伸性。c)使用介面代表和存取集合,如使用List儲存 ArrayList,使用 Map 儲存 HashMap 等等。d)使用迭代器來回圈集合。e)使用集合的時候使用泛型。
這個問題與之前的問題類似,你可以使用上面的答案。對執行緒來說,你應該:
a)對執行緒命名
b)將執行緒和任務分離,使用執行緒池執行器來執行 Runnable 或 Callable。
c)使用執行緒池
下面有幾條可以遵循的方法過載的最佳實踐來避免造成自動裝箱的混亂。
a)不要過載這樣的方法:一個方法接收 int 引數,而另個方法接收 Integer 引數。
b)不要過載引數數量一致,而只是引數順序不同的方法。
c)如果過載的方法引數個數多於 5 個,採用可變引數。
感謝你看到了這裡!
我這邊整理很多2020最新Java面試題(含答案)和Java學習筆記,如下圖
上述的面試題答案小編都整理成檔案筆記。 同時也還整理了一些面試資料&最新2020收集的一些大廠的面試真題(都整理成檔案,小部分截圖)免費分享給大家,有需要的可以 點選進入暗號:CSDN!免費分享~
如果喜歡本篇文章,歡迎轉發、點贊。
記得關注我!