今年由於疫情的影響,整個大的市場環境不景氣,老闆也經常把疫情的事情掛在嘴邊,說由於疫情的影響,公司業績不好,所以取消了績效,還定製的強制性的加班政策,就連出差補貼也從原來的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
多線程面試題
-
Java創建線程對象後,直接調用其start()方法 和run()的區別?
1.調用 start() 方法是啓動新的線程,新的線程運行後,會在新線程上執行 run() 方法 內的代碼
2.而直接調用 run() 方法只能在當前線程運行 run() 方法內的代碼,並不會啓動新的線 程
-
threda的sleep方法和object的wait方法有什麼區別?
答:java程序中wait和sleep都會造成某種形式的暫停,它們可以滿足不同的需要。
-
wait存在於Object類中;sleep存在於Thread類中。
-
wait會讓出CPU資源以及釋放鎖;sleep只會釋放CPU資源。
-
wait只能在同步塊中使用;sleep沒這限制。
-
wait需要notify(或 notifyAll)喚醒,進入等鎖狀態;sleep到指定時間便會自動恢復到運行狀態。
-
-
多線程的實現方式
答:有四種:
1.集成Thread類,重寫run方法,調用start方法啓動線程
2.實現runable接口,重寫run方法,調用thread的start方法啓動線程
3.實現callable接口,重寫call方法,通過FutureTask包裝器創建thread線程,調用start方法啓動線程
-
springMVC的原理
-
客戶端請求提交到DispatcherServlet,DispatcherServlet會在服務器啓動時初始化spring容器,生成控制器(Controller)實例。
-
由DispatcherServlet根據請求匹配到一個合適的處理映射器(HandlerMapping),由處理映 射器(HandlerMapping)生成一個執行鏈(HandlerExecutionChain)
-
處理適配器(HandlerAdapter)類的職責是調用控制器(Controller)中的方法來真正處理請 求。
-
由處理適配器(HandlerAdapter)調用控制器(Controller)中的方法,在控制器方法執行前後 會調用多個攔截器中的前處理和後處理方法
-
Controller方法執行後,結果會封裝爲ModelAndView對象。由DispatcherServlet利用視 圖解析器(ViewResoler)生成視圖(View)對象
-
在請求到達視圖之前,spring會將模型數據存入request作用域
-
視圖取出模型數據,渲染爲html頁面後作爲響應返回給客戶端
-
-
集合面試題
-
ArrayList與Vectory的區別?
答: 1.Vector是線程安全的,源碼中有很多的synchronized可以看出,比方說add()方法就是用synchronized進行修飾的,而ArrayList不是。導致Vector效率無法和ArrayList相比;
2.ArrayList和Vector都採用線性連續存儲空間,當存儲空間不足的時候,ArrayList默認增加爲原來的50%,Vector默認增加爲原來的一倍;
3.Vector可以設置capacityIncrement,而ArrayList不可以,因爲Vector比ArrayList多了一個構造方法,設置增長容量參數的方法。
-
ArrayList的底層實現原理是什麼?
答: 1.ArrayList 通過數組實現,一旦我們實例化 ArrayList 無參數構造函數默認爲數組初始化長度爲 10,底冊是一個Object數組
2.add 方法底層實現如果增加的元素個數超過了 10 個,那麼 ArrayList 底層會新生成一個數組,長度爲原數組的 1.5 倍+1,然後將原數組的內容複製到新數組當中,並且後續增加的內容都會放到新數組當中。當新數組無法容納增加的元素時,重複該過程。是一旦數組超出長度,就開始擴容數組。
它的特點是:查詢快,增刪慢,線程不安全,根據下標查詢一個數據的時間複雜度爲O(1),因爲它的底層是數組,所以在新增或者刪除元素的時候,需要進行元素的移動,增加了複雜度導致速度慢。
-
LinkedList底層實現原理是什麼?
答:LinkedList底層的數據結構是基於雙向循環鏈表的,且頭節點不存放數據,
它的特點是:增刪快,查詢慢,線程不安全,根據下標查詢一個數據的時間複雜度爲O(n),因爲它的底層是雙向循環鏈表,所以在新增或者刪除元素的時候,只需要將前目標元素的一個元素和後一個元素的地址改變即可,所以增刪速度快。
-
HashMap底層實現原理是什麼?
答:JDK1.7中,HashMap採用數組+鏈表 的方式實現,效率低,JDK1.8中,HashMap採用位桶+鏈表+紅黑樹實現,效率提升。線程不安全,可以有null的健和值。hashTable線程安全,不能有null的健和值,1.8之後使用CocurrentHashMap代替hashTable,提高的效率
最好自學一下dubbo、springcloud方面的東西。
最後希望大家對自己的職業有個路線規劃,這對你後面到職業生涯很重要,要走哪條路得慎重。如果對行業沒有要求對話,最好能進入互聯網公司,這對你的技術提升太大了,傳統行業能學到的只有業務,技術提升太窄