Java面試知識點(整理)

基礎篇

基本功

  • 面向對象的特徵
    1. 抽象:抽象是將一類事物的共同特徵總結出來構造類的過程,包括數據抽象和行爲抽象兩個方面。抽象只關注對象的屬性和行爲,不關心這些行爲的具體細節。
    2. 繼承:繼承是從已知類得到信息繼承信息創建新類的過程。提供繼承信息的類成爲超類或者父類;得到繼承信息的成爲子類或者派生類。繼承讓變化中的軟件系統有了一定的延展性,同時繼承也是封裝程序中可變因素的重要手段。
    3. 封裝:通常認爲封裝是把數據和操作數據的方法綁定起來,對數據的方法只能定義的接口。在類中編寫方法就是對實現細節的一種封裝。可以說封裝就是隱藏可隱藏的東西,只對外面提供最簡單的接口。
    4. 多態:不同子類型的對象對同一行爲做出不同的響應,簡單的說就是用同樣的對象引用調用同樣的方法但是做了不同的事情。多態分爲運行時多態和編譯時多態,方法重寫(override)實現的允許時多態,方法重載(overload)實現的編譯時多態。
       
  • final,finally,finalize的區別
    1. final:final可以修飾類,方法和屬性,修飾類時表示該類不能被繼承,修飾方法時表示該方法不能被子類覆蓋,修飾屬性時表示該屬性爲一個常量,給定初值後該常量的引用就不能被修改。
    2. finally:總是和try…catch..語句塊一起使用,無論代碼是否發生異常,finally中的語句總是被執行,可以將釋放資源的代碼放在finally塊中
    3. finalize:finalize是Object類中定義的方法,Java允許在垃圾回收器清理對象時使用finalize()方法做一些必須的清理工作。
       
  • int和Integer的區別
    int是Java中一個基本數據類型,Integer是int對應的包裝器類型,Java5開始引入了自動拆箱/裝箱機制,是的兩者可以相互轉換。包裝器類型的目的可以將基本數據類型當做對象來操作。
    其他的基本數據類型:byte、short、long、char、boolean、float、double
    對應的包裝器類型爲:Byte、Short、Long、Character、Boolean、Folat、Double
     
  • 重載和重寫的區別
    重載(overload)和重寫(overwrite)都是實現多態的方式,重載實現的編譯時多態,而重寫實現的是運行時多態。重載發生在一個類中,同名的方法如果有不同的參數列表則可視爲重載,重載不能工具返回值類型進行區分。重寫發生在父類和子類之間,被重新的方法與父類被重新的方法具有相同的返回值類型,要具有更大的範圍權限,要比父類被重新方法拋出更少的異常。
     
  • 抽象類和接口的區別
    抽象類和接口都不能實例化,但是能夠定義抽象類和接口類型的引用。抽象類可以有構造方法,可以包含抽象方法和具體方法,但是接口不能定義構造函數,接口中的方法全部都是抽象方法。抽象類中可以定義普通成員變量,接口中的成員變量實際上爲常量。抽象類中的方法可以是public、protected、默認、private的,而接口中的方法只能是public的。有抽象方法的的類必須是抽象類,抽象類中可以沒有抽象方法。
     
  • 反射的用途和實現
     
  • 自定義註解的場景及實現
     
  • HTTP的GET和POST方式的區別
    1. GET用於向服務器請求數據,POST用於向服務器提交數據
    2. GET請求的數據會跟在URL後面,POST提交的數據會放在HTTP Body中
    3. GET提交的數據量較小,POST提交的數據較大
    4. POST安全性要比GET安全性高。
      詳見:淺談HTTP中Get與Post的區別
       
  • session和cookie的區別
    詳見:理解Cookie和Session機制
     
  • session分佈式處理
    集羣/分佈式環境下5種session處理策略
     
  • JDBC流程

a. 註冊驅動

Class.forName("oracle.jdbc.driver.OracleDriver");

b. 創建連接

Connection con = DriverManager.getConnection("jdbc.oracle:thin:@localhost:1521:orcl""name", "password");

c. 創建查詢語句

PreparedStatement ps = con.prepareStatement("select * from emp where sal between ? and ?");
ps.setInt(1, 1000);
ps.setInt(2, 3000);

d. 執行語句

ResultSet rs = ps.executeQuery();

e. 處理結果集

while (rs.next()) {
    System.out.println(rs.getInt("empno") + "-" + rs.getString("ename"));
}

f. 關閉連接

finally {
    if (con != null) {
        try {
            con.close();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
} 
  • MVC設計思想
    談談JAVA工程獅面試中經常遇到的面試題目——什麼是MVC設計模式

  • equals與==區別

    1. equals比較兩個對象的內容是否相等,equals()方法來自Object類,該方法使用==比較兩對象,所有使用equals比較對象之前通常需要重寫該方法,同時應該重寫hashCode()方法。
    2. 用==比較基本類型的時候,比較基本類型的數值是否相等。當比較對象時,比較的是兩個對象在內存的地址是否相等。 
       
  • 兩個對象值相同(x.equals(y) == true),但卻可有不同的hash code,這句話對不對?
    不對,如果兩個對象通過equals()比較返回結果爲true,那麼它們的hash code應該相等。如果兩個對象的hash code相等,那這兩個對象並一定相同。
    equals()方法應該遵循自反性(x.equals(x)必須返回true)、對稱性(x.equals(y)返回true時,y.equals(x)也必須返回true)、傳遞性(x.equals(y)和y.equals(z)都返回true時,x.equals(z)也必須返回true)和一致性(多次調用x.equals(y)返回的結果相同)。
     
  • &和&&區別
    &運算符有兩種用法:(1)按位與;(2) 非短路邏輯與。&&運算符爲短路與。相對的|運算符也有兩種用法:(1)按位或;(2)非短路邏輯或。同樣||運算符爲短路邏輯或。
     
  • String和StringBulider、StringBuffer區別
    1. 三個類都爲final類,不能被繼承
    2. String引用的字符串內容是不能被改變的,而StringBulider和StringBuffer內容可以改變
    3. StringBuffer是線程安全的,StringBulider是非線性安全的
       
  • Error和Exception有什麼區別
    Error表示系統級的錯誤和程序不必處理的異常,恢復很困難的一種嚴重問題。Exception表示需要捕獲或者程序進行處理的異常,是一種設計或者實現問題。

集合

  • List和Set區別
    1. List和Set都實現了Collection接口。
    2. List中允許存在重複元素,允許存在多個null元素,List中的元素是有序的。常用的實現類有ArrayList、LinkedList和Vector。
    3. Set中不允許存在重複元素,最多隻能包含一個null元素,Set中的元素是無序的。Set常用的實現類有HashSet、LinkedHashSet、TreeSet。  
       
  • List和Map區別
    1. List繼承自Collection接口。
    2. Map集合是以Key-Value鍵值對的形式存儲數據的。
       
  • ArrayList與LinkedList的區別
    1. 都是Collection接口的實現類,ArrayList內部使用數組實現,LinkedList是基於鏈表的數據結構。
    2. ArrayList可以對數據進行隨機存取,此時效率高於LinkedList。LinkedList不支持隨機存取,但由於LinkedList是基於鏈表的數據結構,所以在元素的刪除和添加上效率要高於ArrayList。
       
  • ArrayList與Vector區別
    1. ArrayList不是線程安全的,Vector是線程安全的。
    2. 默認情況下,在內部數組空間不足的時,ArrayList會在原來的基礎上擴展0.5倍,Vector會在原來的基礎上擴展1倍。
       
  • HashMap和Hashtable的區別
    1. HashMap不是線程安全的,Hashtable是線程安全的。
    2. HashMap允許key或value爲null,Hashtable不允許key和value爲空,會報空指針異常。
    3. Hashtable直接使用對象的hashcode,HashMap會重新計算hashcode。
    4. HashMap的iterator迭代器執行快速失敗機制,也就是說在迭代過程中修改集合結構,除非調用迭代器自身的remove方法,否則以其他任何方式的修改都將拋出併發修改異常。而Hashtable返回的Enumeration不是快速失敗的。
       
  • HashSet和HashMap區別
    HashSet內部使用HashMap實現
     
  • HashMap和ConcurrentHashMap的區別
  • HashMap的工作原理及代碼實現
  • ConcurrentHashMap的工作原理及代碼實現
    Java7/8 中的 HashMap 和 ConcurrentHashMap 全解析

線程

  • 線程的創建方式及實現
    Java5以前實現多線程的方法有兩種:一種是繼承Thread類,另一種實現Runnable接口。兩種方式都要重寫run()方法來定義線程的行爲。推薦使用後者,因爲Java爲單繼承,如果繼承了Thread類就無法繼承別的類,使用Runnable接口更爲靈活。Java5之後還可以使用Callable接口創建線程,該接口中的call()方法會返回線程執行結果。

  • sleep()、join()、yield()有什麼區別

    1. sleep()方法給其他線程運行機會不會考慮到優先級,因此也會給低優先級的線程執行機會;yeild()方法只會給和自己相同或者高優先級的線程執行機會。
    2. 線程執行完sleep()方法後轉入阻塞(blocked)狀態,而執行yield()方法後轉入就緒狀態(runnable)。
    3. sleep()方法聲明拋出了InterruptedException異常, yeild()方法沒有聲明拋出異常。
    4. join()方法會使當前線程等待調用join()方法的線程執行結束後才能執行。
       
  • sleep()和wait()的區別
    1. sleep()爲Thread類的靜態方法,wait()爲Object類中的方法。
    2. sleep()方法不會釋放鎖對象,wait()方法會釋放鎖對象。wait()方法通常和notify()、notifyAll()方法一起使用,這三個方法通常用於協調多線程中的共享數據,所以必須在synchronized語句塊中使用,使用之前必須獲取鎖對象。當調用某一對象的wait()方法,該線程會暫停,並將當前線程放入對象等待池中,直到調用了notify()方法後,將從等待池中移除任意一個線程放入鎖等待池中,只有當鎖等待池中的線程獲得鎖後才能運行。當調用了notifyAll()方法,會將對象等待池中的所有線程移到鎖等待池中。
       
  • 說說CountDownLatch原理
    併發工具類(一)等待多線程完成的CountDownLatch
     
  • 說說CycliBarrier原理
    併發工具類(二)同步屏障CyclicBarrier
     
  • 說說Semaphore原理
    併發工具類(三)控制併發線程數的Semaphore
     
  • 說說ExChanger原理
    併發工具類(四)兩個線程進行數據交換的Exchanger
     
  • 說說CountDownLatch與CyclicBarrier區別
    1. CountDownLatch和CyclicBarrier都是實現線程間的等待,但兩者有不同的側重點:CountDownLatch一般用於某個線程等待其他若干個線程執行玩再繼續執行;CyclicBarrier一般用於多個線程相互等待至某個狀態,然後這一組線程再同時執行。
    2. CountDownLatch不能重用,CyclicBarrier可以重用。
       
  • ThreadLocal原理分析
    一個故事講明白線程的私家領地:ThreadLocal
     
  • 講講線程池的實現原理
    線程池的好處:

    1. 線程是稀缺資源,不能頻繁創建
    2. 將線程放入線程池中,可以交給其他任務進行復用
    3. 解耦,線程的創建與執行完全分開,便於維護

    創建一個線程池:

ThreadPoolExecutor(int corePoolSize, int maximumPoolSize, long keepAliveTime, TimeUnit unit, BlockingQueue<Runnable> workQueue, RejectedExecutionHandler handler) 

corePoolSize爲核心線程數大小
maximumPoolSize爲線程池最大線程數大小
keepAliveTimeunit爲線程空閒後的存活時間
workQueue爲存放任務的阻塞隊列
handler爲隊列和最大線程數都滿了後的飽和策略
常見的飽和策略:直接丟棄任務、調用者線程執行、丟棄隊列中的最近任務執行當前任務
線程池原理分析
深度解讀 java 線程池設計思想及源碼實現
- 創建線程池的幾種方式
- 線程的生命週期

鎖機制

參見:Java面試通關要點 彙總集【最終版】

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