2020 【JAVA面試】 -- Java SE 十大基礎常問點

Java SE總感覺自己掌握了,可是一些基本的問題卻答不上來?
特地針對此類情況,整理了今年【2020】大廠面試題Java SE的部分的常問點,在此分享出來!
這十個問題是比較基礎的


0x01.問:==和Equals 有何區別?

答:

(1)==:
  • 如果比較的是基本數據類型,那麼比較的是變量的值 。
  • 如果比較的是引用數據類型,那麼比較的是地址值。
(2)equals:
  • 如果沒重寫 equals 方法,比較的是兩個對象的地址值 。
  • 如果重寫了 equals 方法,往往比較對象中的屬性的內容。
  • equals 方法是從 Object 類中繼承的,默認的實現就是使用== 。

0x02.問:ArrarList 和LinkedList 有何區別?

答:

(1)從實現方式上:

  • ArrayList 是實現了基於動態數組的數據結構。
  • LinkedList 基於鏈表的數據結構。

(2)從隨機訪問角度:

  • ArrayList 優於 LinkedList
  • ArrayList只需使用索引訪問,而 LinkedList 需要移動指針。

(3)從數據增刪角度:

  • 若只對單條數據插入或刪除, ArrayList 的速度優於 LinkedList。【易忽略的地方
  • 是批量隨機的插入刪除數據,LinkedList 的速度大大優於 ArrayList.。因爲 ArrayList 每插入一條數據,要移動插入點及之後的所有數據。

0x03.HashMap 和HashTable 有何區別?

  • 關於HashMap會有一篇完整的文章介紹,這裏主要是HashMap 和HashTable 的區別。

答:

(1)從線程安全性角度:

  • HashMap 是線程不安全的,使用 HashMap 時必須自己增加同步處理。
  • HashTable 是線程安全的,其中的方法是Synchronize 的,在多線程併發的情況下,可以直接使用HashTable

(2)從key 和value 的角度:

  • HashMap 中,null 可以作爲鍵,這樣的鍵只有一個;可以有一個或多個鍵所對應的值爲null。
  • HashTable 中,keyvalue 都不允許出現null 值。

(3)從初始化容量的角度:

  • HashTable 在不指定容量的情況下的默認容量爲11。HashMap 爲16。
  • Hashtable 不要求底層數組的容量一定要爲 2 的整數次冪。HashMap 則要求一定爲2 的整數次冪。

(4)從擴容機制的角度:

  • Hashtable 擴容時,將容量變爲原來的2 倍加 1。
  • HashMap 擴容時,將容量變爲原來的2 倍。

(5)基礎方法的角度:(contains)【可選】

  • HashMap 關於contains 的只有containsValuecontainsKey 方法。
  • HashTable 關於contains 的有containscontainsKeycontainsValue 三個方法。其中 containscontainsValue 方法功能相同。

0x04.String buffer 和String build 有何區別 ?

答:

(1)相同點:(方法和功能角度)

  • StringBufferStringBuilder 中的方法和功能完全是等價的。

(2)不同點:(線程安全角度)

  • StringBuffer 中的方法大都採用了 synchronized 關鍵字進行修飾,因此是線程安全的。
  • StringBuilder 沒有這個修飾,可以被認爲是線程不安全的。

0x05.Final、Finally、Finalize 有何區別?

答:

(1)final:

  • 修飾符(關鍵字)有三種用法:修飾類、變量和方法。

    • 修飾類時,意味着它不能再派生出新的子類,即不能被繼承。【和abstract 是反義詞】
    • 修飾變量時,該變量使用中不被改變,必須在聲明時給定初值,在引用中只能讀取不可修改。【也就是常量】。
    • 修飾方法時,同樣只能使用,不能在子類中被重寫。

(2)finally:

  • 通常放在 try…catch 的後面構造最終執行代碼塊,意味着程序無論正常執行還是發生異常,這裏的代碼只要JVM 不關閉都能執行。
  • 一般將釋放外部資源的代碼寫在 finally 塊中。

(3)finalize:

  • Object 類中定義的方法,Java 中允許使用 finalize() 方法在垃圾收集器將對象從內存中清除出去之前做必要的清理工作。
  • 這個方法是由垃圾收集器在銷燬對象時調用的,通過重寫finalize() 方法可以整理系統資源或者執行其他清理工作。 、

0x06.簡要談談你對反射的理解

答:

(1)從概念上:【反射是什麼?】

  • 反射機制就是 java 語言在運行時擁有一項自觀的能力

  • 通過這種能力可以徹底的瞭解自身的情況爲下一步的動作做準備

  • 通俗的語言:

    • Java 反射機制在程序運行時,對於任意一個類,都能夠知道這個類的所有屬性和方法;對於任意一個對象,都能夠調用它的任意一個方法和屬性。這種 動態的獲取信息 以及 動態調用對象的方法 的功能稱爲 java 的反射機制。

(2)實現的方式:【如何實現反射?】

  • Java 的反射機制的實現要藉助於4 個類:class,Constructor,Field,Method;

  • 通過這四個對象我們可以粗略的看到一個類的各個組成部分。:

    • class - 類對象。
    • Constructor-類的構造器對象。
    • Field-類的屬性對象,
    • Method-類的方法對象。

(3)反射的作用:【反射能幹什麼?】

  • 在Java 運行時環境中,對於任意一個類,可以知道這個類有哪些屬性和方法。
  • 對於任意一個對象,可以調用它的任意一個方法。

0x07.產生死鎖的基本條件 是什麼?

答:

(1)產生死鎖的四個必要條件:

  • 1.互斥條件:一個資源每次只能被一個進程使用。
  • 2.請求與保持條件:一個進程因請求資源而阻塞時,對已獲得的資源保持不放。
  • 3.不剝奪條件:進程已獲得的資源,在末使用完之前,不能強行剝奪。
  • 4.循環等待條件:若干進程之間形成一種頭尾相接的循環等待資源關係。

這四個條件是死鎖的必要條件,只要系統發生死鎖,這些條件必然成立。
只要上述條件之一不滿足,就不會發生死鎖。

(2)常見產生死鎖的可能原因:【可選】

  • 系統資源不足。
  • 資源分配不當。
  • 進程運行推進的順序不合適。

0x08.簡單談談對線程池的理解

答:

(1)從概念上:【什麼是線程池】

  • 線程池就是事先將多個線程對象放到一個容器中,當使用的時候就不用 new 線程,而是直接去池中拿線程。

(2)優點:

  • 1.降低資源消耗。通過重複利用已創建的線程降低線程創建和銷燬造成的消耗。
  • 2.提高響應速度。當任務到達時,任務可以不需要等到線程創建就能立即執行。
  • 3.提高線程的可管理性。線程是稀缺資源,如果無限制的創建,不僅會消耗系統資源,還會降低系統的穩定性,使用線程池可以進行統一的分配,調優和監控。

0x09.線程有哪些狀態?

答:

(1)新建狀態(New) :

  • 線程對象被創建後,就進入了新建狀態。

(2)就緒狀態(Runnable):

  • 線程對象被創建後,其它線程調用了該對象的start()方法,從而來啓動該線程。
  • 也被稱爲“可執行狀態”。

(3)運行狀態(Running):

  • 線程獲取CPU 權限進行執行。
  • 線程只能從就緒狀態進入到運行狀態。 【注意點

(4)阻塞狀態(Blocked):

  • 阻塞狀態是線程因爲某種原因放棄 CPU 使用權,暫時停止運行。直到線程進入就緒狀態,纔有機會轉到運行狀態。

  • 阻塞的情況分三種:

    • 等待阻塞 – 通過調用線程的wait()方法,讓線程等待某工作的完成。
    • 同步阻塞 – 線程在獲取synchronized 同步鎖失敗(因爲鎖被其它線程所佔用),它會進入同步阻塞狀態。
    • 其他阻塞 – 通過調用線程的 sleep()或 join()或發出了 I/O 請求時,線程會進入到阻塞狀態。當 sleep()狀態超時、join()等待線程終止或者超時、或者I/O 處理完畢時,線程重新轉入就緒狀態。

0x0A. java 序列化是什麼?

答:

(1)序列化的概念;

  • 序列化就是一種用來處理對象流的機制。【對象流就是將對象的內容進行流化】
  • 序列化可以對流化後的對象進行讀寫操作,也可將流化後的對象傳輸於網絡之間。
  • 序列化是爲了解決在對對象流進行讀寫操作時所引發的問題。

(2)實現方式:

  • 將需要被序列化的類實現 Serializable 接口。

    • 該接口沒有需要實現的方法。 實現接口只是爲了標註該對象是可被序列化的。
  • 使用一個輸出流(如:FileOutputStream)來構造一個 ObjectOutputStream(對象流)對象,然後使用ObjectOutputStream 對象的 writeObject(Object obj)方法就可以將參數爲 obj 的對象寫出(即保存其狀態),要恢復的話則使用輸入流。


文章若有錯誤,歡迎各位評論區中指出。

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