Java中級工程師常見面試題

前言:本文只是記錄博主遇到的或者博主認爲比較常見的面試題,問題和答案僅代表博主個人觀點。如果正在看這篇博文的你有你認爲比較常見而我沒有記錄的,歡迎評論,我會挑選記錄,方便大家一起面試造火箭。(不定時更新)

1.HashMap的底層原理

HashMap可以接受null的鍵值對,是線程不安全的,它是基於hashing的原理,jdk8後採用數組+鏈表+紅黑樹的數據結構。通過put()和get()方法儲存和獲取對象。當我們將鍵值對傳遞給put()方法時,它調用鍵對象的hashCode()方法來計算hashcode,讓後找到bucket位置來儲存值對象。當獲取對象時,通過鍵對象的equals()方法找到正確的鍵值對,然後返回值對象。HashMap使用鏈表來解決碰撞問題,當發生碰撞了,對象將會儲存在鏈表的下一個節點中。 HashMap在每個鏈表節點中儲存鍵值對對象。當兩個不同的鍵對象的hashcode相同時,它們會儲存在同一個bucket位置的鏈表中。鍵對象的equals()方法用來找到鍵值對。

2.Redis持久化的幾種方式

RDB持久化是指在指定的時間間隔內將內存中的數據集快照寫入磁盤,實際操作過程是fork一個子進程,先將數據集寫入臨時文件,寫入成功後,再替換之前的文件,用二進制壓縮存儲。過程比較簡單,也不需要過多配置。

AOF持久化以日誌的形式記錄服務器所處理的每一個寫、刪除操作,查詢操作不會記錄,以文本的方式記錄,可以打開文件看到詳細的操作記錄。可以說幾乎是用戶的每一個操作,都會記錄。RDB比AOF恢復數據較快,性能較高,但是數據安全性較低。

3.悲觀鎖與樂觀鎖

悲觀鎖總是假設最壞的情況,每次去拿數據的時候都認爲別人會修改,所以每次在拿數據的時候都會上鎖,這樣別人想拿這個數據就會阻塞直到它拿到鎖,用於多寫的情況;樂觀鎖總是假設最好的情況,每次去拿數據的時候都認爲別人不會修改,所以不會上鎖,但是在更新的時候會判斷一下在此期間別人有沒有去更新這個數據,可以使用版本號機制和CAS算法實現。用於多讀的情況。

4.數據庫數據太多跑不動怎麼辦

垂直分庫和垂直分表

垂直分庫就是根據業務耦合性,將關聯度低的不同表存儲在不同的數據庫。

垂直分表就是把一些字段長度大的單獨出來用一個字段關聯

水平切分 庫內分表(比如按月份數據分表) 分庫分表(先按業務分庫,再按月份分表)

5.#與$的區別

#會對SQL進行預編譯,一般傳字段參數值使用,如id = #{id},$不會進行預編譯,傳進來是什麼就是什麼,一般用於傳表名或者字段,如 order by ${id},但需要注意防SQL注入,比如傳表名的時候傳入user;--則會導致後面的SQL被註釋掉從而導致SQL注入問題,一般能用#儘量用#,如果使用$要對傳入值進行判斷。

6.String與StringBuffer與StringBuilder的區別

String是不可變的,每次對String的操作都會生成新的String對象,StringBuffer 和 StringBuilder 類的對象能夠被多次的修改,並且不產生新的未使用對象;StringBuffer是線程安全的,效率較低,StringBuilder是線程不安全的,效率較高;效率StringBuilder >  StringBuffer  >  String,如果要操作少量的數據用String,單線程操作字符串緩衝區下操作大量數據用StringBuilder,多線程操作字符串緩衝區下操作大量數據 用StringBuffer

 

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