2016-08-29 上午 京東酒店機票部-3輪面試

今天上午去京東面試,通過了三輪面試最終仍是被(HR)告知 回家等消息吧.mysql

先說一下 各個 面試官都問了啥吧:linux

記性很差 我就不一一羅列了,就直接整理一下全部的問題吧.面試

1.先來個 排序算法 熱熱身算法

分析:sql

2.聊一下 併發庫相關,數據庫

2.1 說一下 線程安全地隊列數組

分析:ConcurrentLinkedQueue、ArrayBlockingQueue、LinkedBlockingQueue安全

2.2 說一下 線程安全的數據結構 本身知道的性能優化

分析:按照 不一樣的數據結構分類說服務器

數據結構 線程安全的實現類
map ConcurrentHashMap
ConcurrentSkipListMap
set ConcurrentSkipListSet
CopyOnWriteArraySet
list CopyOnWriteArrayList
queue ConcurrentLinkedQueue
ArrayBlockingQueue
LinkedBlockingQueue
LinkedTransferQueue
PriorityBlockingQueue
SynchronousQueue
deue ConcurrentLinkedDeque
LinkedBlockingDeque

2.3 說一下 AtomicInteger 的 實現(具體說一下 自增是怎麼實現的線程安全的)

分析:

public final int getAndIncrement() {

return unsafe.getAndAddInt(this, valueOffset, 1);

}

2.4 還問了一下SynchronousQueue,這個我沒回答好

分析:

3.map的實現

分析:

3.1hashmap的新節點是添加到什麼地方(鏈頭仍是鏈尾)

分析:這個題巨坑啊,還要分版本1.8以前都是添加到鏈表的頭部,1.8以後是添加到尾部

JDK7U79的版本table[bucketIndex] = new Entry<>(hash, key, value, e);

JDK8U60的版本p.next = newNode(hash, key, value, null);

4.2個FIFO隊列實現棧的效果,簡單來講就是abc逆序打印

分析:2個FIFO隊列分別是F1,F2

先把abc依次放到F1,再把ab依次取出並放回到F1,那麼F1的順序如今是bac,

將c放到F2,再將a取出放回F1,那麼F1如今的順序是ab,

再將ab依次從F1中取出放到F2,這時從F2取出的順序就是 c,b,a

5.sqlserver和mysql的區別

分析:

6.mysql中myisam和InnoDB在索引上的區別

分析:

MyISAM InnoDB
使用前綴壓縮技術是的索引更小 按照原數據格式進行存儲
經過數據的物理位置引用被索引的行 經過主鍵引用被索引的行
myisam記錄的直接是文件的offset InnoDB尋址要映射到塊,再到行
   
  自適應哈希索引,是系統對熱點索引
自動建立的內部行爲,
用戶沒法控制或者配置
   
   

6.1MySQL存儲引擎MyISAM與InnoDB的優劣(本身引伸出來的題)

  MyISAM InnoDB
存儲結構 每張表被存放在三個文件:frm-表格定義
MYD(MYData)-數據文件
MYI(MYIndex)-索引文件
全部的表都保存在同一個數據文件中(也多是多個文件,或者是獨立的表空間文件),InnoDB表的大小隻受限於操做系統文件的大小,通常爲2GB
存儲空間 MyISAM可被壓縮,存儲空間較小 InnoDB的表須要更多的內存和存儲,它會在主內存中創建其專用的緩衝池用於高速緩衝數據和索引
可移植性、備份及恢復 因爲MyISAM的數據是以文件的形式存儲,因此在跨平臺的數據轉移中會很方便。在備份和恢復時可單獨針對某個表進行操做 免費的方案能夠是拷貝數據文件、備份 binlog,或者用 mysqldump,在數據量達到幾十G的時候就相對痛苦了
事務安全 不支持 每次查詢具備原子性 支持 具備事務(commit)、回滾(rollback)和崩潰修復能力(crash recovery capabilities)的事務安全(transaction-safe (ACID compliant))型表
AUTO_INCREMENT MyISAM表能夠和其餘字段一塊兒創建聯合索引 InnoDB中必須包含只有該字段的索引
SELECT MyISAM更優  
INSERT   InnoDB更優
UPDATE   InnoDB更優
DELETE   InnoDB更優 它不會從新創建表,而是一行一行的刪除
COUNT without WHERE MyISAM更優。由於MyISAM保存了表的具體行數 InnoDB沒有保存表的具體行數,須要逐行掃描統計,就很慢了
COUNT with WHERE 同樣 同樣,InnoDB也會鎖表
只支持表鎖 支持表鎖、行鎖 行鎖大幅度提升了多用戶併發操做的新能。可是InnoDB的行鎖,只是在WHERE的主鍵是有效的,非主鍵的WHERE都會鎖全表的
外鍵 不支持 支持
FULLTEXT全文索引 支持 不支持 能夠經過使用Sphinx從InnoDB中得到全文索引,會慢一點

7.treemap實現原理,如何實現的有序

分析:以二叉樹實現treemap,內部組合compare來實現比較和排序,

8.mysql優化

分析:從幾個方面來談

數據庫引擎 InnoDB支持事務
數據庫字段選擇  
索引優化  
查詢性能優化  
分表分庫  
mysql服務器優化  
操做系統和硬件優化  
主從設置  
   
   

9.一個十億行記錄的文本,如何從中查詢是否含有某個字符串

分析:從網上搜到 有人說用

lucene

compass(我沒見過這個東西)

用搜索引擎進行搜索 。如:elasticsearch, solar。

10.查詢某個壓縮包中壓縮的文本文件中是否含有某個字符串

分析:

11.如何經過linux命令將一個文件傳輸到另一臺服務

分析:scp

12.問到了mq,不過我確實是沒作過也沒看過,因此就沒往下問

13.判斷鏈表有環

分析:

方案1:

遍歷鏈表中每個 節點,而後放到一個 hashmap(我面試當時說的是數組)中,而後key重複了就說明有環.

方案2:

參考下面代碼,利用temp2 步子大,跑得快,能夠 套temp1的圈,總會有碰到 的時候(這個時候不必定就是 交叉的那個環點).

public static boolean hasLoop(Node n) {

// 定義兩個指針tmp1,tmp2

Node tmp1 = n;

Node tmp2 = n.next;

while (tmp2 != null) {

tmp1 = tmp1.next; // 每次迭代時,指針1走一步,指針2走兩步

tmp2 = tmp2.next.next;

if (tmp2 == null)

return false;// 不存在環時,退出

int d1 = tmp1.val;

int d2 = tmp2.val;

if (d1 == d2)

return true;// 當兩個指針重逢時,說明存在環,不然不存在。

}

return true; // 若是tmp2爲null,說明元素只有一個,也能夠說明是存在環

}

14.寫一段sql,實現相似於if else的功能,好比判斷是否含有某條記錄,有則更新,無則追加.

分析:這個須要用到存儲過程:

15.代碼審查,代碼走查等,工具

16.單元測試,Junit,mock

17.異常和錯誤的繼承關係,並說幾種運行時異常

分析:

18.dubbo服務提供者中的異常設置,消費者捕獲後如何處理

分析:

18.1根據不一樣狀況拋出不一樣的異常信息,包含自定義異常

18.2好比根據不一樣的自定義異常來判斷是否須要回滾或者重試等

相關文章
相關標籤/搜索