Java八股文面試題通常涵蓋了Java語言的基礎知識、高級特性、框架應用、數據庫操作等多個方面。以下是一些常見的Java面試題及其詳細回答,按照不同的主題進行分類:
一、Java基礎
- 面向對象的特征有哪些?
- 抽象:忽略與當前目標無關的細節,只關注與當前目標相關的方面。
- 繼承:允許新類繼承現有類的屬性和方法,實現代碼的重用。
- 封裝:將對象的狀態信息隱藏在對象內部,不允許外部直接訪問,而是通過該對象提供的方法來實現對內部狀態的訪問和操作。
- 多態性:允許不同類的對象對同一消息作出響應,即同一消息可以根據發送對象的不同而采用多種不同的行為方式。
- 重載(Overload)與重寫(Override)的區別?
- 重載:發生在同一個類中,方法名相同但參數列表不同(參數類型、個數、順序至少有一個不同),返回類型可以不同,但不能通過返回類型來區分重載。
- 重寫:發生在有繼承關系的子類與父類之間,方法名、參數列表必須完全相同,返回類型可以相同或更小的范圍(協變返回類型),訪問權限不能比父類中被重寫的方法的訪問權限更低。
- 接口(Interface)與抽象類(Abstract Class)的區別?
- 接口:一種引用類型,是一種抽象的類型,它是一種特殊的類,它是完全抽象的,沒有具體實現的方法,不能被實例化。接口中的方法默認是
public abstract
的,接口中定義的變量默認是public static final
的。 - 抽象類:是一種特殊的類,不能被實例化,只能被繼承。抽象類中可以包含抽象方法(沒有具體實現的方法)和具體方法(有具體實現的方法)。
- 接口:一種引用類型,是一種抽象的類型,它是一種特殊的類,它是完全抽象的,沒有具體實現的方法,不能被實例化。接口中的方法默認是
- 深拷貝(Deep Copy)與淺拷貝(Shallow Copy)的區別?
- 淺拷貝:僅僅復制對象本身(包括對象中的基本數據類型變量和對象的引用變量),但不復制對象引用的其他對象。
- 深拷貝:不僅復制對象本身,還復制對象引用的其他對象,使得新對象和原對象完全獨立。
- sleep()和wait()的區別?
- sleep()是Thread類的方法,導致當前線程暫停執行指定時間,不會釋放鎖。
- wait()是Object類的方法,用于線程間的通信,導致當前線程等待直到另一個線程調用此對象的notify()方法或notifyAll()方法,會釋放鎖。
二、Java高級
- JVM內存結構及其作用?
- 方法區(Method Area):存儲每個類的結構信息,如運行時常量池、字段和方法數據、構造函數和普通方法的字節碼內容等。
- 堆(Heap):所有對象實例以及數組都要在堆上分配,是垃圾收集器管理的主要區域。
- 棧(Stack):每個線程在創建時都會創建一個虛擬機棧,其內部保存一個個棧幀(Stack Frame),對應著一次次方法的調用。
- 程序計數器(Program Counter Register):是一塊較小的內存空間,可以看作是當前線程所執行的字節碼的行號指示器。
- 本地方法棧(Native Method Stacks):與虛擬機棧所發揮的作用非常相似,其區別不過是虛擬機棧為虛擬機執行Java方法(也就是字節碼)服務,而本地方法棧則為虛擬機使用到的Native方法服務。
- Java中的垃圾收集算法有哪些?
- 標記-清除(Mark-Sweep):首先標記出所有需要回收的對象,然后統一回收被標記的對象。
- 復制(Copying):將內存分為大小相等的兩塊,每次只使用其中一塊,當這一塊內存用完時,就將還存活的對象復制到另一塊上面,然后再把已使用的內存空間一次清理掉。
- 標記-整理(Mark-Compact):標記過程仍然與“標記-清除”算法一樣,但后續步驟不是直接對可回收對象進行清理,而是讓所有存活的對象都向一端移動,然后直接清理掉端邊界以外的內存。
- 分代收集(Generational Collection):根據對象的存活周期的不同,將內存劃分為幾塊。一般是把Java堆分為新生代和老年代,這樣就可以根據各個年代的特點采用最適當的收集算法。
- synchronized和volatile的區別?
- synchronized:是Java中的一個關鍵字,用于控制多個線程對共享資源的訪問,保證同一時刻只有一個線程能夠訪問該資源。synchronized既可以修飾方法,也可以修飾代碼塊。
- volatile:是Java中的一個修飾符,用于保證變量的可見性和有序性,但不保證原子性。volatile變量不會被緩存在寄存器或者對其他處理器不可見的地方,每次使用都會直接從主存中讀取。