Java基礎易錯面試題,初級程序員面試必看!(會不斷更新)

寫在前面: 我是「揚帆向海」,這個暱稱來源於我的名字以及女朋友的名字。我熱愛技術、熱愛開源、熱愛編程。技術是開源的、知識是共享的

這博客是對自己學習的一點點總結及記錄,如果您對 Java算法 感興趣,可以關注我的動態,我們一起學習。

用知識改變命運,讓我們的家人過上更好的生活

相關文章:

20道你必須要背會的微服務面試題


1、& 和 && 的區別

&:按位與,不管左邊是true或false,右邊都進行運算,不會短路;

&&:邏輯與,如果左邊爲true,右邊參與運算,如果左邊爲false,那麼右邊不參與運算,具有短路的功能 。

2、重載和重寫的區別

重載:同一個類中的方法名相同而參數列表不同,與方法的修飾符、返回值類型沒有關係

重寫:需要遵循“兩同兩小一大”的原則。

  • 兩同:子類重寫的方法 必須 和父類被重寫的方法 方法名相同、參數列表相同

  • 兩小:子類的返回值類型小於等於父類的返回值類型,子類拋出的異常小於等於父類拋出的異常。

  • 一大:子類重寫的方法使用的訪問權限大於父類被重寫的方法的訪問權限。

注意:子類不能重寫父類中聲明爲 private 權限的方法

3、== 和 equals 的區別

== 既可以比較基本類型也可以比較引用類型。對於基本類型比較的是值,對於引用類型比較的是內存地址。

equals ,它是屬於 java.lang.Object 類裏面的方法,如果該方法沒有被重寫過默認也是==;通常情況下,重寫 equals 方法,會比較類中的相應屬性是否都相等。

更詳細的解釋請參考下面的博文

深入理解 equals() 方法以及與 == 的區別

4、final、finally、finalize 的區別

  • final:用於聲明屬性,方法和類,分別表示屬性不可變,方法不可覆蓋,被其修飾的類不可繼承。
  • finally:異常處理語句結構的一部分,表示總是執行。
  • finalize:Object 類的一個方法,在垃圾回收器執行的時候會調用被回收對象的此方法,可以覆蓋此方法

5、接口和抽象類

相同點

  • 接口和抽象類都不能被實例化,它們都位於繼承樹的頂端,用於被其他類實現和繼承
  • 可以將抽象類和接口類型作爲引用類型
  • 接口和抽象類都包含抽象方法
  • 一個類如果繼承了某個抽象類或者實現了某個接口都需要對其中的抽象方法全部進行實現,否則該類仍然需要被聲明爲抽象類

不同點

  • 一個類可以實現多個接口,一個類只能繼承一個抽象類;
  • .接口中不能定義構造器,抽象類中可以定義構造器;抽象類的構造器不是用來創建對象,而是讓其子類調用完成抽象類的初始化操作;
  • 接口中的方法全部都是抽象方法,抽象類中可以有抽象方法和具體方法;
  • 接口中的成員全都是public 的,抽象類中的成員可以是 private、默認、protected、public;
  • 接口中定義的成員變量實際上都是常量,抽象類中可以定義成員變量;
  • 接口中不能有靜態方法,抽象類中可以包含靜態方法;(注意:JDK1.8之後接口中可以有靜態方法

6、error 和exception 的區別

相同點

Error 類和Exception 類的父類都是Throwable 類

不同點

Error 類一般是指Java 虛擬機無法解決的嚴重問題,如系統崩潰,虛擬機錯誤,內存空間不足,方法調用棧溢出等。
Exception 類表示其它因編程錯誤或偶然的外在因素導致的一般性問題,程序可以處理的異常,可以捕獲且可能恢復。

關於異常的問題請參考下面的博文

Java裏面的異常

7、throw 和 throws 的區別

throw

  • throw 語句用在方法體內,表示拋出異常,由方法體內的語句處理。
  • throw 是具體向外拋出異常的動作,所以它拋出的是一個異常實例,執行throw 一定是拋出了某種異常。

throws

  • throws 語句是用在方法聲明後面,表示如果拋出異常,由該方法的調用者來進行異常的處理。
  • throws 主要是聲明這個方法會拋出某種類型的異常,讓它的使用者要知道需要捕獲的異常的類型。
  • throws 表示出現異常的一種可能性,並不一定會發生這種異常。

8、String 、StringBuilder 、StringBuffer 的區別

  • String 由final修飾,是不可變字符序列
  • StringBuffer 可變字符序列,其效率低,但是線程安全
  • StringBuilder 可變字符序列,其效率高,但是線程不安全

更詳細的解釋請參考下面的博文

聊聊 StringBuffer 與 StringBuilder

9、ArrayList 和Linkedlist 區別

二者都線程不安全,但是效率比 Vector 的高

  • ArrayList 底層是以 數組 的形式保存數據,隨機訪問集合中的元素比LinkedList 快(原因是 LinkedList 要移動指針);
  • LinkedList 內部以 鏈表 的形式保存集合裏面數據,它隨機訪問集合中的元素性能比較慢,但是新增和刪除時速度比 ArrayList 快(原因是 ArrayList 要移動數據)。

更詳細的解釋請參考下面的博文

聊聊 ArrayList 與 LinkedList

10、Comparable 和 Comparator 的區別

ComparableComparator 都是用來實現集合中元素的比較、排序的,只是 Comparable 是在集合內部定義的方法實現的排序,Comparator 是在集合外部實現的排序,所以,如想實現排序,就需要在集合外定義 Comparator 接口的方法或在集合內實現 Comparable 接口的方法。

更詳細的解釋請參考下面的博文

比較器(Comparable和Comparator)

11、equals 和 hashcode 的區別

  • 如果兩個對象equals相等,Java運行時環境會認爲他們的hashcode一定相等。
  • 如果兩個對象equals不相等,他們的hashcode有可能相等。
  • 如果兩個對象hashcode相等,他們的equals不一定相等。
  • 如果兩個對象hashcode不相等,他們的equals不一定相等。

由於水平有限,本博客難免有不足,懇請各位大佬不吝賜教!

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