1. 程式人生 > 其它 >【粉絲投稿】映客java崗補招兩輪面試題+答案分享

【粉絲投稿】映客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, 原始碼分析,高併發、高效能、分散式,效能優化,微服務 高階架構開發等等,點選這裡免費獲取。
在這裡插入圖片描述