1. 程式人生 > >Java後端工程師面試題

Java後端工程師面試題

一、使用Spring框架的好處是什麼?

輕量:Spring是輕量的,基本的版本大約2MB

控制反轉(IOC):Spring通過控制反轉實現類鬆散耦合,物件們給出它們的依賴,而不是建立或查詢依賴的物件們。

面向切面的程式設計(AOP):Spring支援面向切面的程式設計,並且把業務邏輯和系統服務分開。

容器:spring包含並管理應用中物件的生命週期和配置。

MVC框架:Spring的WEB框架是個精心設計的框架,是Web框架的一個很好的替代品。

事務管理:Spring提供一個持續的事務管理介面,可以擴充套件到上至本地事務下至全域性事務。

異常處理:Spring提供方便的API把具體技術相關的異常轉換為一致的unchecked異常。

二、Java工廠模式和Spring IOC的區別

Java工廠是在工廠中修改,在工廠中修改就要重修編譯工廠類,重新編譯的話就要先停了JVM再重新啟動。

Spring IOC是熱插拔的,在XML中直接修改,修改xmlspring就會立即發現你改動了XML,會再重新讀一遍XML,就會發現新改動了,根本不用重新啟動JVM。

三、ORM框架(Object relation mapping)

ORM物件關係對映關係,面向物件的物件模型和關係型資料之間的相互轉換。

Hibernate和Mybatis都是常用的ORM框架,兩者區別:

1.mybatis手寫SQL,而hibernate提供對映機制,開發人員無需擔心。

2.mybatis控制更細粒度,但可移植型差,hibernate開發DAO很簡單,可移植性好。

3.hibernate擁有完整的日誌系統,mybatis則欠缺一些

4. mybatis相比hibernate需要關心很多細節

5. sql直接優化上,mybatis要比hibernate方便很多

四、資料庫事務的四大特性及事務隔離級別

1.事務的四大特性:

原子性(Atomicity):事務包含的所有操作要麼全部成功,要麼全部失敗回滾。

一致性(Consistency):一個事務執行之前和執行之後都必須處於一致性狀態。

隔離性(Isolation):當多個使用者併發訪問資料庫時,比如操作同一張表時,資料庫為每一個使用者開啟的事務,不能被其他事務的操作所幹擾,多個併發事務之間要相互隔離。

永續性(Durability):

一個事務一旦被提交了,那麼對資料庫中的資料的改變就是永久性的,即便是在資料庫系統遇到故障的情況下也不會丟失提交事務的操作。

2.事務隔離:

更新丟失:兩事務同時更新,一個失敗回滾覆蓋另一個事務的更新。

髒讀:事務T1讀取到事務T2修改了但是還未提交的資料,之後事務T2又回滾其更新操作,導致事務T1讀到的是髒資料。

不可重複讀:事務T1讀取某個資料後,事務T2對其做了修改,當事務T1再次讀該資料時得到與前一次不同的值。

虛讀(幻讀):事務T1讀取在讀取某範圍資料時,事務T2又插入一條資料,當事務T1再次資料這個範圍資料時發現不一樣了,出現了一些“幻影行”。

不可重複讀和髒讀的區別:髒讀是某一事務讀取了另一個事務未提交的髒資料,而不可重複讀則是讀取了前一事務提交的資料。

幻讀和不可重複讀的異同:都是讀取了另一條已經提交的事務(這點就髒讀不同),所不同的是不可重複讀查詢的都是同一個資料項,而幻讀針對的是一批資料整體(比如資料的個數)。

3.事務隔離的級別:

讀未提交(1000):只限制同一資料寫事務禁止其他寫事務。解決”更新丟失”。

讀已提交(1100):只限制同一資料寫事務禁止其它讀寫事務。解決”髒讀”,以及”更新丟失”。

可重複讀(1110):限制同一資料寫事務禁止其他讀寫事務,讀事務禁止其它寫事務(允許讀)。解決”不可重複讀”,以及”更新丟失”和”髒讀”。

序列化(1111):提供嚴格的事務隔離。它要求事務序列化執行,事務只能一個接著一個地執行,但不能併發執行。如果僅僅通過“行級鎖”是無法實現事務序列化的,必須通過其他機制保證新插入的資料不會被剛執行查詢操作的事務訪問到。

五、假設有一張使用者表,正常的表只能存放大概一千萬或是兩千萬左右的資料,但是有上億的使用者?怎麼儲存?

橫向分割或者縱向分割。

不太嚴格的將,對於海量資料的資料庫,如果是因為表多而資料多,這時候適合垂直切分,即把關係緊密的(比如同一模組)的表切分出來出來放在一個servlet上。如果對於表並不多,但每張表的資料非常多,這時候就適合水平切分,即把表的資料按某種規則切分到對個數據庫(server)上。

可以橫向分割,把表分割成多個表然後分散式儲存。

六、庫函式和系統呼叫

1.系統呼叫是為了方便應用使用作業系統的介面,而庫函式是為了方便入門編寫應用程式而引出的,比如自己編寫一個函式其實也可以說是一個庫函式,

2.系統呼叫可以理解為核心提供給我們在使用者態的介面函式,可以認為是某種核心的庫函式。

3.read()函式是系統呼叫,而fread()函式是C標準庫函式。

七、Java執行緒安全

執行緒同步:當一個程式對一個執行緒安全的方法或者語句進行訪問的時候,其他的不能再對它進行操作,必須等到這次訪問結束之後才能對這個執行緒安全的方法進行訪問。

執行緒安全:如果你的程式碼所在的程序中有多個執行緒在同時進行,而這些執行緒可能會同時執行這段程式碼,如果每次執行的結果和單執行緒執行的結果是一樣的,而且其他的變數的值和預期的是一樣的,就是執行緒安全的。

Java如何保證執行緒安全?

常用的保證Java操作原子性的工具是鎖和同步方法(或者同步程式碼塊)。使用鎖,可以保證了同一時間只有一個執行緒能執行申請鎖和釋放鎖之間的程式碼。

publicvoidtestLock(){

  lock.lock();

try{

int j = i;

    i = j + 1;

  } finally {

    lock.unlock();

  }

}

與鎖類似的是同步方法或者同步程式碼塊。使用非靜態同步方法,鎖住的是當前例項;使用靜態同步方法時,鎖住的是該類的Class物件;使用靜態程式碼塊時,鎖住的是synchronized關鍵字後面括號內的物件。下面是同步程式碼塊例項。

publicvoidtestLock(){

synchronized (anyObject){

int j = i;

    i = j + 1;

  }

}

八、Java設計模式

建立型模式(5種):工廠方法模式,抽象工廠模式,單例模式,建造者模式,原型模式。

結構型模式(7種):介面卡模式,裝飾器模式,代理模式,外觀模式,橋接模式,組合模式,享元模式。

行為型模式(11種):策略模式、模板方法模式、觀察者模式、迭代子模式、責任鏈模式、命令模式、備忘錄模式、狀態模式、訪問者模式、中介者模式、直譯器模式。