2020Java面試題及答案

      今年由於疫情的影響,整個大的市場環境不景氣,老闆也經常把疫情的事情掛在嘴邊,說由於疫情的影響,公司業績不好,所以取消了績效,還定製的強制性的加班政策,就連出差補貼也從原來的350降到了現在的80,難道真的是疫情影響的嗎?說白了對於程序員來說影響並不大,對於互聯網行業反而會有一定的需求旺盛的景象出現,影響的是傳統行業,但是程序員只要有一臺電腦,可以聯網就能工作,工作量並沒有因爲疫情的影響而減少,就拿我來說,當國內疫情最嚴重的時候,我們公司的開發人員在家辦公,每天晚上熬夜到凌晨四五點是長有的事情,就這種情況持續了有辦個多月。到最後績效說沒就沒,你能說這是疫情影響的嗎?所以我離職重新開始找工作了,這麼長時間的面試,自己覺的其實外面招人的公司很多,崗位也不少,能給到的薪資也不算低吧。還是自己欠下的計數債太多了,現在的招聘要求已經不像是兩三年之前了,不僅要會敲代碼,還要懂底層原來,還要了解架構相關的東西。如果你只會敲代碼,寫個業務處理邏輯,那不管以後去哪面試,都是會受挫的,所以平時得多看多學,需要有一定的技術廣度和深度。平時積累到到東西,面試就不會差。下面是我總結的一些面試題和答案,僅供參考,主要是被問到的概率比較大。

String的equals()方法是如何判斷字符串是否相等的?

答:string的equals判斷字符串是否相等首先會判斷兩個字符串的地址是否相等,如果地址相等則肯定字符串相等,否則會先去判斷字符串的長度是否相等,相等了則進入while循環,判斷每一個字符是否相等。

hashmap的底層實現原理

答:jdk1.7使用數組+鏈表的形式,jdk1.8使用數組+鏈表+紅黑樹的形式

map的遍歷方式有哪些?

Spring中IOC是什麼?AOP是什麼?

答:IOC叫控制反轉,也叫依賴注入。

dao接口的實現不再是業務邏輯層調用工廠類去獲取,而是通過容器(spring)來自動的爲我們的業務層設置Dao的實現類,這樣整個過程就反過來,以前是我們業務層主動去獲取dao,而現在是dao主動被設置到業務邏輯層中來了,這個也就是反轉控制的由來。通過IOC,我們就可以在不修改任何代碼的情況下,無縫地實現數據庫的換庫遷移

AOP面向切面編程將程序中的交叉業務邏輯(比如安全,日誌,事務),封裝成一個切面,然後注入到目標業務邏輯中去。 比如:很多方法都可能會拋異常,你要記錄這個異常到日誌中去,可以寫個攔截器,在這個類中記錄日誌,在spring.xml中配置一個記錄這些日誌的方法的攔截器,在這個方法執行後調用這個攔截器,記錄日誌。這樣就不用每次拋異常都要手動記錄日誌。

IOC是如何創建實例的?

答:1.調用無參構造器 2.調用有參構造器3.工廠創建對象

Spring中的依賴注入有哪幾種方式?

答:1.構造方法注入 2.set注入 3.根據註解注入

Spring中的註解都有哪些?分別是幹什麼的?

1.聲明Bean的註解,@Component @Service(表明業務邏輯層) @Respository(表明數據訪問層) @Controller(控制器層)

2.注入Bean的註解, @Autowired @Resource

3.配置類的註解, @Configuration (聲明當前類爲配置類) @ComponentScan(用於對Component進行掃描)

4.AOP的註解,@Before @After @Around @PointCut @Aspect(聲明一個切面)

redis的持久化方式?

答:有兩種,RDB和AOF

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

AOF持久化以日誌的形式記錄服務器所處理的每一個寫、刪除操作,查詢操作不會記錄,以文本的方式記錄,可以打開文件看到詳細的操作記錄。

什麼是聯合索引?

答:聯合索引又叫複合索引。對於複合索引:Mysql從左到右的使用索引中的字段,一個查詢可以只使用索引中的一部份,但只能是最左側部分。例如索引是key index (a,b,c). 可以支持a | a,b| a,b,c 3種組合進行查找,但不支持 b,c進行查找 .當最左側字段是常量引用時,索引就十分有效。

Linux的常用命令

1.ps –ef|grep XXX 查看一個程序是否運行

2.kill -9 19979 終止一個線程

3.pwd 查看當前目錄

4.ls 查看文件

5.tail -n 行數 文件名。 查看某文件的最後多少行

6.nohup java -jar 啓動java項目

mysql的優化

1、在表中建立索引,優先考慮where、group by使用到的字段。

2、儘量避免使用select *,返回無用的字段會降低查詢效率。

3、儘量避免使用in 和not in,會導致數據庫引擎放棄索引進行全表掃描。可以使用exists和not exists代替

4、儘量避免使用or,會導致數據庫引擎放棄索引進行全表掃描。

5、儘量避免在字段開頭模糊查詢,會導致數據庫引擎放棄索引進行全表掃描。

6、儘量避免進行null值的判斷,會導致數據庫引擎放棄索引進行全表掃描。

7、儘量避免在where條件中等號的左側進行表達式、函數操作,會導致數據庫引擎放棄索引進行全表掃描。如下:

8、當數據量大時,避免使用where 1=1的條件。通常爲了方便拼裝查詢條件,我們會默認使用該條件,數據庫引擎會放棄索引進行全表掃描

事務的隔離級別

隔離級別:1.Read Uncommitted(讀未提交):可能出現贓讀、不可重複讀、幻讀等問題

2.Read Committed(讀取提交內容):可能出現不可重複讀的問題、幻讀等問題。大多數數據庫等默認隔離機制

3.Repeatable Read(可重複讀):可能會出現幻讀的問題。mysql的默認隔離級別

4.Serializable(可串行化):最高級別的隔離級別,解決了幻讀問題,但可能會出現大量的超時現象和鎖競爭

如何防止sql注入

1.前端表單進行參數格式控制;

2.後臺進行參數格式化,過濾所有涉及sql的非法字符;

3.持久層使用參數化的持久化sql,使用預編譯語句集,切忌使用拼接字符串;

4.使用參數化sql代替字符串拼接

5.參數化,使用預編譯語句,進行批處理更新

如何解決冪等性問題

1.前端解決,用戶點擊一次按鈕後設置按鈕在短時間內不可用,防止重複點擊

2.後端解決:1.使用唯一索引,2.token+redis , 3.根據樂觀鎖來解決冪等性。4.select+insert

多線程面試題

  1. Java創建線程對象後,直接調用其start()方法 和run()的區別?

    1.調用 start() 方法是啓動新的線程,新的線程運行後,會在新線程上執行 run() 方法 內的代碼

    2.而直接調用 run() 方法只能在當前線程運行 run() 方法內的代碼,並不會啓動新的線 程

  2. threda的sleep方法和object的wait方法有什麼區別?

    答:java程序中wait和sleep都會造成某種形式的暫停,它們可以滿足不同的需要。

    • wait存在於Object類中;sleep存在於Thread類中。

    • wait會讓出CPU資源以及釋放鎖;sleep只會釋放CPU資源。

    • wait只能在同步塊中使用;sleep沒這限制。

    • wait需要notify(或 notifyAll)喚醒,進入等鎖狀態;sleep到指定時間便會自動恢復到運行狀態。

  3. 多線程的實現方式

    答:有四種:

    1.集成Thread類,重寫run方法,調用start方法啓動線程

    2.實現runable接口,重寫run方法,調用thread的start方法啓動線程

    3.實現callable接口,重寫call方法,通過FutureTask包裝器創建thread線程,調用start方法啓動線程

  4. springMVC的原理

    1. 客戶端請求提交到DispatcherServlet,DispatcherServlet會在服務器啓動時初始化spring容器,生成控制器(Controller)實例。

    2. 由DispatcherServlet根據請求匹配到一個合適的處理映射器(HandlerMapping),由處理映 射器(HandlerMapping)生成一個執行鏈(HandlerExecutionChain)

    3. 處理適配器(HandlerAdapter)類的職責是調用控制器(Controller)中的方法來真正處理請 求。

    4. 由處理適配器(HandlerAdapter)調用控制器(Controller)中的方法,在控制器方法執行前後 會調用多個攔截器中的前處理和後處理方法

    5. Controller方法執行後,結果會封裝爲ModelAndView對象。由DispatcherServlet利用視 圖解析器(ViewResoler)生成視圖(View)對象

    6. 在請求到達視圖之前,spring會將模型數據存入request作用域

    7. 視圖取出模型數據,渲染爲html頁面後作爲響應返回給客戶端

  5. 集合面試題

  6. ArrayList與Vectory的區別?

    答: 1.Vector是線程安全的,源碼中有很多的synchronized可以看出,比方說add()方法就是用synchronized進行修飾的,而ArrayList不是。導致Vector效率無法和ArrayList相比;

    2.ArrayList和Vector都採用線性連續存儲空間,當存儲空間不足的時候,ArrayList默認增加爲原來的50%,Vector默認增加爲原來的一倍;

    3.Vector可以設置capacityIncrement,而ArrayList不可以,因爲Vector比ArrayList多了一個構造方法,設置增長容量參數的方法。

  7. ArrayList的底層實現原理是什麼?

    答: 1.ArrayList 通過數組實現,一旦我們實例化 ArrayList 無參數構造函數默認爲數組初始化長度爲 10,底冊是一個Object數組

    2.add 方法底層實現如果增加的元素個數超過了 10 個,那麼 ArrayList 底層會新生成一個數組,長度爲原數組的 1.5 倍+1,然後將原數組的內容複製到新數組當中,並且後續增加的內容都會放到新數組當中。當新數組無法容納增加的元素時,重複該過程。是一旦數組超出長度,就開始擴容數組。

    它的特點是:查詢快,增刪慢,線程不安全,根據下標查詢一個數據的時間複雜度爲O(1),因爲它的底層是數組,所以在新增或者刪除元素的時候,需要進行元素的移動,增加了複雜度導致速度慢。

  8. LinkedList底層實現原理是什麼?

    答:LinkedList底層的數據結構是基於雙向循環鏈表的,且頭節點不存放數據,

    它的特點是:增刪快,查詢慢,線程不安全,根據下標查詢一個數據的時間複雜度爲O(n),因爲它的底層是雙向循環鏈表,所以在新增或者刪除元素的時候,只需要將前目標元素的一個元素和後一個元素的地址改變即可,所以增刪速度快。

  9. HashMap底層實現原理是什麼?

    答:JDK1.7中,HashMap採用數組+鏈表 的方式實現,效率低,JDK1.8中,HashMap採用位桶+鏈表+紅黑樹實現,效率提升。線程不安全,可以有null的健和值。hashTable線程安全,不能有null的健和值,1.8之後使用CocurrentHashMap代替hashTable,提高的效率

最好自學一下dubbo、springcloud方面的東西。

最後希望大家對自己的職業有個路線規劃,這對你後面到職業生涯很重要,要走哪條路得慎重。如果對行業沒有要求對話,最好能進入互聯網公司,這對你的技術提升太大了,傳統行業能學到的只有業務,技術提升太窄

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