【粉絲投稿】映客java崗補招兩輪面試題+答案分享
技術標籤:java技術分享面試專題java演算法java面試redis程式語言
前言
8.25就投遞了,秋招沒拿到面試機會。補招從筆試->一面->二面。
看到是補招,就想著面著看看。
筆試選擇+4演算法+1問答
60min時間不夠所以演算法做的不是很好,但感覺演算法難度不大
一面:
1、資料庫
1.innodb myisam 的區別
MySQL5.5.5以後,InnoDB是預設引擎,因為innodb適合更多業務場景,原因是i nnoDB支援事務,支援外來鍵。
除此之外:
鎖:innodb行鎖,myisam表鎖
索引:innodb採用聚簇索引+輔助索引,myisam才用非聚簇索引(即:主鍵和非主鍵索引的查詢速度區別不大
補充(我沒答上來的):
全文索引
MyISAM支援FULLTEXT型別的全文索引
InnoDB不支援FULLTEXT型別的全文索引,但是InnoDB可以使用sphinx外掛支援全文索引,並且效果更好
主鍵
MyISAM允許沒有任何索引和主鍵的表存在,索引都是儲存行的地址
InnoDB如果沒有設定主鍵或非空唯一索引,就會自動生成一個6位元組的主鍵,資料是主索引的一部分,附加索引儲存的是主索引的值
2、redis
redis為什麼快?(和mysql比)
- 它是單執行緒(6.0之前),沒有程序競爭,鎖等設定,所以少了切換上下文的時間,相對快了很多。
- 同時,資料儲存在記憶體中,他可以快速處理資料。
- 同時,它又是epoll的多路複用模式,非同步的讀取資訊,自己要進行的邏輯處理也相對很少。並且可以涉及單機多redis,充分利用其他cpu核心。
mysql就是基於磁碟+B加樹咯
redis常見資料結構以及使用場景
string,儲存json、照片、視訊等各種各種可序列化的物件。
list, 如果對訊息的可靠性沒有較高的要求的話,那麼就可以使用Redis去實現訊息佇列。
map,二級對映,儲存物件更直觀。
set,元素不重複又在記憶體,可以做合併資料等
zset,排行榜
推薦的以前關注的公眾號博主敖丙的redis文章咯 ,裡面挺詳細的
3、設計模式
問了工廠模式和職責鏈模式
工廠模式:簡單工廠、工廠方法、抽象工廠
動機:
工廠裡提供很多方法,不同方法新建不同物件
看了很多解釋我的總結有以下幾點:
1、減去繁瑣的new工作,統一讓工廠建立物件
2、軟體系統中經常面臨物件的建立工作,由於需求的變化,這個物件可能也隨之發生變化,但他卻擁有比較穩定的介面。需要提供一種封裝機制來隔離出這個易變物件的變化,從而保持系統中其他依賴該物件的物件不隨之需求變化而變化。
其次:
三個工廠模式,各有千秋
從簡單工廠模式——》工廠方法模式,解決了對產品的拓展不符合OCT原則的問題
從工廠方法模式——》抽象工廠模式,解決了一個過程只能生產一個產品的問題
但是反而多了一個問題,部分不符合OCT原則的問題,對工廠的拓展符合OCT,但是每次要拓展一個產品,就要修改一次工廠裡面的方法
職責鏈模式:
類似踢皮球,往職責鏈上一甩,誰有能力誰處理
https://www.runoob.com/design-pattern/chain-of-responsibility-pattern.html
這種直接看菜鳥教程,我這裡沒有問原始碼,涉及原始碼就要花時間研究了
4、一道演算法,前序遍歷二叉樹,要非遞迴寫
class Solution {
List<Integer> list = new ArrayList<Integer>();
public List<Integer> preorderTraversal(TreeNode root) {
if(root == null)
return list;
Stack<TreeNode> stack= new Stack<>();
stack.push(root);
while(!stack.isEmpty()){
TreeNode tree = stack.pop();
list.add(tree.val);
if(tree.right != null){
stack.push(tree.right);
}
if(tree.left != null){
stack.push(tree.left);
}
}
return list;
}
}
注意這裡有個坑,root為空要返回一個空的arraylist
這題是leetcode 144
“能接受轉GO嗎”
能
一面40分鐘,基本從專案展開就問技術
二面
自我介紹
“你自我介紹說嚮往我們公司,那你對我們公司有什麼瞭解”
“你在實習幹了啥”
“ab怎麼做的,你瞭解嗎”
“聊開發專案”
“鎖是怎麼做的”
我一開始說作業系統的那些什麼共享記憶體 ,對鎖有死鎖檢測、死鎖避免、死鎖處理。還有四個條件什麼的
他說這是程序的,執行緒鎖怎麼做
我就說JAVA執行緒的話,synchronized 訊號量 阻塞佇列這些已經有執行緒api
“專案執行緒安全的理解”
專案裡面的,我說了concurrenthashmap,我太久沒看程式碼忘了 想了很久說的不好。
“那邊實習 為啥不打算留下來”
“你手裡有幾個offer”
還有一個最難的題目,“一個tcp的 ping命令10ms,http請求多少ms”
我亂分析一通,說ping基於icmp,是網路層已經是很底層了,http是應用層,http先是是不是就tcp三次握手 所以 30ms。
他說不是,後面反問環節,我問他這個問題的答案,他說思路沒錯,可以仔細看一下三次握手,有優化,不需要那麼久。
沒有撕演算法
總結
兩輪兩個面試官挺好的,
很尊重人,一面面試官反問是說:“您這邊還有什麼問題嗎?”注意是“您”
二面面試官,他說我說話的時候不知道是不是因為緊張,可能是有點急促什麼的吧,問我平時是不是這樣,我說,是。害,應該多練練。思路清晰就不緊張了
另外,我在專案介紹說的都不是很好,得回去再看看以前的程式碼了~
最後我為大家準備了一些Java架構學習資料,學習技術內容包含有:Spring,Dubbo,MyBatis, RPC, 原始碼分析,高併發、高效能、分散式,效能優化,微服務 高階架構開發等等,點選這裡免費獲取。