面試過阿里的P7大佬分享:180+道Java面試題目!含答案解析!

大廠常見問題

  • 寫視頻點播網站文件下載接口
  • 基礎變量/數組寫出模擬maven導入包過程
  • 寫出新變臉內存分配,模擬垃圾回收過程
  • 50個白球50個紅球,兩個盒子,怎麼放讓人隨機在一個盒子裏抽到紅球概率最高
  • n個數裏取兩個和爲s的數
  • java數據結構
  • HashMap原理
  • 自定義類型可以作爲Key麼?
  • java內存模型
  • 知道的排序算法
  • 快排的優化
  • Java多線程實現方式
  • Java線程與進程區別
  • JVM內存模型+垃圾回收算法
  • hashmap和treemap的區別
  • 操作系統同步方式、通信方式
  • 計算機網絡三次握手四次分手以及wait_time三種差別
  • http post和get差別
  • 美賽的建模
  • k-means 算法
  • 數據庫的三範式
  • 路由器和交換機有什麼區別
  • 抽象類和接口有什麼區別
  • HashMap 和 HashTable 有什麼區別
  • 多線程下有什麼同步措施
  • JVM GC、CMS 和 多線程
  • Java 64 位的指針壓縮
  • Java 中的鎖是怎麼實現的、有什麼鎖
  • Spark 和 Hadoop 區別
  • Spark 分佈式數據的容錯機制
  • Spark 的 shuffle read 和 shuffle write 的實現
  • docker(namespace cgroups)
  • docker文件系統
  • http協議
  • java線程池達到提交上限的具體情況
  • Java無鎖原理
  • rehash過程
  • java如何定位內存泄漏
  • 對中間件的認識
  • 數組中Arrays.sort的排序方法是什麼?
  • 快速排序和堆排序的優缺點
  • GC中可達性分析法,和引用計數法有什麼不同?引用計數法有什麼問題?
  • JVM類加載機制
  • 鏈表中如何判斷有環路
  • 數據結構中的鏈表
  • 算法二分查找
  • 時間複雜度分析
  • 操作系統cpu調度算法

通用問題

參考:

https://blog.csdn.net/u012456528/article/details/79759487

Java 面試隨着時間的改變而改變。在過去的日子裏,當你知道 String 和 StringBuilder 的區別(String 類型和 StringBuffer 類型的主要性能區別其實在於 String 是不可變的對象。因此在每次對 String 類型進行改變的時候其實都等同於生成了一個新的 String 對象,然後將指針指向新的 String 對象,所以經常改變內容的字符串最好不要用 String ,因爲每次生成對象都會對系統性能產生影響,特別當內存中無引用對象多了以後,JVM 的 GC 就會開始工作,影響性能,可以考慮使用可變字符序列StringBuilder)就能讓你直接進入第二輪面試,但是現在問題變得越來越高級,面試官問的問題也更深入。 在我初入職場的時候,類似於 Vector 與 Array 的區別、HashMap 與 Hashtable 的區別是最流行的問題,只需要記住它們,就能在面試中獲得更好的機會,但這種情形已經不復存在。如今,你將會被問到許多 Java 程序員都沒有看過的領域,如 NIO,設計模式,成熟的單元測試,或者那些很難掌握的知識,如併發、算法、數據結構及編碼。

由於我喜歡研究面試題,因此我已經收集了許多的面試問題,包括許多許多不同的主題。我已經爲這衆多的問題準備一段時間了,現在我將它們分享給你們。這裏面不但包含經典的面試問題,如線程、集合、equals 和 hashcode、socket,而且還包含了 NIO、數組、字符串、Java 8 等主題。

該列表包含了入門級 Java 程序員和多年經驗的高級開發者的問題。無論你是 1、2、3、4、5、6、7、8、9 還是 10 年經驗的開發者,你都能在其中找到一些有趣的問題。這裏包含了一些超級容易回答的問題,同時包含經驗豐富的 Java 程序員也會棘手的問題。

當然你們也是非常幸運的,當今有許多好的書來幫助你準備 Java 面試,其中有一本我覺得特別有用和有趣的是 Markham 的 Java 程序面試揭祕(Java Programming Interview Exposed)。 這本書會告訴你一些 Java 和 JEE 面試中最重要的主題,即使你不是準備 Java 面試,也值得一讀。

該問題列表特別長,我們有各個地方的問題,所以,答案必須要短小、簡潔、乾脆,不拖泥帶水。因此,除了這一個段落,你只會聽到問題與答案,再無其他內容,沒有反饋,也沒有評價。爲此,我已經寫好了一些博文,在這些文章中你可以找到我對某些問題的觀點,如我爲什麼喜歡這個問題,這個問題的挑戰是什麼?期望從面試者那獲取到什麼樣的答案?

這個列表有一點不同,我鼓勵你採用類似的方式去分享問題和答案,這樣容易溫習。我希望這個列表對面試官和候選人都有很好的用處,面試官可以對這些問題上做一些改變以獲取新奇和令人驚奇的元素,這對一次好的面試來說非常重要。而候選者,可以擴展和測試 Java 程序語言和平臺關鍵領域的知識。2015 年,會更多的關注併發概念,JVM 內部,32 位 JVM 和 64 JVM的區別,單元測試及整潔的代碼。我確信,如果你讀過這個龐大的 Java 面試問題列表,無論是電話面試還是面對面的面試,你都能有很好的表現。

Java 面試中的重要話題

除了你看到的驚人的問題數量,我也儘量保證質量。我不止一次分享各個重要主題中的問題,也確保包含所謂的高級話題,這些話題很多程序員不喜歡準備或者直接放棄,因爲他們的工作不會涉及到這些。Java NIO 和 JVM 底層就是最好的例子。你也可以將設計模式劃分到這一類中,但是越來越多有經驗的程序員瞭解 GOF 設計模式並應用這些模式。我也儘量在這個列表中包含 2015 年最新的面試問題,這些問題可能是來年關注的核心。爲了給你一個大致的瞭解,下面列出這份 Java 面試問題列表包含的主題:

  • 多線程,併發及線程基礎
  • 數據類型轉換的基本原則
  • 垃圾回收(GC)
  • Java 集合框架
  • 數組
  • 字符串**
  • GOF 設計模式
  • SOLID (單一功能、開閉原則、里氏替換、接口隔離以及依賴反轉)設計原則
  • 抽象類與接口
  • Java 基礎,如 equals 和 hashcode
  • 泛型與枚舉
  • Java IO 與 NIO
  • 常用網絡協議
  • Java 中的數據結構和算法
  • 正則表達式
  • JVM 底層
  • Java 最佳實踐
  • JDBC
  • Date, Time 與 Calendar
  • Java 處理 XML
  • JUnit
  • 編程

120 大 Java 面試題及答案

現在是時候給你展示我近 5 年從各種面試中收集來的 120 個問題了。我確定你在自己的面試中見過很多這些問題,很多問題你也能正確回答。

多線程、併發及線程的基礎問題

1)Java 中能創建 volatile 數組嗎?

能,Java 中可以創建 volatile 類型數組,不過只是一個指向數組的引用,而不是整個數組。我的意思是,如果改變引用指向的數組,將會受到 volatile 的保護,但是如果多個線程同時改變數組的元素,volatile 標示符就不能起到之前的保護作用了。

2)volatile 能使得一個非原子操作變成原子操作嗎?

一個典型的例子是在類中有一個 long 類型的成員變量。如果你知道該成員變量會被多個線程訪問,如計數器、價格等,你最好是將其設置爲 volatile。爲什麼?因爲 Java 中讀取 long 類型變量不是原子的,需要分成兩步,如果一個線程正在修改該 long 變量的值,另一個線程可能只能看到該值的一半(前 32 位)。但是對一個 volatile 型的 long 或 double 變量的讀寫是原子。

3)volatile 修飾符的有過什麼實踐?

一種實踐是用 volatile 修飾 long 和 double 變量,使其能按原子類型來讀寫。double 和 long 都是64位寬,因此對這兩種類型的讀是分爲兩部分的,第一次讀取第一個 32 位,然後再讀剩下的 32 位,這個過程不是原子的,但 Java 中 volatile 型的 long 或 double 變量的讀寫是原子的。volatile 修復符的另一個作用是提供內存屏障(memory barrier),例如在分佈式框架中的應用。簡單的說,就是當你寫一個 volatile 變量之前,Java 內存模型會插入一個寫屏障(write barrier),讀一個 volatile 變量之前,會插入一個讀屏障(read barrier)。意思就是說,在你寫一個 volatile 域時,能保證任何線程都能看到你寫的值,同時,在寫之前,也能保證任何數值的更新對所有線程是可見的,因爲內存屏障會將其他所有寫的值更新到緩存。

4)volatile 類型變量提供什麼保證?

volatile 變量提供順序和可見性保證,例如,JVM 或者 JIT爲了獲得更好的性能會對語句重排序,但是 volatile 類型變量即使在沒有同步塊的情況下賦值也不會與其他語句重排序。 volatile 提供 happens-before 的保證,確保一個線程的修改能對其他線程是可見的。某些情況下,volatile 還能提供原子性,如讀 64 位數據類型,像 long 和 double 都不是原子的,但 volatile 類型的 double 和 long 就是原子的。

5) 10 個線程和 2 個線程的同步代碼,哪個更容易寫?

從寫代碼的角度來說,兩者的複雜度是相同的,因爲同步代碼與線程數量是相互獨立的。但是同步策略的選擇依賴於線程的數量,因爲越多的線程意味着更大的競爭,所以你需要利用同步技術,如鎖分離,這要求更復雜的代碼和專業知識。

6)你是如何調用 wait()方法的?使用 if 塊還是循環?爲什麼?

wait() 方法應該在循環調用,因爲當線程獲取到 CPU 開始執行的時候,其他條件可能還沒有滿足,所以在處理前,循環檢測條件是否滿足會更好。

下面是一段標準的使用 wait 和 notify 方法的代碼:

// The standard idiom for using the wait method

synchronized (obj) { while (condition does not hold) obj.wait();

// (Releases lock, and reacquires on wakeup) ... // Perform action appropriate to condition }

參見 Effective Java 第 69 條,獲取更多關於爲什麼應該在循環中來調用 wait 方法的內容。

7)什麼是多線程環境下的僞共享(false sharing)?

僞共享是多線程系統(每個處理器有自己的局部緩存)中一個衆所周知的性能問題。僞共享發生在不同處理器的上的線程對變量的修改依賴於相同的緩存行,僞共享問題很難被發現,因爲線程可能訪問完全不同的全局變量,內存中卻碰巧在很相近的位置上。如其他諸多的併發問題,避免僞共享的最基本方式是仔細審查代碼,根據緩存行來調整你的數據結構。

有經驗程序員的 Java 面試題

8)什麼是 Busy spin?我們爲什麼要使用它?

Busy spin 是一種在不釋放 CPU 的基礎上等待事件的技術。它經常用於避免丟失 CPU 緩存中的數據(如果線程先暫停,之後在其他CPU上運行就會丟失)。所以,如果你的工作要求低延遲,並且你的線程目前沒有任何順序,這樣你就可以通過循環檢測隊列中的新消息來代替調用 sleep() 或 wait() 方法。它唯一的好處就是你只需等待很短的時間,如幾微秒或幾納秒。LMAX 分佈式框架是一個高性能線程間通信的庫,該庫有一個 BusySpinWaitStrategy 類就是基於這個概念實現的,使用 busy spin 循環 EventProcessors 等待屏障。

9)Java 中怎麼獲取一份線程 dump 文件?

在 Linux 下,你可以通過命令 kill -3 PID (Java 進程的進程 ID)來獲取 Java 應用的 dump 文件。在 Windows 下,你可以按下 Ctrl + Break 來獲取。這樣 JVM 就會將線程的 dump 文件打印到標準輸出或錯誤文件中,它可能打印在控制檯或者日誌文件中,具體位置依賴應用的配置。如果你使用Tomcat。

10)Swing 是線程安全的?

不是,Swing 不是線程安全的。你不能通過任何線程來更新 Swing 組件,如 JTable、JList 或 JPanel,事實上,它們只能通過 GUI 或 AWT 線程來更新。這就是爲什麼 Swing 提供 invokeAndWait() 和 invokeLater() 方法來獲取其他線程的 GUI 更新請求。這些方法將更新請求放入 AWT 的線程隊列中,可以一直等待,也可以通過異步更新直接返回結果。你也可以在參考答案中查看和學習到更詳細的內容。

11)什麼是線程局部變量?

當使用ThreadLocal維護變量時,ThreadLocal爲每個使用該變量的線程提供獨立的變量副本,每個線程都可以獨立地改變自己的副本,而不會影響其它線程所對應的副本,是線程隔離的。線程隔離的祕密在於ThreadLocalMap類(ThreadLocal的靜態內部類)

線程局部變量是侷限於線程內部的變量,屬於線程自身所有,不在多個線程間共享。Java 提供 ThreadLocal 類來支持線程局部變量,是一種實現線程安全的方式。但是在管理環境下(如 web 服務器)使用線程局部變量的時候要特別小心,在這種情況下,工作線程的生命週期比任何應用變量的生命週期都要長。任何線程局部變量一旦在工作完成後沒有釋放,Java 應用就存在內存泄露的風險。

ThreadLocal的方法:void set(T value)、T get()以及T initialValue()。

ThreadLocal是如何爲每個線程創建變量的副本的:

首先,在每個線程Thread內部有一個ThreadLocal.ThreadLocalMap類型的成員變量threadLocals,這個threadLocals就是用來存儲實際的變量副本的,鍵值爲當前ThreadLocal變量,value爲變量副本(即T類型的變量)。初始時,在Thread裏面,threadLocals爲空,當通過ThreadLocal變量調用get()方法或者set()方法,就會對Thread類中的threadLocals進行初始化,並且以當前ThreadLocal變量爲鍵值,以ThreadLocal要保存的副本變量爲value,存到threadLocals。然後在當前線程裏面,如果要使用副本變量,就可以通過get方法在threadLocals裏面查找。

總結:

a、實際的通過ThreadLocal創建的副本是存儲在每個線程自己的threadLocals中的

b、爲何threadLocals的類型ThreadLocalMap的鍵值爲ThreadLocal對象,因爲每個線程中可有多個threadLocal變量,就像上面代碼中的longLocal和stringLocal;

c、在進行get之前,必須先set,否則會報空指針異常;如果想在get之前不需要調用set就能正常訪問的話,必須重寫initialValue()方法

12)用 wait-notify 寫一段代碼來解決生產者-消費者問題?

13) 用 Java 寫一個線程安全的單例模式(Singleton)?

14)Java 中 sleep 方法和 wait 方法的區別?

15)什麼是不可變對象(immutable object)?Java 中怎麼創建一個不可變對象?

16)我們能創建一個包含可變對象的不可變對象嗎?

17)Java 中應該使用什麼數據類型來代表價格?

18)怎麼將 byte 轉換爲 String?

19)Java 中怎樣將 bytes 轉換爲 long 類型?

20)我們能將 int 強制轉換爲 byte 類型的變量嗎?如果該值大於 byte 類型的範圍,將會出現什麼現象?

21)存在兩個類,B 繼承 A,C 繼承 B,我們能將 B 轉換爲 C 麼?如 C = (C) B;

22)哪個類包含 clone 方法?是 Cloneable 還是 Object?

23)Java 中 ++ 操作符是線程安全的嗎?

24)a = a + b 與 a += b 的區別

25)我能在不進行強制轉換的情況下將一個 double 值賦值給 long 類型的變量嗎

26)3*0.1 == 0.3 將會返回什麼?true 還是 false?

28)爲什麼 Java 中的 String 是不可變的(Immutable)

29)我們能在 Switch 中使用 String 嗎?

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

JVM 底層 與 GC(Garbage Collection) 的面試問題

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 之間有什麼不同?

3 年工作經驗的 Java 面試題

40)解釋 Java 堆空間及 GC?

JVM 底層面試題及答案

41)你能保證 GC 執行嗎?

42)怎麼獲取 Java 程序使用的內存?堆使用的百分比?

43)Java 中堆和棧有什麼區別?

Java 基本概念面試題

44)“a==b”和”a.equals(b)”有什麼區別?

45)a.hashCode() 有什麼用?與 a.equals(b) 有什麼關係?

46)final、finalize 和 finally 的不同之處?

47)Java 中的編譯期常量是什麼?使用它又什麼風險?

Java 集合框架的面試題

48) List、Set、Map 和 Queue 之間的區別

49)poll() 方法和 remove() 方法的區別?

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

51)ArrayList 與 LinkedList 的不區別?

52)用哪兩種方式來實現集合的排序?

53)Java 中怎麼打印數組?

54)Java 中的 LinkedList 是單向鏈表還是雙向鏈表?

55)Java 中的 TreeMap 是採用什麼樹實現的?

56) Hashtable 與 HashMap 有什麼不同之處?

57)Java 中的 HashSet,內部是如何工作的?(answer答案)

58)寫一段代碼在遍歷 ArrayList 時移除一個元素?(答案)

59)我們能自己寫一個容器類,然後使用 for-each 循環嗎?

60)ArrayList 和 HashMap 的默認大小是多數?(答案)

61)有沒有可能兩個不相等的對象有有相同的 hashcode?

62)兩個相同的對象會有不同的的 hash code 嗎?

63)我們可以在 hashcode() 中使用隨機數字嗎?(答案)

64)Java 中,Comparator 與 Comparable 有什麼不同?(答案)

65)爲什麼在重寫 equals 方法的時候需要重寫 hashCode 方法?(答案)

Java IO 和 NIO 的面試題

66)在我 Java 程序中,我有三個 socket,我需要多少個線程來處理?

67)Java 中怎麼創建 ByteBuffer?

68)Java 中,怎麼讀寫 ByteBuffer ?

69)Java 採用的是大端還是小端?

70)ByteBuffer 中的字節序是什麼?

71)Java 中,直接緩衝區與非直接緩衝器有什麼區別

72)Java 中的內存映射緩存區是什麼

73)socket 選項 TCP NO DELAY 是指什麼?

74)TCP 協議與 UDP 協議有什麼區別?

75)Java 中,ByteBuffer 與 StringBuffer有什麼區別?

Java 最佳實踐的面試問題

76)Java 中,編寫多線程程序的時候你會遵循哪些最佳實踐?(答案)

78)說出至少 5 點在 Java 中使用線程的最佳實踐。(答案)

79)說出 5 條 IO 的最佳實踐(答案)

80)列出 5 個應該遵循的 JDBC 最佳實踐(答案)

81)說出幾條 Java 中方法重載的最佳實踐?(答案)

Date、Time 及 Calendar 的面試題

82)在多線程環境下,SimpleDateFormat 是線程安全的嗎?(答案)

83)Java 中如何格式化一個日期?如格式化爲 ddMMyyyy 的形式?(答案)

84)Java 中,怎麼在格式化的日期中顯示時區?

85)Java 中 java.util.Date 與 java.sql.Date 有什麼區別?

86)Java 中,如何計算兩個日期之間的差距?

87)Java 中,如何將字符串 YYYYMMDD 轉換爲日期?

單元測試 JUnit 面試題

89)如何測試靜態方法?

90)怎麼利用 JUnit 來測試一個方法的異常?

91)你使用過哪個單元測試庫來測試你的 Java 程序?

92)@Before 和 @BeforeClass 有什麼區別?

編程和代碼相關的面試題

93)怎麼檢查一個字符串只包含數字

94)Java 中如何利用泛型寫一個 LRU 緩存?

95)寫一段 Java 程序將 byte 轉換爲 long?

96)在不使用 StringBuffer 的前提下,怎麼反轉一個字符串?

97)Java 中,怎麼獲取一個文件中單詞出現的最高頻率?

98)如何檢查出兩個給定的字符串是反序的?

99)Java 中,怎麼打印出一個字符串的所有排列?

100)Java 中,怎樣才能打印出數組中的重複元素?

101)Java 中如何將字符串轉換爲整數?

102)在沒有使用臨時變量的情況如何交換兩個整數變量的值?

關於 OOP 和設計模式的面試題

103)接口是什麼?爲什麼要使用接口而不是直接使用具體類?

104)Java 中,抽象類與接口之間有什麼不同?(答案)

105)除了單例模式,你在生產環境中還用過什麼設計模式?

106)你能解釋一下里氏替換原則嗎?

107) 什麼情況下會違反迪米特法則?爲什麼會有這個問題?(答案)

108)適配器模式是什麼?什麼時候使用?

109)什麼是“依賴注入”和“控制反轉”?爲什麼有人使用?

110)抽象類是什麼?它與接口有什麼區別?你爲什麼要使用過抽象類?(答案)

111)構造器注入和 setter 依賴注入,那種方式更好?(答案)

112)依賴注入和工廠模式之間有什麼不同?(答案)

113)適配器模式和裝飾器模式有什麼區別?(答案)

114)適配器模式和代理模式之前有什麼不同?(答案)

115)什麼是模板方法模式?(答案)

116)什麼時候使用訪問者模式?(答案)

117)什麼時候使用組合模式?(答案)

118)繼承和組合之間有什麼不同?(答案)

119)描述 Java 中的重載和重寫?(答案)

120)Java 中,嵌套公共靜態類與頂級類有什麼不同?(答案)

121) OOP 中的 組合、聚合和關聯有什麼區別?(答案)

122)給我一個符合開閉原則的設計模式的例子?(答案)

123)抽象工廠模式和原型模式之間的區別?

124)什麼時候使用享元模式?

Java 面試中其他各式各樣的問題

125)嵌套靜態類與頂級類有什麼區別?(答案)

126)你能寫出一個正則表達式來判斷一個字符串是否是一個數字嗎?(解決方案)

127)Java 中,受檢查異常 和 不受檢查異常的區別?(答案)

128)Java 中,throw 和 throws 有什麼區別?(答案)

129)Java 中,Serializable 與 Externalizable 的區別?(答案)

130)Java 中,DOM 和 SAX 解析器有什麼不同?(答案)

131)說出 JDK 1.7 中的三個新特性?(答案)

132)說出 5 個 JDK 1.8 引入的新特性?(答案)

133)Java 中,Maven 和 ANT 有什麼區別?(答案)

由於答案解析部分太長了,給大家總結到文檔裏面了,還有樓主收藏的一些很不錯的面試資料,如果你知道這些問題的答案,歡迎在評論出答出來,祝大家面試成功~添加小助手V:maxiaoananan即可獲取

面試過阿里的P7大佬分享:180+道Java面試題目!含答案解析!

 

面試過阿里的P7大佬分享:180+道Java面試題目!含答案解析!

 

面試過阿里的P7大佬分享:180+道Java面試題目!含答案解析!

 

面試過阿里的P7大佬分享:180+道Java面試題目!含答案解析!

 

面試過阿里的P7大佬分享:180+道Java面試題目!含答案解析!

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章