記一次電話面試的題目
昨天下午六點正準備關電腦下班去和物件約定好的地方吃飯的時候,突然接到了一個電話面試邀請,於是內心快速糾結了一下,還是同意了這次電話邀約(其實內心是拒絕的,但是轉念一想剛好通過這個電話面試對自己查漏補缺),聊了接近一個小時的通話,公司的人都走的差不多了。別的不多說了,下面就整理下面試題吧。(文末公佈下lz是怎麼解決晚飯······聰明的你們應該能猜到結局了)
1.自我介紹 2.為什麼離職
這些不關技術的事情我就不敘述了(把lz的經歷的公司都問了個遍,就問為什麼離職。。。好煎熬)
下面正式切入技術問題,只記了個大概,暫且寫出來,並附上答案(只是lz拙見,不做深入探討)。
3.集合HashMap、HashTable、ConcurrentHashMap區別
面試官:你瞭解集合嗎?
lz:瞭解呀!
面試官:說說HashMap、HashTable有什麼不同?
lz:首先最大的不同就是HashMap執行緒不安全,效率高、HashTable執行緒安全,效率低,還有HashMap允許k、v為null,HashTable不允許
面試官:HashTable為什麼是執行緒安全的?
lz:因為HashTable內部為所有的操作都加了同步鎖(synchronized)
面試官:為什麼加了synchronized鎖會導致效率降低?
lz:因為加了同步鎖(synchronized)其他執行緒再想訪問的話,必須等到前一個執行緒釋放了鎖才能使用。比如十個執行緒,只能一個一個排隊等候執行,所以效率會降低。
面試官:我們公司有些大資料量等需要用到HashTable,但又想保證執行效率,怎麼辦?還有其他可用的集合嗎?
lz:有啊ConcurrentHashMap。
面試官:ConcurrentHashMap是如何保證執行緒安全的?
lz:因為使用了分段鎖segment。
面試官:為什麼分段鎖比同步鎖效率高?
lz:分段鎖就是把Map分成了多個segment去處理,進行put操作時,根據hashcode找到相應的鎖,彼此之間不受影響,所以效率高。而同步鎖--鎖住的是整個HashTable,因此效率會低。
面試官:知道HashMap的實現原理嗎?瞭解hash碰撞嗎?
lz:HashMap是一個數組+連結串列的資料結構。採用hashing原理,在進行put 操作時根據Key計算出它的hashcode,根據hashcode找到相應的桶的位置。在進行get 時也是根據hashcode 找到相應位置的資料的。當發生hash碰撞時,即hashcode相同。那麼會在相應的桶中形成一個連結串列結構進行儲存。
4.如何保證訂單重複提交的問題(當發生網路延遲等情況)
lz:樓主只回答了前端校驗和後端校驗具體其他操作不是很清楚,下面答案引用自百度百科只列舉幾個經典的(力爭為園友提交較可信的答案)
更詳細的答案可以參考:http://www.bkjia.com/jingyan/471187.html
1:在前端進行校驗,當表單提交後,把提交按鈕置灰
2:表單提交後進行頁面重定向,轉到處理結果頁面。
3:在session中存放一個識別符號(當表單資料被請求時,在session中生成一個識別符號放在表單隱藏域中,當後端處理表單資料時,檢查識別符號是否存在,如果存在則表明第一次提交併從session中清除標識,如果不存在則表明重複提交)
4:在資料中新增約束
5.防止訂單重複支付問題
lz:我們公司的支付都是跳到微信或支付寶的(--把此問題拋給了騰訊和阿里);但是我們自己應該也能想到一種解決方法:就是同一筆訂單我們可以設定它的支付狀態。
更詳細的答案可參考:https://www.jianshu.com/p/530228b71888
6.Spring原理(Ioc、Aop、動態代理)
lz:Ioc呢就是不需要我們手動建立new物件,把這個動作交給了Spring容器去管理,大大降低了程式的耦合度。
Aop採用的就是動態代理的技術來實現切面程式設計的。
面試官:djk動態代理和cglib動態代理有什麼不同?
lz:JDK只能代理實現了介面的類,cglib採用繼承的方式 兩種類都可以代理。(注意final類和靜態方法是不能被代理的,因此aop也不能織入靜態方法)
7.對事物瞭解多少(主要是特性、傳播機制、隔離級別)
lz:事物主要的特性就是:原子性、一致性、隔離性、永久性
隔離級別:default資料庫預設的隔離級別、未提交讀、已提交讀、重複讀、序列化。
傳播特性:PROPAGATION_REQUIRED 、PROPAGATION_SUPPORTS 、PROPAGATION_MANDATORY、PROPAGATION_REQUIRES_NEW、PROPAGATION_NOT_SUPPORTED、PROPAGATION_NEVER、PROPAGATION_NESTED;
具體請參考:https://blog.csdn.net/weixin_38070406/article/details/78157603
lz拋個問題 :假如一個沒有事務的方法呼叫了有事務的方法然後有事務的方法又呼叫了其他無事務的方法。那麼請問事務還生效嗎?(歡迎留言評論)
8.SQL/">MySQL索引
lz:主鍵索引、唯一索引、普通索引、組合索引
具體請參考:https://blog.csdn.net/goodsave/article/details/78018174
再拋個問題 :假如表中建立了一個組合索引(name、city、age)當查詢時採用city、age時索引生不生效?
9.資料庫執行計劃
lz:具體一些細節就是怎麼優化sql、還有檢視sql語句效能,當然就是採用執行計劃(explain)的方式了。
具體可參考:https://blog.csdn.net/wangpeng047/article/details/12849331
10.執行緒池
lz:主要就是ThreadPoolExecutor類的使用建構函式,4種建構函式裡各引數代表的意思。
corePoolSize:核心池大小
maximumPoolSize:執行緒池最大執行緒數。
keepAliveTime:執行緒沒有任務執行時最多存活時間。
unit:為keepAliveTime設定時間的單位。
還有幾種常見的執行緒池: newFixedThreadPool、 newSingleThreadExecutor、 newCachedThreadPool、newScheduledThreadPool
具體執行緒資料可參考:
https://www.cnblogs.com/dolphin0520/p/3932921.html
https://www.cnblogs.com/superfj/p/7544971.html
好了,目前lz只能記得這麼多了,所以就寫到這吧。(還有一些lz做的模組的細碎問題也不贅述)
ps: 最後lz完美的錯過了飯局,自己一個人隨便吃了點飯,然後等著物件一起愉快的回家了