去哪兒網面經

連接:https://www.nowcoder.com/discuss/113837
 html

一面:

歷來沒有那麼流利的回答過面試官的問題!大部分都是面試官一說,我立刻答出來,以致於我稍微有點停頓的時候,面試官立刻說:你別急,先想一想!(其實我只是說累!)java

問題比較多!記不太清了!面試

 

一、HashMap 內部結構、put操做流程

https://blog.csdn.net/strawqqhat/article/details/88667705redis

二、手寫反轉鏈表

https://blog.csdn.net/strawqqhat/article/details/88668713算法

三、手寫快排(因爲我貝殼面試的時候,面試官說我代碼寫得慢!而後此次我寫得賊快!面試官廁所都沒上完我就寫完了……,而後面試官說你寫得這麼快啊!我心裏一頓竊喜!)

https://blog.csdn.net/strawqqhat/article/details/88669225數據庫

四、ThreadLocal

ThreadLocal用於保存某個線程共享變量:對於同一個static ThreadLocal,不一樣線程只能從中get,set,remove本身的變量,而不會影響其餘線程的變量。數組

一、ThreadLocal.get: 獲取ThreadLocal中當前線程共享變量的值。瀏覽器

二、ThreadLocal.set: 設置ThreadLocal中當前線程共享變量的值。緩存

三、ThreadLocal.remove: 移除ThreadLocal中當前線程共享變量的值。安全

四、ThreadLocal.initialValue: ThreadLocal沒有被當前線程賦值時或當前線程剛調用remove方法後調用get方法,返回此方法值。

五、線程池

https://blog.csdn.net/strawqqhat/article/details/88670869

六、垃圾回收器

https://blog.csdn.net/strawqqhat/article/details/86434313#GC%E6%9C%BA%E5%88%B6%E8%AE%B2%E4%B8%80%E8%AE%B2

七、redis特色、應用場景等……

https://blog.csdn.net/strawqqhat/article/details/88671013

八、緩存一致性問題(這題我特意溫習了一遍!,可是當時一時短路,回答的不是很好,面試官給我解釋了一下)

https://blog.csdn.net/strawqqhat/article/details/88673373

九、Linux關於查找日誌的命令!(這題只要求我說出能想出什麼命令,我很久沒碰Linux了,怎麼可能記得!只大概說了幾個)

1.查看日誌經常使用命令

    tail:  

       -n  是顯示行號;至關於nl命令;例子以下:

            tail -100f test.log      實時監控100行日誌

            tail  -n  10  test.log   查詢日誌尾部最後10行的日誌;

            tail -n +10 test.log    查詢10行以後的全部日誌;

    head:  

        跟tail是相反的,tail是看後多少行日誌;例子以下:

            head -n 10  test.log   查詢日誌文件中的頭10行日誌;

            head -n -10  test.log   查詢日誌文件除了最後10行的其餘全部日誌;

    cat: 

        tac是倒序查看,是cat單詞反寫;例子以下:

            cat -n test.log |grep "debug"   查詢關鍵字的日誌

 

2. 應用場景一:按行號查看---過濾出關鍵字附近的日誌

     1)cat -n test.log |grep "debug"  獲得關鍵日誌的行號

     2)cat -n test.log |tail -n +92|head -n 20  選擇關鍵字所在的中間一行. 而後查看這個關鍵字前10行和後10行的日誌:

            tail -n +92表示查詢92行以後的日誌

            head -n 20 則表示在前面的查詢結果裏再查前20條記錄

 

3. 應用場景二:根據日期查詢日誌

      sed -n '/2014-12-17 16:17:20/,/2014-12-17 16:17:36/p'  test.log

      特別說明:上面的兩個日期必須是日誌中打印出來的日誌,不然無效;

                      先 grep '2014-12-17 16:17:20' test.log 來肯定日誌中是否有該 時間點

 

4.應用場景三:日誌內容特別多,打印在屏幕上不方便查看

    (1)使用more和less命令,

           如: cat -n test.log |grep "debug" |more     這樣就分頁打印了,經過點擊空格鍵翻頁

    (2)使用 >xxx.txt 將其保存到文件中,到時能夠拉下這個文件分析

            如:cat -n test.log |grep "debug"  >debug.txt

十、應用題(我感受能問到這題一面基本都過了吧,我項目經驗比較少,面試官沒有爲難我)

面試官很友善!!!

 

二面:

難度又上升了一個檔次!有些題目磕磕絆絆的說出來了,多是由於一面面試官對個人評價高(特指Java基礎!!!)。

二面面試官以後也只是「對我項目經驗的的評價不是很高」(出自HR之口,意思就是你項目經驗真的垃圾!!!)

二面面試官給我一種大佬即視感的感受!!由於我回答問題,我感受回答完了!他總會說一句還有呢……我內心就在想,還有什麼???

 

一、HTTP、HTTPS(如何保證安全)

1.理解http與https的概念

(1)HTTP:超文本傳輸協議 (HTTP-Hypertext transfer protocol),是互聯網上應用最爲普遍的一種網絡協議,是一種詳細規定了瀏覽器和萬維網服務器之間互相通訊的規則,經過因特網傳送萬維網文檔的數據傳送協議。用於從WWW服務器傳輸超文本到本地瀏覽器的傳輸協議,它可使瀏覽器更加高效,使網絡傳輸減小。

     HTTP的會出現的問題:http協議屬於明文傳輸協議,交互過程以及數據傳輸都沒有進行加密,通訊雙方也沒有進行任何認證,通訊過程很是容易遭遇劫持、監聽、篡改,嚴重狀況下,會形成惡意的流量劫持等問題,甚至形成我的隱私泄露(好比銀行卡卡號和密碼泄露)等嚴重的安全問題。

(2)HTTPS是以安全爲目標的HTTP通道,簡單講是HTTP的安全版,即HTTP下加入SSL層,HTTPS的安全基礎是SSL,所以加密的詳細內容就須要SSL。如今它被普遍用於萬維網上安全敏感的通信,例如交易支付方面。

    HTTPS協議能夠分爲兩種:一是經過創建一個信息安全通道,來保證數據傳輸的安全;二是經過確認網站的真實性。

HTTPS在HTTP的基礎上加入了SSL/TLS協議,依靠SSL證書來驗證服務器的身份,併爲客戶端和服務器端之間創建「SSL加密通道」,確保用戶數據在傳輸過程當中處於加密狀態,同時防止服務器被釣魚網站假冒,而HTTP協議沒法加密數據,全部通訊數據都在網絡中明文「裸奔」。經過網絡的一些技術手段,就可還原HTTP報文內容。

https與http的對比圖

 

2.簡要了解HTTP和HTTPS的區別?

(1)HTTP 是超文本傳輸協議,屬於明文傳輸協議,HTTPS 則是具備安全性的基於ssl加密的傳輸協議

(2)HTTP 和 HTTPS 使用的是鏈接方式不一樣,並且用的端口也不同,前者是80,後者是443。

(3)HTTP 是簡單的無狀態的鏈接。HTTPS 協議是由SSL+HTTP協議構建的可進行加密傳輸、身份認證的網絡協議 要比 HTTP 協議安全

(4)HTTPS 內容通過對稱加密,每一個鏈接生成一個惟一的加密密鑰(對稱祕鑰:對稱密鑰加密又叫專用密鑰加密,即發送和接收數據的雙方必使用相同的密鑰對明文進行加密和解密運算。)

(5)HTTPS 內容傳輸通過完整性校驗

3.HTTPS是如何保證數據的安全?

(1)客戶端向服務器端發起SSL鏈接請求;(在此過程當中依然存在數據被中間方盜取的可能,下面將會說明如何保證此過程的安全)

(2) 服務器把公鑰發送給客戶端,而且服務器端保存着惟一的私鑰

(3)客戶端用公鑰對雙方通訊的對稱祕鑰進行加密,併發送給服務器端

(4)服務器利用本身惟一的私鑰對客戶端發來的對稱祕鑰進行解密,在此過程當中,中間方沒法對其解密(即便是客戶端也沒法解密,由於只有服務器端擁有惟一的私鑰),這樣保證了對稱祕鑰在收發過程當中的安全,此時,服務器端和客戶端擁有了一套徹底相同的對稱祕鑰。

(5)進行數據傳輸,服務器和客戶端雙方用公有的相同的對稱祕鑰對數據進行加密解密,能夠保證在數據收發過程當中的安全,便是第三方得到數據包,也沒法對其進行加密,解密和篡改。

 

二、HTTP請求和響應報文段(這塊不是很熟,說了一些出來)

https://www.jianshu.com/p/0015277c6575

三、手寫請求頭,響應頭!!!

http://www.javashuo.com/article/p-vzburiwl-ex.html

四、優先隊列數據結構

優先隊列原理與實現

  優先隊列是一種用來維護一組元素構成的結合S的數據結構,其中每一個元素都有一個關鍵字key,元素之間的比較都是經過key來比較的。優先隊列包括最大優先隊列和最小優先隊列,優先隊列的應用比較普遍,好比做業系統中的調度程序,當一個做業完成後,須要在全部等待調度的做業中選擇一個優先級最高的做業來執行,而且也能夠添加一個新的做業到做業的優先隊列中。Java中,PriorityQueue的底層數據結構就是堆(默認是小堆),關於Java的PriorityQueue更多知識請點擊:深刻理解Java PriorityQueue

  優先隊列的實現中,咱們能夠選擇堆數據結構,最大優先隊列能夠選用大堆,最小優先隊列能夠選用小堆來實現。下面以最大優先隊列來說解其原理。最大優先隊列通常包括將一個元素插入到集合S中、返回集合S中具備最大key的元素、返回並刪除集合S中具備最大key的元素等。

插入操做

  插入操做是將一個元素插入到集合S中,首先把該元素放入全部元素的下一位置,而後執行「上浮」操做,以下圖示例(注意,下圖示例是小堆,不過原理是同樣的,圖片來自深刻理解Java PriorityQueue)

)PriorityQueue_offer.png

移除操做

  優先隊列中,在隊列非空狀況下移除集合中第一個元素,也就是下標爲0的元素,而後將集合中最後一個元素移到下標爲0位置,在將下標爲0的新元素執行「下沉」操做。以下圖示例(注意,下圖示例是小堆,不過原理是同樣的,圖片來自深刻理解Java PriorityQueue)

PriorityQueue_poll.png

完整代碼實現

複製代碼

package priorityheap;

import java.util.Arrays;

/**
 * 優先隊列類(最大優先隊列)
 */
public class PriorityHeap {

    // ------------------------------ Instance Variables

    private int[] arr;
    private int size;

    // ------------------------------ Constructors

    /**
     * 優先隊列數組默認大小爲64
     */
    public PriorityHeap() {
        this(64);
    }

    public PriorityHeap(int initSize) {
        if (initSize <= 0) {
            initSize = 64;
        }
        this.arr = new int[initSize];
        this.size = 0;
    }

    // ------------------------------ Public methods

    public int max() {
        return this.arr[0];
    }

    public int maxAndRemove() {
        int t = max();

        this.arr[0] = this.arr[--size];
        sink(0, this.arr[0]);
        return t;
    }
    public void add(int data) {
        resize(1);
        this.arr[size++] = data;
        pop(size - 1, data);
    }

    // ------------------------------ Private methods

    /**
     * key下沉方法
     */
    private void sink(int i, int key) {
        while (2 * i <= this.size - 1) {
            int child = 2 * i;
            if (child < this.size - 1 && this.arr[child] < this.arr[child + 1]) {
                child++;
            }
            if (this.arr[i] >= this.arr[child]) {
                break;
            }

            swap(i, child);
            i = child;
        }
    }

    /**
     * key上浮方法
     */
    private void pop(int i, int key) {
        while (i > 0) {
            int parent = i / 2;
            if (this.arr[i] <= this.arr[parent]) {
                break;
            }
            swap(i, parent);
            i = parent;
        }
    }

    /**
     * 從新調整數組大小
     */
    private void resize(int increaseSize) {
        if ((this.size + increaseSize) > this.arr.length) {
            int newSize = (this.size + increaseSize) > 2 * this.arr.length ? (this.size + increaseSize) : 2 * this.arr.length;
            int[] t = this.arr;

            this.arr = Arrays.copyOf(t, newSize);
        }
    }

    /**
     * Swaps arr[a] with arr[b].
     */
    private void swap(int a, int b) {
        int t = this.arr[a];
        this.arr[a] = this.arr[b];
        this.arr[b] = t;
    }
}

 

五、紅黑樹和AVL樹的區別(這題我把紅黑樹的性質特色說出來了,可是沒答到點上,這題算是回答的最差的一題了)

http://www.javashuo.com/article/p-oztuweco-nq.html

六、說一下筆試題的思路

七、數據庫索引!!!

關於數據庫索引,相信你們用到最多的必定是數據庫設計和數據庫查詢,本篇深度解析一下數據庫索引的原理,涉及數據庫自己的設計原理,對設計應用的數據庫結構,和數據庫查詢也大有益處。

 

(一)在瞭解數據庫索引以前,首先了解一下數據庫索引的數據結構基礎,B+tree

B+tree 是一個n叉樹,每一個節點有多個葉子節點,一顆B+樹包含根節點,內部節點,葉子節點。根節點多是一個葉子節點,也多是一個包含兩個或兩個以上葉子節點的節點。

B+tree的性質:

1.n棵子tree的節點包含n個關鍵字,不用來保存數據而是保存數據的索引。

2.全部的葉子結點中包含了所有關鍵字的信息,及指向含這些關鍵字記錄的指針,且葉子結點自己依關鍵字的大小自小而大順序連接。

3.全部的非終端結點能夠當作是索引部分,結點中僅含其子樹中的最大(或最小)關鍵字。

B+tree結構原型圖大概以下(引用):

這裏還有一篇百度文庫文章能夠參考 http://wenku.baidu.com/link?url=qniQ1rpN8XOlbs4Vu6pjd_7YzVOGYxmBH0TeHLJTvwQ3Qs9Ig-FJyodXSaeBc3Ap7nC6Rm9qD6We5oJL-j7vnM4Ro5Y5J7yHwCk3asL_q5e

因爲B+tree的性質, 它一般被用於數據庫和操做系統的文件系統中。NTFS, ReiserFS, NSS, XFS, JFS, ReFS 和BFS等文件系統都在使用B+樹做爲元數據索引,由於B+ 樹的特色是可以保持數據穩定有序,其插入與修改擁有較穩定的對數時間複雜度(B+ 樹元素自底向上插入)。

(二)數據庫索引

數據庫索引是用於提升數據庫表的數據訪問速度的。

數據庫索引的特色:

a)避免進行數據庫全表的掃描,大多數狀況,只須要掃描較少的索引頁和數據頁,而不是查詢全部數據頁。並且對於非彙集索引,有時不須要訪問數據頁便可獲得數據。

b)彙集索引能夠避免數據插入操做,集中於表的最後一個數據頁面。

c)在某些狀況下,索引能夠避免排序操做。

數據庫索引的存儲方式,類型,在運行時的操做原理,我製做成了下圖:

 

八、線程池實現原理

https://blog.csdn.net/strawqqhat/article/details/88680342

九、應用題,關於建索引(這題考察的是什麼來着,我忘記了!之前看面經的時候提到的一個算法)

 

還有不少題目,記不清了……由於真的問得太多了……

 

HR面:

我就說一點,與順豐HR相比,我感受去哪兒網HR的每一次點頭都是對個人承認,順豐HR多是習慣性點頭……

HR還跟我說了,關於我表述時口頭禪的問題……這點特別很差,你們要注意!

相關文章
相關標籤/搜索