java面試——2021校招提前批次招商網絡科技視頻二面問題

1 你的什麼專業?在你的專業方向做了什麼工作?,主要是在研究生做了哪些工作?做了哪些課題?

2 大數據的相關組件你瞭解嗎?

hadoop 的原理  Flume的原理 ……一些大數據相關的組件的原理。

3 sleep()和wait的區別?

這兩個方法來自不同的類分別是Thread和Object  。

最主要是sleep方法沒有釋放鎖,而wait方法釋放了鎖,使得其他線程可以使用同步控制塊或者方法(鎖代碼塊和方法鎖)。

wait,notify和notifyAll只能在同步控制方法或者同步控制塊裏面使用,而sleep可以在任何地方使用(使用範圍)  。

sleep必須捕獲異常,而wait,notify和notifyAll不需要捕獲異常  。

4 Currenthashmap的的原理和底層實現

ConcurrentHashMap 和 HashMap 思路是差不多的,但是因爲它支持併發操作,所以要複雜一些。整個 ConcurrentHashMap 由一個個 Segment 組成, Segment 代表”部分“或”一段“的意思,所以很多地方都會將其描述爲分段鎖。注意,行文中,我很多地方用了“槽”來代表一個segment。ConcurrentHashMap 是一個Segment數組Segment 通過繼承ReentrantLock 來進行加鎖,所以每次需要加鎖的操作鎖住的是一個segment,這樣只要保證每個 Segment 是線程安全的,也就實現了全局的線程安全。JDk1.7的時候

JDK1.8在JDK1.8中,放棄了Segment臃腫的設計,取而代之的是採用Node + CAS + Synchronized來保證併發安全進行實現,synchronized只鎖定當前鏈表或紅黑二叉樹的首節點,這樣只要hash不衝突,就不會產生併發,效率又提升N倍。

5 Redis的持久化操作和原理以及實現操作

redis提供兩種方式進行持久化,一種是RDB持久化(原理是將Reids在內存中的數據庫記錄定時 dump到磁盤上的RDB持久化),另外一種是AOF(append only file)持久化(原理是將Reids的操作日誌以追加的方式寫入文件)

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

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

 

AOF

RDB

優點

1AOF 可以更好的保護數據不丟失,一般 AOF 會每隔 1 秒,通過一個後臺線程執行一次fsync操作,最多丟失 1 秒鐘的數據

2AOF 日誌文件以 append-only 模式寫入,所以沒有任何磁盤尋址的開銷,寫入性能非常高,而且文件不容易破損,即使文件尾部破損,也很容易修復。

3AOF 日誌文件即使過大的時候,出現後臺重寫操作,也不會影響客戶端的讀寫.

4AOF 日誌文件的命令通過非常可讀的方式進行記錄,這個特性非常適合做災難性的誤刪除的緊急恢復。

1RDB 會生成多個數據文件,每個數據文件都代表了某一個時刻中 redis 的數據,這種多個數據文件的方式,非常適合做冷備,可以將這種完整的數據文件發送到一些遠程的安全存儲上去

2RDB 對 redis 對外提供的讀寫服務,影響非常小,可以讓 redis 保持高性能

3相對於 AOF 持久化機制來說,直接基於 RDB 數據文件來重啓和恢復 redis 進程,更加快速。

缺點

1對於同一份數據來說,AOF 日誌文件通常比 RDB 數據快照文件更大

2AOF 開啓後,支持的寫 QPS 會比 RDB 支持的寫 QPS 低AOF 這種較爲複雜的基於命令日誌 / merge / 回放的方式,比基於 RDB 每次持久化一份完整的數據快照文件的方式

1如果想要在 redis 故障時,儘可能少的丟失數據,那麼 RDB 沒有 AOF 好

2RDB 每次在 fork 子進程來執行 RDB 快照數據文件生成的時候,如果數據文件特別大,可能會導致對客戶端提供的服務暫停數毫秒,或者甚至數秒。

6 對併發和並行的理解?

併發(concurrency)

指宏觀上看起來兩個程序在同時運行,比如說在單核cpu上的多任務。但是從微觀上看兩個程序的指令是交織着運行的,你的指令之間穿插着我的指令,我的指令之間穿插着你的,在單個週期內只運行了一個指令。這種併發並不能提高計算機的性能,只能提高效率

並行(parallelism)

指嚴格物理意義上的同時運行,比如多核cpu,兩個程序分別運行在兩個核上,兩者之間互不影響,單個週期內每個程序都運行了自己的指令,也就是運行了兩條指令。這樣說來並行的確提高了計算機的效率。所以現在的cpu都是往多核方面發展。
簡單理解

併發:一個處理器可以同時處理多個任務。這是邏輯上的同時發生。

並行:多個處理器同時處理多個不同的任務。這是物理上的同時發生。

7 數據庫的表的相關的連接操作?

內連接:兩個表格的的交集

外連接:兩個表格數據的並集

左連接:左邊表格的全部數據的連接右邊的相匹配的數據

右連接:右邊表格的全部數據的連接左邊的相匹配的數據

8 Union 和union All的相關的區別?

UNION 並集,表中的所有數據,並且去除重複數據(工作中主要用到的是這個);

UNION ALL,表中的數據都羅列出來;

9 java裏面cylicbarrier和countdownlunch,區別?是如何使用的?實現代碼?

 

10 利用java來實現的阻塞隊列的代碼

public class MyBlockQueue<T> {
    //push鎖
    private final static Object pushLock = new Object();
    //pop鎖
    private final static Object popLock = new Object();

    //數據存儲
    private Stack<T> stack;
    //隊列最大長度
    private  int maxSize = 0;
    //隊列最小長度
    private int minSize = 0;
    public MyBlockQueue(int size) {
        this.maxSize = size;
        stack = new Stack<T>();
    }

    public synchronized void push(T t) {
        if(stack.size() >= maxSize) {
            pushLock();
        }
        stack.push(t);
        popUnLock();
    }

    public synchronized T pop() {

        if(stack.size() == minSize) {
            popLock();
        }
        T t = stack.pop();
        pushUnLock();
        return t;
    }

    private void pushLock() {
        synchronized (pushLock) {
            try {
                pushLock.wait();
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    }

    private void pushUnLock() {
        synchronized (pushLock) {
            pushLock.notify();
        }
    }

    private  void popLock() {
        synchronized (popLock) {
            try {
                popLock.wait();
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    }

    private void  popUnLock() {
        synchronized (popLock) {
            popLock.notify();
        }
    }

}

11實現二叉樹的翻轉的實現

/**
 * Definition for a binary tree node.
 * public class TreeNode {
 *     int val;
 *     TreeNode left;
 *     TreeNode right;
 *     TreeNode(int x) { val = x; }
 * }
 */

class Solution {
    public TreeNode invertTree(TreeNode root) {
        //遞歸終止的條件
        if(root==null){
            return null;
        }
        //遞歸的過程是
        invertTree(root.left);
        invertTree(root.right);
        //翻轉實現
        TreeNode temp=root.right;
        root.right=root.left;
        root.left=temp;
        return root;
    }
}

12 併發的相關的問題的原理?

……

13 java 中的IO 和NIO 和AIO的原理和區別?

BIO (Blocking I/O): 同步阻塞I/O模式,數據的讀取寫入必須阻塞在一個線程內等待其完成。在活動連接數不是特別高(小於單機1000)的情況下,這種模型是比較不錯的,可以讓每一個連接專注於自己的 I/O 並且編程模型簡單,也不用過多考慮系統的過載、限流等問題。線程池本身就是一個天然的漏斗,可以緩衝一些系統處理不了的連接或請求。但是,當面對十萬甚至百萬級連接的時候,傳統的 BIO 模型是無能爲力的。因此,我們需要一種更高效的 I/O 處理模型來應對更高的併發量。

NIO (New I/O): NIO是一種同步非阻塞的I/O模型,在Java 1.4 中引入了NIO框架,對應 java.nio 包,提供了 Channel , Selector,Buffer等抽象。NIO中的N可以理解爲Non-blocking,不單純是New。它支持面向緩衝的,基於通道的I/O操作方法。 NIO提供了與傳統BIO模型中的 Socket 和 ServerSocket 相對應的 SocketChannel 和 ServerSocketChannel 兩種不同的套接字通道實現,兩種通道都支持阻塞和非阻塞兩種模式。阻塞模式使用就像傳統中的支持一樣,比較簡單,但是性能和可靠性都不好;非阻塞模式正好與之相反。對於低負載、低併發的應用程序,可以使用同步阻塞I/O來提升開發速率和更好的維護性;對於高負載、高併發的(網絡)應用,應使用 NIO 的非阻塞模式來開發

AIO (Asynchronous I/O): AIO 也就是 NIO 2。在 Java 7 中引入了 NIO 的改進版 NIO 2,它是異步非阻塞的IO模型。異步IO 是基於事件和回調機制實現的,也就是應用操作之後會直接返回,不會堵塞在那裏,當後臺處理完成,操作系統會通知相應的線程進行後續的操作。AIO 是異步IO的縮寫,雖然 NIO 在網絡操作中,提供了非阻塞的方法,但是 NIO 的 IO 行爲還是同步的。對於 NIO 來說,我們的業務線程是在 IO 操作準備好時,得到通知,接着就由這個線程自行進行 IO 操作,IO操作本身是同步的。查閱網上相關資料,我發現就目前來說 AIO 的應用還不是很廣泛,Netty 之前也嘗試使用過 AIO,不過又放棄了。

14 攔截器 過濾器的原理  有什麼區別?怎麼配置?

 

15 反問環節:

我問他對我的面試評價,他是叫我猜。然後笑笑說,這個東西我不做評價了。後面的結果會通知到你的。那個時候就知道你的評價了。

面試總結:

1java的基礎中的那幾個關鍵字和一些詞語的區別和理解

          類 多態 抽象類 接口  併發問題的關鍵字的理解和原理…………

2併發編程的中的原理和簡單實現

3 手寫代碼一般都是leetcode的簡單的一定要手寫一次成功。不能在IDEA中的寫,難度是簡單的就行。

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