1. 程式人生 > 程式設計 >JAVA 面試的一些總結

JAVA 面試的一些總結

自己 java 面試的一些總結

java 基礎

  1. == 與 equals 的區別

    ​ == 直接比較棧記憶體引用的資料,對於基礎資料型別棧記憶體直接引用的就是值,所以可以直接使用。常量字串由於儲存在字串常量池,所以可以常量字串直接比較也會返回 true

    ​ equals 定義在 Object物件裡面,Object 原始碼裡面 equals 方法呼叫的就是 ==。所有包裝類都有對 equals 方法的覆蓋。

    ​ 自己定義的類需要覆蓋equals 方法,必須要覆蓋 hashCode 方法

    以下內容摘自<> 覆蓋equals時總要覆蓋hashCode,一個很常見的錯誤根源在沒有覆蓋hashCode方法。在每個覆蓋了equals方法的類中,也必須覆蓋hashCode方法。如果不這樣做的話,就會違反Object.hashCode的通用約定,從而導致該類無法結合所有基於雜湊的集合一起正常工作,這樣的集合包括HashMap、HashSet和Hashtable。

    ​ 同時equals 需要滿足下面幾條定義:

    1. 自反性。對於任何非null的引用值x,x.equals(x)必須返回true
    2. 對稱性。對於任何非null的引用值x和y,當且僅當y.equals(x)返回true時,x.equals(y)必須返回true。
    3. 傳遞性。對於任何非null的引用值x、y和z,如果x.equals(y)返回true,並且y.equals(z)返回true,那麼x.equals(z)則必須返回true。
    4. 一致性。對於任何非null的引用值x、y,只要equals的比較操作在物件中所用的資訊沒有被修改,多次呼叫x.equals(y)就會一直返回true,或者一致返回false。
    5. 對於任何非null的引用值x,x.equals(null)必須返回false。
  2. 說下 String,StringBuffer和StringBuilder

    ​ String 為了安全性和效率問題所以設計成了final ,所以在沒有StringBuffer 和 StringBuilder 的情況下。字串的每次拼接都會生成多個物件還要將字串推到字元常量池。String更多細節點選

    ​ 為瞭解決字串拼接的效率問題,推出了 StringBuffer。StringBuffer 是一個執行緒安全類。可能是因為StringBuffer 底層是字元陣列,考慮到陣列擴容的情況會導致髒資料。所以採用執行緒安全的方式。但是StringBuffer 基本沒有用到的場景,在多執行緒還是單執行緒的情況下都是用 StringBuilder

    ,因為在多執行緒的情況下我們需要自己控制執行緒流程,而且StringBuffer 也只是保證append 等操作是執行緒安全的,多執行緒情況下也保證不了資料的完整性

    ​ 1.5 之後java 就推出了StringBuilder是一個執行緒不安全的類,StringBuilder 和 buffer 的區別就是方法上沒有加 synchronized 關鍵字。StringBuilder 出現之後,String str = "Hello," + "World"; 這種程式碼編譯的時候都會替換成用StringBuilder拼接。

  3. 多執行緒

    ​ 主要說出四個類:Runnable(1.8 之後是變成函式式介面了),Thread,Callable(1.8 之後是變成函式式介面了),FutureTask

    1. Runnable:只是一個標識性的介面,裡面有個run 方法
    2. Thread :建構函式負責接收Runnable的,start() 方法通過JNI呼叫不同系統的底層生成一個執行緒,並讓執行緒處於就緒狀態。由CPU 執行緒的什麼時候執行什麼時候切換。
    3. Callable:和 Runnable 差不多的一個介面,只是帶有返回值。
    4. FutureTask:間接繼承 Runnable,兩個建構函式,一個可以接收 Runnable和一個固定值,一個接收Callable。執行也是傳遞給Thread 然後執行start 方法。FutureTask 還有一些API 方法可自行查閱。
  4. 執行緒池

    ​ 手動寫執行緒會造成浪費,所以實際程式設計中我們都是使用執行緒池來操作執行緒。

    ​ 用ExecutorService 來接收Executors執行緒工廠裡面的不同執行緒池策略,執行緒池裡面又包含很多引數可以設定。詳情參閱這裡

    ​ Spring 框架還有對執行緒池的進一步的封裝。

  5. IO

    ​ IO 主要分類兩大類:位元組流(對 byte 進行操作)和字元流(對 char 進行操作)。兩者的根本區別在於字元流有個緩衝區對位元組進行處理。

    ​ 常用的有:

    buffer:使用了快取區操作,提高效率

    Piped:管道流,多執行緒的情況下使用的

    IO 牽扯的東西太多了,能力有限不多寫了,除去傳統的BIO還有NIOAIO。具體的大家多看看別人具體對IO 寫的文章吧

Spring 框架系列

  1. Spring 的IOC

    ​ Spring 實現IOC 的方式是通過DI(依賴注入),通過配置的方式將bean 儲存到Spring 的容器(BeanFactory)。當我們需要某個類的時候都是通過Spring 去獲取。

  2. Spring 的AOP

    ​ AOP 是通過動態代理來實現的,Spring 有兩種動態代理的方式(JDK自帶的和CGLIB),動態代理主要應用到了反射機制。主要應用在日誌和事務上面。

  3. SpringMVC

    Spring MVC 流程分析

MQ 和Redis

掘金裡面已經有很多對redis 寫的很好的文章了。

MQ 推薦這一篇:90%的Java程式設計師,都扛不住這波訊息中介軟體的面試四連炮!

還有很多內容沒有寫到,首先因為自己也沒有理解透徹,再次已經有了很好的文章了就不在這裡東施效顰了