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中的寫,難度是簡單的就行。