Java基礎面試題面經整理(持續更新)

前提

臨近秋招,本博文主要整理最近各大企業面經裏的那些Java基礎面試題,並經過對比整合給出一份參考答案。並沒有按照特定順序,僅僅是提供了複習了以後測試掌握。文章的答案不必定絕對正確,若是有錯誤的地方還望指出!html

一、equals 和 == 的區別?

最直接,咱們點開equals的源碼java

public boolean equals(Object obj) {
        return (this == obj);
    }

咱們能夠發現equals也是用的== 來比較的,可是爲何還要說它們之間的區別呢?由於equals的方法能夠根據咱們的須要重寫。==若是比較的是兩個值類型的話,那麼就是比較它們之間是否相等,若是是引用類型的話,那麼就是比較它們之間的地址了。面試

二、爲何重寫equals必定要重寫hashcode?

默認的hashcode方法是根據對象的內存地址經哈希算法獲得的,若是不重寫的話,那麼在兩個相同的對象在使用equals方法的時候就有可能不一樣。這在咱們的map中的話,若是以對象爲key的話,就會致使咱們邏輯上的key相同卻有着不一樣的值!算法

三、Integer與int的==比較是怎麼樣的?

首先看一下下面的比較編程

public static void main(String[] args) {
        Integer a = 3;
        int b = 3;
        Integer c = Integer.valueOf(3);
        Integer d = new Integer(3);
        System.out.println(a == b);   //輸出true
        System.out.println(b == c);   //輸出true
        System.out.println(b == d);   //輸出true
        System.out.println(a == c);   //輸出true
        System.out.println(c == d);   //輸出false
    }

咱們的Integer在int比較的時候,會自動拆箱,再作值比較,因此返回true;安全

Integer之間的比較的話,除了new Integer()以外,其餘比較都是同一段地址,而new的新對象則不是,因此返回的false。多線程

四、接口和抽象類的區別?

  • 接口中的全部方法都是抽象的,而抽象類能夠有抽象的和非抽象的
  • 類能夠實現不少個接口,但只能繼承一個抽象類
  • 類能夠不實現抽象類和接口聲明的全部方法,可是該類必須聲明成抽象的
  • 接口的成員方法默認是public,而抽象類的成員能夠是private,protected,public
  • JDK1.8開始,接口中能夠包含default方法(能夠進行實現),可是抽象類沒有。

五、Java的異常處理機制,Error和Exception的區別?

兩者都有共同的父類——Throwable!app

Error:表示程序發生錯誤,是程序沒法處理的,不可恢復的,如OutOfMemoryError異步

Exception: 表示程序可處理的異常,又分爲CheckedException(受檢異常)、UncheckedException(非受檢異常),受檢異常發生在編譯期,必需要使用try...catch 或者 throws捕獲或者拋出異常,不然編譯不經過(如IOException之類,多線程之類的);非受檢異常發生在運行期,具備不肯定性,主要由程序的邏輯問題引發的,在程序設計的時候要認真考慮,儘可能處理異常。(如NullPointException 參數值爲null(空指針),IndexOutOfBoundsException 下標參數值越界)函數式編程

六、++和--操做是否爲原子操做,爲何?

不是原子性操做。原子性的意思是操做不可分割,可是咱們的++和--確實能夠分爲三個步驟(讀寫改)

  1. 從棧讀取咱們的值
  2. 進行加1的操做
  3. 將咱們的值壓回棧

因此再多線程狀況下,就會致使咱們的自增或者自減不許確!

七、面向對象的三大特性是什麼?請簡單介紹一下!

封裝、繼承、多態

封裝: 所謂封裝,也就是把客觀事物封裝成抽象的類,而且類能夠把本身的數據和方法只讓可信的類或者對象操做,對不可信的進行信息隱藏。封裝是面向對象的特徵之一,是對象和類概念的主要特性。 簡單的說,一個類就是一個封裝了數據以及操做這些數據的代碼的邏輯實體。在一個對象內部,某些代碼或某些數據能夠是私有的,不能被外界訪問。經過這種方式,對象對內部數據提供了不一樣級別的保護,以防止程序中無關的部分意外的改變或錯誤的使用了對象的私有部分。

繼承: 所謂繼承是指可讓某個類型的對象得到另外一個類型的對象的屬性的方法。它支持按級分類的概念。繼承是指這樣一種能力:它可使用現有類的全部功能,並在無需從新編寫原來的類的狀況下對這些功能進行擴展。 經過繼承建立的新類稱爲「子類」或「派生類」,被繼承的類稱爲「基類」、「父類」或「超類」。繼承的過程,就是從通常到特殊的過程。要實現繼承,能夠經過「繼承」(Inheritance)和「組合」(Composition)來實現。繼承概念的實現方式有二類:實現繼承與接口繼承。實現繼承是指直接使用基類的屬性和方法而無需額外編碼的能力;接口繼承是指僅使用屬性和方法的名稱、可是子類必須提供實現的能力;

多態: 所謂多態就是指一個類實例的相同方法在不一樣情形有不一樣表現形式。多態機制使具備不一樣內部結構的對象能夠共享相同的外部接口。這意味着,雖然針對不一樣對象的具體操做不一樣,但經過一個公共的類,它們(那些操做)能夠經過相同的方式予以調用。

八、Java中是如何具體實現多態的?

九、面向對象和麪向過程的區別?

面向對象方法中,把數據和數據操做放在一塊兒,組成對象;對同類的對象抽 象出其共性組成類;類經過簡單的接口與外界發生聯繫,對象和對象之間經過消 息進行通訊。而面向過程方法是以過程爲中心的開發方法,它自頂向下順序進行, 程序結構按照功能劃分紅若干個基本模塊,這些模塊造成樹狀結構。

(過程)優勢:性能比面向對象高,由於類調用時須要實例化,開銷比較大,比較消耗源;好比嵌入式開發、Linux/Unix等通常採用面向過程開發,性能是最重要的因素。缺點:沒有面向對象易維護、易複用、易擴展。

(對象)優勢:易維護、易複用、易擴展,因爲面向對象有封裝、繼承、多態性的特性,能夠設計出低耦合的系統。缺點:性能比面向過程低。

十、String/StringBuffer/StringBuilder的區別?

String:不可變字符序列

StringBuffer:可變字符序列、效率低、線程安全(使用Synchronized修飾)

StringBuilder:可變字符序列、效率高、線程不安全

字符串直接相加本質也是轉換成StringBuilder調用append,可是由於會產生大量的StringBuilder對象因此不如直接new一個StringBuilder來用效率高!

十一、什麼是面向函數式編程?

十二、談談static,final關鍵字?

1三、談談volatile、synchronized關鍵字?

談到這兩個關鍵字須要瞭解到JMM和內存模型,能夠看看個人另外一篇博客。(點擊跳轉

1四、談談深拷貝和淺拷貝?

1五、Java線程和系統線程的區別?

1六、開多個Java進程和多個線程的區別?

1七、什麼是同步與異步,阻塞與非阻塞?

1八、多進程之間如何進行通訊?


待更新

相關文章
相關標籤/搜索