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 中,key 和 value 都不允許出現null 值。
(3)從初始化容量的角度:
- HashTable 在不指定容量的情況下的默認容量爲11。HashMap 爲16。
- Hashtable 不要求底層數組的容量一定要爲 2 的整數次冪。HashMap 則要求一定爲2 的整數次冪。
(4)從擴容機制的角度:
- Hashtable 擴容時,將容量變爲原來的2 倍加 1。
- HashMap 擴容時,將容量變爲原來的2 倍。
(5)基礎方法的角度:(contains)【可選】
- HashMap 關於contains 的只有containsValue 和containsKey 方法。
- HashTable 關於contains 的有contains、containsKey 和 containsValue 三個方法。其中 contains 和containsValue 方法功能相同。
0x04.String buffer 和String build 有何區別 ?
答:
(1)相同點:(方法和功能角度)
- StringBuffer 與 StringBuilder 中的方法和功能完全是等價的。
(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 的對象寫出(即保存其狀態),要恢復的話則使用輸入流。
文章若有錯誤,歡迎各位評論區中指出。