字節跳動面試總結-3.18

字節跳動面試總結

字節跳動是全球第一家將人工智能應用到主產品的科技公司。全系產品矩陣包括今日頭條、抖音、西瓜視頻、火山小視頻、TopBuzz、Faceu激萌、圖蟲、懂車帝等多款產品。截止2019年1月,字節跳動旗下全線產品日活超過6億,月活超過10億。字節跳動也在積極進行國際化部署,產品覆蓋150多個國家和地區,75個語種,在40多個國家和地區排在應用商店總榜前列。

在這裏插入圖片描述

面試信息

  • 面試崗位:Java後臺開發實習生
  • 面試形式:牛客平臺視頻面試

考察內容

我們主要考察通用型的業務問題和過往的項目經歷
價值觀和軟性技能也是我們選擇人才的重要因素

  • 設計模式
  • SSM
  • 分佈式
  • 系統設計
  • 項目
  • Java基礎&多線程&JVM
  • 操作系統
  • 計算機網絡
  • 數據庫
  • 數據結構與算法

第一輪

1.瞭解Java內存結構嗎?

Java程序執行的流程

  • Java源代碼文件(.java)會被Java編譯器編譯爲字節碼文件(.class),由Java虛擬機中的類加載器加載各個類的字節碼文件,加載完畢之後,交由JVM執行引擎執行。

  • 在整個程序執行過程中,JVM會用一段空間來存儲程序執行期間需要用到的數據和相關信息,這段空間一般被稱作爲Runtime Data Area(運行時數據區),也就是我們常說的JVM內存。

  • 因此,在Java中我們常常說到的內存管理就是針對這段空間進行管理(如何分配和回收內存空間)。
    在這裏插入圖片描述
    運行時數據區分爲幾個部分

  • 根據JVM規範,JVM內存共分爲虛擬機棧、堆、方法區、程序計數器、本地方法棧五個部分。

名稱 特徵 作用
程序計數器 佔用內存小,線程私有,生命週期於線程相同 字節碼行號指示器
虛擬機棧 線程私有,生命週期與線程相同,使用連續的內存空間 Java方法執行的內存模型,存儲局部變量表、操作棧、動態鏈接、方法出口等信息
線程共享,生命週期與虛擬機相同,可以不使用連續的內存地址 保存對象實例,所有對象實例(包括數組)都要在堆上分配
方法區 線程共享,生命週期與虛擬機相同,可以不使用連續的內存地址 存儲已被虛擬機加載的類信息、常量、靜態變量、即時編譯器編譯的代碼
運行時常量池 方法區的一部分,具有動態性 存放字面量及符號引用

在這裏插入圖片描述

2.HTTP狀態碼有幾種?

  • HTTP:超文本傳輸協議,定義了客戶端與服務器端通信時,發送數據的格式

  • HTTP的特點

    1. 基於TCP/IP的高級協議
    2. 默認端口號:80
    3. 基於請求/響應模型:一次請求對應一次響應
    4. 無狀態性:每次請求之間相互獨立,不能交互數據
  • 版本區別:

    • 1.0:每次請求都會建立新的連接
    • 1.1:複用連接
  • HTTP狀態碼:

    當用戶訪問一個網頁時,瀏覽器會向服務器發出請求。當瀏覽器接收並顯示網頁前,網頁所在服務器會返回包含HTTP狀態碼的信息頭,用以響應瀏覽器的請求。

    • 200-請求成功
    • 301-資源被永久轉移到其他服務器
    • 404-請求資源不存在
    • 500-服務器內部錯誤
分類 描述
1** 信息,服務器收到請求,需要繼續執行操作
2** 成功,操作被成功接收並處理
3** 重定向,需要進一步的操作以完成請求
4** 客戶端錯誤,請求包含語法錯誤或無法完成請求
5** 服務器錯誤,服務器在處理請求的過程中發生了錯誤

3.TCP/IP 四層模型

編號 名稱 描述 協議
4 應用層 提供應用程序之間的通信 HTTP,FTP,SMTP
3 傳輸層 建立主機之間端到端的連接 TCP,UDP
2 網絡層 尋址和路由選擇 IP,ICMPARP
1 網絡接口層 提供介質訪問、鏈路管理 各種物理通信接口

4.TCP和UDP的區別

區別項 TCP UDP
協議 面向字節流傳輸協議 面向報文傳輸協議
可靠性 可靠 不可靠
連接性 面向連接 無連接
報文 面向字節流 面向報文
雙工性 全雙工 一對一、一對多、多對一、多對多
流量控制 滑動窗口
擁塞控制 滿開始,擁塞避免;快重傳,快恢復

5.MySQL數據庫引擎

數據庫存儲引擎是數據庫底層軟件組織,數據庫管理系統使用數據引擎進行創建、更新、查詢、刪除數據。不同的存儲引擎提供不同的存儲機制、索引技巧、鎖定水平等。

InnoDB存儲引擎

InnoDB是事務型數據庫的首選引擎,支持事務安全表(ACID),支持行鎖定和外鍵,InnoDB是默認的MySQL引擎。

InnoDB主要特性有:

  1. InnoDB給MySQL提供了具有提交、回滾和崩潰恢復能力的事物安全(ACID兼容)存儲引擎。InnoDB鎖定在行級並且也在SELECT語句中提供一個類似Oracle的非鎖定讀。這些功能增加了多用戶部署和性能。在SQL查詢中,可以自由地將InnoDB類型的表和其他MySQL的表類型混合起來,甚至在同一個查詢中也可以混合.

  2. InnoDB是爲處理大數據量的最大性能設計。它的CPU效率可能是任何其他基於磁盤的關係型數據庫引擎鎖不能匹敵的.

  3. InnoDB存儲引擎完全與MySQL服務器整合,InnoDB存儲引擎爲在主內存中緩存數據和索引而維持它自己的緩衝池。InnoDB將它的表和索引在一個邏輯表空間中,表空間可以包含數個文件(或原始磁盤文件)。這與MyISAM表不同,比如在MyISAM表中每個表被存放在分離的文件中。InnoDB表可以是任何尺寸,即使在文件尺寸被限制爲2GB的操作系統

  4. InnoDB支持外鍵完整性約束,存儲表中的數據時,每張表的存儲都按主鍵順序存放,如果沒有顯示在表定義時指定主鍵,InnoDB會爲每一行生成一個6字節的ROWID,並以此作爲主鍵

  5. InnoDB被用在衆多需要高性能的大型數據庫站點上.InnoDB不創建目錄,使用InnoDB時,MySQL將在MySQL數據目錄下創建一個名爲ibdata1的10MB大小的自動擴展數據文件,以及兩個名爲ib_logfile0和ib_logfile1的5MB大小的日誌文件

MyISAM存儲引擎

MyISAM基於ISAM存儲引擎,並對其進行擴展。它是在Web、數據倉儲和其他應用環境下最常使用的存儲引擎之一。MyISAM擁有較高的插入、查詢速度,但不支持事務

MyISAM主要特性有:

  1. 大文件(達到63位文件長度)在支持大文件的文件系統和操作系統上被支持
  2. 當把刪除和更新及插入操作混合使用的時候,動態尺寸的行產生更少碎片。這要通過合併相鄰被刪除的塊,以及若下一個塊被刪除,就擴展到下一塊自動完成
  3. 每個MyISAM表最大索引數是64,這可以通過重新編譯來改變。每個索引最大的列數是16
  4. 最大的鍵長度是1000字節,這也可以通過編譯來改變,對於鍵長度超過250字節的情況,一個超過1024字節的鍵將被用上
  5. BLOB和TEXT列可以被索引
  6. NULL被允許在索引的列中,這個值佔每個鍵的0~1個字節
  7. 所有數字鍵值以高字節優先被存儲以允許一個更高的索引壓縮
  8. 每個MyISAM類型的表都有一個AUTO_INCREMENT的內部列,當INSERT和UPDATE操作的時候該列被更新,同時AUTO_INCREMENT列將被刷新。所以說,MyISAM類型表的AUTO_INCREMENT列更新比InnoDB類型的AUTO_INCREMENT更快
  9. 可以把數據文件和索引文件放在不同目錄
  10. 每個字符列可以有不同的字符集
  11. 有VARCHAR的表可以固定或動態記錄長度
  12. VARCHAR和CHAR列可以多達64KB

使用MyISAM引擎創建數據庫,將產生3個文件。文件的名字以表名字開始,擴展名之處文件類型:

  • frm文件存儲表定義
  • 數據文件的擴展名爲.MYD(MYData)
  • 索引文件的擴展名時.MYI(MYIndex)

MEMORY存儲引擎

MEMORY存儲引擎將表中的數據存儲到內存中,未查詢和引用其他表數據提供快速訪問。

MEMORY主要特性有:

  1. MEMORY表的每個表可以有多達32個索引,每個索引16列,以及500字節的最大鍵長度
  2. MEMORY存儲引擎執行HASH和BTREE縮影
  3. 可以在一個MEMORY表中有非唯一鍵值
  4. MEMORY表使用一個固定的記錄長度格式
  5. MEMORY不支持BLOB或TEXT列
  6. MEMORY支持AUTO_INCREMENT列和對可包含NULL值的列的索引
  7. MEMORY表在所由客戶端之間共享(就像其他任何非TEMPORARY表)
  8. MEMORY表內存被存儲在內存中,內存是MEMORY表和服務器在查詢處理時的空閒中,創建的內部表共享
  9. 當不再需要MEMORY表的內容時,要釋放被MEMORY表使用的內存,應該執行DELETE FROM或TRUNCATE TABLE,或者刪除整個表(使用DROP TABLE)

6.編程題

給出一個鏈表,每 N 個獨立做翻轉

案例輸入:a->b->c->d->e->f->g 3

案例輸出:c->b->a->f->e->d->g

第二輪

1.編程題

有一個廣告板,可以同時展示2個不同的廣告,現有4個廣告素材,要求展示的頻率是1:2:3:4,設計該展示算法

2.編程題

給定一組進程的起始結束時間,求同時在運行的最大進程數

start []int64

end []int64

1-10 5-15 16-20

3.編程題

有一個暗箱 裏面有手感相同的黑白球,分別爲M個白球 N個黑球。每次不放回的方式摸一個 摸到白球+1 摸到黑球-1。中途可以選擇停止,問最大期望得分是多少

4.編程題

實現獲取下一個排列的函數,算法需要將給定數字序列重新排列成字典序中下一個更大的排列。

如果不存在下一個更大的排列,則將數字重新排列成最小的排列(即升序排列)。

必須原地修改,只允許使用額外常數空間。

以下是一些例子,輸入位於左側列,其相應輸出位於右側列。
1,2,3 → 1,3,2
3,2,1 → 1,2,3

1,1,5 → 1,5,1

1,4,3,2

第三輪

1.線程輪流打印1,2,3,4和a,b,c,d

/**
 * 線程輪流打印1,2,3,4和a,b,c,d
 */
public class MultiThreadTest {
    public static void main(String[] args) {
        Object o = new Object();
        new Thread(new NumberRunnable(o)).start();
        new Thread(new CharRunnable(o)).start();
    }
}

class NumberRunnable implements Runnable {
    private Object obj;//聲明一個類的引用

    //通過構造器將共享資源傳進來
    public NumberRunnable(Object obj) {
        this.obj = obj;
    }

    public void run() {
        synchronized (obj) {
            for (int i = 0; i < 4; i++) {
                System.out.println(i + 1);
                obj.notifyAll();
                try {
                    obj.wait();
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
        }
    }
}

class CharRunnable implements Runnable {
    private Object obj;//聲明一個類的引用

    //通過構造器將共享資源傳進來
    public CharRunnable(Object obj) {
        this.obj = obj;
    }

    public void run() {
        synchronized (obj) {
            for (int i = 0; i < 4; i++) {
                char ch = (char) ('a' + i);
                System.out.println(ch);
                obj.notifyAll();
                try {
                    obj.wait();
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
        }
    }
}

2.垃圾回收機制

  • 什麼是垃圾回收機制

與C/C++相比,Java不需要程序員直接控制垃圾回收,內存分配與回收都是JVM自動進行的,JVM不定時回收不在使用的對象的內存空間

  • 爲什麼要進行垃圾回收?

隨着程序的運行內存中存在的實例對象、變量等信息佔據的內存越來越多,如果不及時進行垃圾回收,必然會帶來程序性能的下降,甚至會因爲可用的內存不足造成一些不必要的系統異常。

  • 哪些垃圾需要回收

如果某個對象不在引用,那麼它可以被回收

3.什麼時候進行垃圾回收

  • 引用計數算法(JDK1.2之前)

每個對象添加一個引用計數器,每被引用一次,計數器加一,失去引用,計數器減一。

當計數器在一段時間保持0時,該對象可以被回收。

缺點:當兩個對象A,B相互引用時,當兩個對象相互引用的時候,當其他所有的引用都消失後,A和B還有一個相互引用,計數器各爲1,而實際上兩個對象已沒有額外的相互引用,卻不會被回收

  • 可達性分析算法

該算法從離散數學的圖論中引入,程序把所有的引用關係看作一張圖,從一個結點GC Root開始,尋找對應的引用結點,找到這個結點後,繼續尋找這個結點的引用結點,當所有的引用結點尋找完畢後,剩餘的結點被認爲沒有被引用的結點,即無用的結點。

  • 可以作爲GC Root的對象
  1. 虛擬機棧中引用的對象(本地方法表)
  2. 方法區中靜態屬性引用的對象
  3. 方法區中常量引用的對象
  4. 本地方法棧中引用的對象(Native Object)
  • 引用的分類

    1. 強引用

      被New出來的對象所加的引用,它的特點就是永遠不會被GC,除非被設置爲NULL

    2. 軟引用

      非必須的引用,內存溢出之前進行回收。如果JVM內存並不緊張,這類對象可以不被回收,如果內存緊張,則會被回收。此處有一個問題,既然被引用爲軟引用的對象可以回收,爲什麼不去回收呢?其實我們知道,Java中是存在緩存機制的,就拿字面量緩存來說,有些時候,緩存的對象就是當前可有可無的,只是留在內存中如果還有需要,則不需要重新分配內存即可使用,因此,這些對象即可被引用爲軟引用,方便使用,提高程序性能。

    3. 弱引用

      第二次垃圾回收時回收。弱引用是在第二次垃圾回收時回收,短時間內通過弱引用取對應的數據,可以取到,當執行過第二次垃圾回收時,將返回null。
      弱引用主要用於監控對象是否已經被垃圾回收器標記爲即將回收的垃圾,可以通過弱引用的isEnQueued方法返回對象是否被垃圾回收器。

    4. 虛引用

      垃圾回收時回收,無法通過引用取到對象值。虛引用是每次垃圾回收的時候都會被回收,通過虛引用的get方法永遠獲取到的數據爲null,因此也被成爲幽靈引用。虛引用主要用於檢測對象是否已經從內存中刪除。

4.如何垃圾回收

  • 內存主要被分爲三塊,新生代、舊生代、持久代。三代的特點不同,導致所用的GC算法不同。
  • 新生代適合那些生命週期較短,頻繁創建和銷燬的對象
  • 舊生代適合生命週期較長的對象,用於存放經過多次垃圾回收仍然存活的對象,例如緩存對象
  • 持久代在Sun的JVM中就是方法區的意思,儘管有些JVM沒有這一代,主要存放常量及類的一些信息

5.常見的GC算法

5.1標記清除算法

  • 效率問題:標記和清除兩個過程的效率低
  • 空間問題:標記清除之後,會產生大量不連續的內存碎片,空間碎片會導致程序運行過程中需要分配較大對象時,無法找到足夠的連續內存而觸發另一次垃圾回收。

5.2複製算法

  • 將內存劃分爲兩塊,每次只使用其中一塊
  • 當一塊內存用完之後,將還存活的對象複製到另一塊上,然後把已使用過的內存空間一次清理。
  • 反覆交換兩個內存的角色,完成垃圾收集

5.3標記整理算法

  • 在標記清除算法基礎上做了優化,把存活的對象壓縮到內存的一端,直接清理邊界以外的內存,老年代使用的就是標記壓縮法

[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-WER7AsM1-1589884283199)(20181217150802215.png)]

5.4分區收集算法

  • 將內存分爲N個獨立的空間,每個小空間都可以獨立使用,不是對整個空間進行垃圾回收,從而提升性能,減少GC的停頓時間

6.Java裏有哪些Map

  • collection是單列集合,元素是孤立存在的。Map是雙列集合,每個元素由鍵和值組成,通過鍵可以找到對應的值
  • HashMap:存儲數據採用哈希表結構,元素的存取順序不能保證一致
  • LinkedHashMap:HashMap的子類,存儲結構採用哈希表+鏈表,通過鏈表可以保證元素存取順序一致

7.HashMap的實現過程

  • HashMap底層基於數組+鏈表組成

  • 當哈希衝突嚴重時,在桶上形成的鏈表會變得越來月長,查詢的時候效率就會越來越低,Java1.7的實現原理

  • Java1.8重點優化了查詢效率問題

8.ConcurrentHashMap的實現

  • ConcurrentHashMap是Java中一個線程安全且高效的HashMap實現,解決高併發問題
  • ConcurrentHashMap是由Segment數組和HashEntry組成

9.HashMap、HashTable、ConcurrentHashMap三者的區別

  • hashMap:線程不安全,數組+鏈表+紅黑樹
  • HashTable:線程安全,鎖住整個對象,數組+鏈表
  • ConcurrentHashMap線程安全,CAS+同步鎖,數組+鏈表+紅黑樹
  • HashMap的key和value均可爲null,其他兩個不行

10.Thread與Runnable在線程管理上的區別

  • 如果一個類繼承了Thread,則不適合資源共享。如果實現了Runnable接口,則容易實現資源共享
  • 實現Runnable接口比繼承THread類具有的優勢:
    • 適合多個相同的程序代碼的線程去共享同一個資源
    • 可以避免Java中單繼承的侷限性
    • 增加程序的健壯性,實現解耦操作,代碼可以被多個線程共享,代碼和線程獨立
    • 線程池只能放入實現Runnable或Callable類線程,不能直接放入繼承Thread的類
  • 在Java中,每次程序運行至少啓動兩個線程。一個是Main線程,一個是垃圾收集線程。

第n輪 ‘精力有限,稍後整理’

  • String爲什麼設計成Final不可變?

  • 自己能實現一個不可變的類嗎?

  • equals 和 hashcode 爲什麼要一起重寫?如果不重寫hashcode會出現什麼問題?

  • hashmap插入的時候,哈希衝突解決? 查找的時候,哈希衝突怎麼解決?

  • hashset是怎麼實現的? hashmap是怎麼實現hashset的?

  • 多線程:併發和並行,原子類,CAS操作

  • CopyOnWriteArrayList的相關特性?

  • ArrayList遍歷的時候能刪除元素嗎? 刪除的時候會報什麼異常?

  • 多態講一下

  • 線程間通信

  • 自旋鎖是什麼,怎麼實現的

  • volatile有什麼用

  • 堆和棧的區別

  • 問我對多線程和JUC熟悉嗎,我說了AQS、ReentrantLock、線程池、CountDownLatch、CyclicBarrier,然後問了我AQS是什麼,介紹了AQS的一部分內容,和具體實現。

  • 問我對jvm的垃圾回收瞭解嗎,說了從新生代到老年代的整體的過程,用什麼垃圾回收算法,舉了幾個垃圾回收器的例子,說來空間分配擔保和可能產生full gc的原因,反正儘可能細的去說自己知道的,越細越好。

  • 問了java線程池的具體參數,問了最長空閒等待時間的具體情況,釋放線程的過程,什麼時候什麼情況釋放,釋放時隊列的情況是怎麼樣的。然後給了一個具體的場景分配服務器和設置線程池參數。單次任務的cpu時間是100ms,要達到一秒鐘1000次任務量,服務器是4核8g,問要多少服務器,每個服務器具體的線程池參數配置是多少。

  • 自旋鎖的原理,什麼時候用自旋鎖,什麼時候用互斥鎖

  • 詳細講解項目中用到的線程池,線程數應該設置爲多大

  • 重載和重寫的區別

  • ThreadLocal的內部實現。怎麼確定一個線程使用的是哪一個threadlocal?

  • 重寫的實現

  • Integer和int的區別

  • 說一下面向對象

  • 垃圾回收機制

  • 講講樂觀鎖和悲觀鎖

操作系統

  • 操作系統相關,進程線程區別
  • 進程和線程的區別?內存管理說一下你的瞭解。進程調度算法。
  • 進程線程是什麼,進程間的通信有哪些方法
  • 進程間通信有哪些
  • linux命令瞭解嗎
  • 怎麼查看端口號佔用情況
  • linux中CPU調度怎麼做的
  • 調度的基本單位是什麼
  • 進程狀態都有哪些,怎麼轉換
  • 調度算法都有什麼,調度的時機是什麼
  • fork時內存空間發生了哪些變化
  • copy on write做了什麼(這個之前沒學到,大佬給我講了一遍)
  • 等待態可以收到信號麼(沒了解過,大佬講了一下S、D狀態)
  • 死鎖(死鎖條件、避免死鎖、死鎖檢測、死鎖預防)
  • 進程和線程的區別,進程通信方式
  • 死鎖四個必要條件
  • 講講多進程和多線程
  • 進程間通信和線程間通信的區別
  • Linux 查看內存
  • 一個進程,有十個線程,其中一個線程fork後,子進程有幾個線程
  • 進程調度
  • 線程和進程

計算機網絡

  • OSI七層模型,socket在哪一層
  • 瀏覽器輸入一個地址到看到返回內容中間發生了什麼
  • 接着上個問題,DNS實現的機制
  • select poll epoll區別,什麼時候用select和poll
  • udp適用於什麼場景
  • tcp和udp可以綁定到同一個端口嗎?如何實現
  • http協議,connection選項的作用
  • tcp斷開連接的過程
  • http複用連接 如何區分請求?
  • epoll的觸發方式 水平觸發和邊沿觸發說一說
  • http是有狀態還是無狀態? TCP是有狀態還是無狀態?
  • 客戶端禁用cookie怎麼辦? 你說的實現方式安全嗎?
  • SSL,http和https,https是有狀態還是無狀態?
  • TCP狀態轉換圖,畫一下。
  • 操作系統I/O模型瞭解嗎?epoll模型瞭解嗎?
  • TCP瞭解多少
  • 那什麼時候會收到RST報文段
  • 那說一說四次揮手
  • 服務器大量處於TIME_WAIT狀態,可能的原因,造成什麼影響,怎麼解決(解決方案沒答上來)
  • 那大量處於close_wait呢(答錯了,理解成LAST_ACK狀態了,但面試官也沒說)
  • IO模型有哪些
  • 用的最多的應該算IO多路複用模型,講講它的優缺點
  • 阻塞IO 非阻塞IO說一下(說了5種IO模型,詳細說了下io複用)
  • http長連接短連接說一下
  • 路由器是哪一層的,有什麼功能,路由尋址怎麼找的,路由表存了什麼
  • ping協議會發生什麼事情(當時以爲問ICMP,結果下面引導到了dns)
  • dns協議,讓後udp還是tcp
  • http response裏面都有哪些內容(大概說了一部分)
  • 項目裏用了IO複用,說一下select poll epoll(講了區別,epoll底層數據結構,ET、LT)
  • dns是tcp還是udp
  • 說一下timewait和closewait(大佬講了timewait中等待報文在網絡中消失具體指的是路由器的緩存
  • 說一下擁塞控制
  • udp報文最大長度(說了MTU1500,但是之前在網上看到過實際會更小,後來看到Internet是576)
  • 問了一個頁面重定向的問題,問我一個頁面自動跳轉另一個頁面怎麼實現,我說了前端和後端都可以做跳轉,然後問我各自的具體是怎麼做的,這部分我沒答好,沒了解過這部分,然後問了301和302的區別,我只知道都是重定向,也沒答好,(一個是臨時的一個是永久的,我連這個都沒答出來)
  • 那聊聊HTTP吧,GET/POST,GET和POST有長度限制嗎,301和302
  • HTTP2.0有什麼新特性,HTTPS過程
  • 講一下Cookie,Cookie能跨域嗎
  • DNS
  • 詳細講解select和epoll的底層實現,LT和ET模式的底層區別,ET模式下的讀寫注意事項
  • 輸入網址後的執行過程,詳細講解每一層
  • 詳細講解HTTPS的原理,客戶端爲什麼信任第三方證書
  • 怎麼實現DNS劫持
  • TCP和UDP的區別,TCP如何保證可靠性,UDP又有什麼優勢
  • tcp的重傳機制瞭解什麼
  • tcp的擁塞控制
  • 說一下cookie和session
  • 爲什麼TCP比較慢,另外怎麼保證可靠性
  • http協議的理解
  • 三次握手四次揮手
  • TCP四次揮手
  • HTTP和TCP的關係
  • HTTP數據量很大,怎麼發送
  • 講講滑動窗口
  • TCP server最多可以建立多少個TCP連接
  • TCP 流量控制和擁塞控制
  • Socket編程有了解過嗎
  • TCP狀態機
  • 四次揮手時,第一次揮手後,客戶端和服務器的TCP分別處於什麼狀態
  • tcp三次握手四次揮手,爲什麼是四次。
  • http https的區別,https需要花錢買啥
  • 常見的狀態碼
  • tcp 和 udp 如果想讓udp實現可靠連接怎麼辦
  • DNS
  • 狀態碼 特別問了502,504
  • 計算機網絡瞭解嗎?OSI七層模型?選擇一個比較熟悉的層,介紹一下有哪些協議
  • 3次握手都發送了什麼數據包
  • 在瀏覽器中輸入url,回車發生了什麼
  • DNS的運行過程,DNS性能優化有哪些方法
  • https協議加密具體過程
  • https和http區別,對稱加密和非對稱加密區別
  • http1.0和http1.1和http2.0
  • 13臺根域名的服務器ip地址保存在哪裏
  • DNS的分級查找
  • 手機與wifi是怎麼建立連接的
  • 路由器是怎麼傳輸數據的(記不清了,圍繞着路由器問了很多)
  • 內網中兩臺電腦怎麼建立連接
  • TCP三次握手
  • get和post區別
  • cookie和session
  • CDN瞭解麼

數據庫

  • SQL語句怎麼執行的知道嗎,底層原理是什麼?

  • 你對數據庫的事務是怎麼理解的

  • 四種隔離級別知道嗎?

  • 悲觀鎖和樂觀鎖呢?悲觀和樂觀鎖的具體實現原理呢?

  • 索引的種類知道嗎?組合索引的最左匹配原則?

  • 索引的底層原理呢?

  • MySQL索引的實現方式?爲什麼用B+樹不用二叉樹?

  • 如何優化一條sql的查詢語句

  • msyql有哪些索引

  • 聯合索引,最左匹配的原理

  • redis有哪些淘汰策略

  • mysql的索引有哪些,區別是什麼,特點

  • 數據庫隔離級別,innodb和myisam的區別。

  • innodb的隔離級別,我自己說了如何實現的

  • redis數據結構

  • mysql的索引:B+樹底層實現?B樹的底層實現?爲什麼要用B+樹而不用B樹?

  • 最左前綴匹配具體是怎麼實現查找的?最左前綴匹配用了B+樹的哪些特性?

  • (a,b,c)聯合索引,爲什麼不能單用(b),而一定要用(a,b)?B+樹是怎麼實現的?

  • 什麼是幻讀,不可重複讀?這些概念是在事務內還是事務外? 事務內

  • mysql怎麼實現可重複讀?設置了可重複讀隔離級別底層是怎麼實現的? (MVCC)

  • 瞭解MVCC嗎?怎麼實現的?什麼是快照讀?快照讀能讀取到最新的嗎?快照讀和當前讀的區別?

  • synchronized和reentrentlock哪個效率高?

  • 爲啥B+樹最後葉子節點需要用鏈表相連接? 便於區間查找

  • 手寫SQL,join

  • 說一下數據庫索引,然後說一下索引的優缺點

  • redis都有哪些數據類型(本來以爲會展開問數據類型底層實現)

  • 索引(講的比一面更詳細了一些)索引的使用條件 優化 最左原則

  • Redis的使用場景

  • 基於Redis實現的分佈式鎖,問的比較細,比如線程阻塞導致,導致鎖過期,其他線程獲取了鎖然後前一個線程又釋放了第二個線程的鎖這種,還問了一個線程等待Redis的分佈式鎖,整體等待時間的是怎麼樣的

  • 說一下mysql的事務隔離級別,然後講了四個隔離級別,以及對應產生的問題(髒讀不可重複讀幻讀),以及InnoDB對應的2 3級別的實現,MVVC的實現,兩個隔離級別產生Review的時間點和次數的區別,還有Next-Key Lock ,行鎖加間隙鎖。

  • 問了mysql的引擎,索引,有哪些索引,然後問了主鍵索引和非主鍵索引的區別,講了聚集索引,然後問了索引訪問的過程,問了用聚集索引和不用的磁盤io訪問次數的不同。

  • 給了一個數據庫表
    Student
    year | first_name | name

    1. 寫SQL查詢每年每個姓氏的學生人數
    2. 有100w數據,現在需要經常查詢
    3. 某年某姓氏的學生列表
    4. 近三年某姓氏的學生列表
    5. 某姓氏的全部學生

    怎麼建索引

  • 數據庫第一範式,第二範式,第三範式

  • 數據庫索引、事務

  • 數據庫查詢10-20行內容

  • 創建數據庫查找135開頭的電話

  • MYSQL的索引

  • MYSQL 爲什麼用B 樹不用紅黑樹

數據結構與算法

  • 比如1234的下一個比他大的數是1243,再下一個是1324,如何給出下一個數找到比他大的數

  • 兩個文件a和b,找出裏面相同的url

  • 手寫快排

  • 堆排,TOP K問題:小頂堆

  • 手寫代碼:單向鏈表,對摺成1 ->n->2->n-1->3……

  • 海量IP,給定IP,輸出IP出現的次數,分析時間複雜度和空間複雜度,答了字典樹,哈希,位圖

  • 二叉樹,技術層從左向右,偶數層從右向左進行輸出

  • 一個單鏈表,奇數位遞增,偶數位遞減,最終實現一個整體遞增鏈表

  • 將二叉樹用數組存儲

  • 判斷二叉樹是否是鏡像

  • 輸入“aaaaabbbbccc”,輸出“a5b4c3”

  • 實現一個緩存隊列 ,二叉樹的鏡像

  • 樹的節點最大距離

  • 二叉搜索樹找到第k小的節點

  • 有一個日誌文件,裏面每一行都有ip、time、context等信息,怎麼查詢某個ip有多少個

  • 給定a=1,b=2,不給定其他變量,怎麼交換它們倆的值

  • 給定一個數組,有若干個數,找到a+b+c=99,找到所有abc的組合

  • 基於比較的查找,最好的性能上logn,還有什麼查找能突破這個限制

  • 排序算法裏面最好的性能上nlogn,能突破這個限制嗎

  • 根據前序遍歷序列和中序遍歷序列求出後續遍歷序列

  • 反轉鏈表,topk問題說思路、時間複雜度

  • 二叉樹Z字打印

  • 一個從1開始的有序數組,找字典序第k大的數,說思路(leetcode440 沒做過 提示了一下樹,想出來了)

  • 手撕算法,LeetCode原題 23. Merge k Sorted Lists,有一點點不一樣就是要求後面沒滿k個的也轉置。

  • 講一講一致性哈希

  • 手撕算法,鏈表快排,用快排的思想實現對鏈表的數據結構的數據做快排。

  • 在中文頁面解析、中文數據處理中,常常遇到用中文表示的數字,例如:五千三百萬零五百零一。
    我們一般需要把它轉化成int型整數,進行實際存儲和使用。
    請完成一億(不含)以內的中文數字到int整數的轉換。
    int ParseInt(string input){
    }

  • 給了一個樹結構,節點的定義裏有parent字段,可以直接找到它的父節點。

    現在要尋找整個樹中序遍歷時,某一個節點的下一個節點是哪個,怎麼找。

    面試官說你可以弄個紙畫一畫,我畫了一會兒,然後說了一下思路,就過了。

  • 有序數組找到第一個小於0的數和第一個大於0的數

  • 矩陣左上角到右下角的最短路徑和

  • 合併兩個排序數組並去重

  • 最長無重複子串

  • 兩個排序數組找中位數

  • 合併k個有序數組,寫代碼

  • 一個整數分解爲多個不同的數之和,有幾種分法,寫代碼

  • 求數組中第K大的值

  • 樹的路徑和

  • 寫一個歸併排序

  • 講一下LRU算法原理

  • 在字符串中找出不重複字符的個數

  • 找出兩個只出現一次的數字,其餘的數字都出現了兩次

  • 一個數組,除了某個數字只出現一次,其它都只出現兩次,做法說了 HashMap 記錄和異或操作,然後讓我手寫了異或的做法

    • 二叉樹的子結構,應該是 leetcode 的題,判斷樹 B 是否是樹 A 的子樹,這個我就寫了個遞歸
  • 給 N 個 32 位無符號整數,有重複,找出重複率最高的前 K 條

  • 兩條鏈表交叉求交叉點

  • 算法題:生成全排列,非遞歸中序遍歷二叉樹

  • 把漢字表示的數字轉化成阿拉伯數字

  • 樹存數據庫裏有什麼辦法

  • 最小編輯距離

  • 查找二叉樹最大深度

  • 二叉樹遍歷

  • 寫代碼判斷IP地址

  • 如何計算完全二叉樹的總節點數

  • 一個數組a,判斷是否存在i<j<k, a[i]<a[k]<a[j]

  • 找到一個字符串中不重複子串的最大長度

  • 一個二叉搜索樹,找出小於m的最大數

  • 最小生成樹

  • a,b是兩個矩陣,判斷a在b中出現了幾次?a的大小小於b

  • 一維01數組中,求最長的區間,其中0和1數量相等

  • 兩個棧模擬雙端隊列

  • 鏈表判環

  • 手寫單例

  • 給定一顆二叉樹,求其中root的最長路徑。所謂路徑是指,聯通兩個結點的最小邊數

  • int 4字節整數的海量數據,如何給出一個數,判斷是否在這堆數據裏?

  • 平衡二叉樹查找複雜度

  • 快速排序複雜度,實現,什麼時候複雜度最大

  • 紅黑樹和平衡二叉樹

  • 給n元錢,m個人,寫個隨機分錢的函數

  • 兩個棧實現一個隊列

  • 給個數組求連續子序列最大和

  • 滑動窗口的最大值

  • 找出一顆完全二叉樹最後一個節點,時間複雜度要求 logN的平方

  • 設計模式

    • 那寫一個單例模式吧,寫一個好點的
  • SSM

    • Spring的特點、IOC和AOP
    • Spring上來問一個bean循環依賴怎麼解決
  • 分佈式

    • 分佈式鎖
    • 解釋 分佈式、微服務、負載均衡、高可用
    • Raft的選舉過程,投票規則,日誌複製過程
  • 系統設計

    • 假設現在給你幾千萬條數據,存在外存裏,你如何找到最大的前100條,綜合考慮時間和空間複雜度
    • 問了一個大數據判重的題,只有一臺機器,數據是int範圍,給了3個思路,一個是hash切分大文件爲小文件,對小文件用hashset去做判重,還有用BitSet,單機大概500mb內存可以解決,最後一個是用布隆過濾器解決,內存利用更小。 然後問我布隆過濾器的誤差怎麼解決,我說可以加大hash數量或者hash的範圍,還有可以用多個獨立的不同的布隆過濾器來解決。
    • 12306買票
    • 大文本數據(數T),統計每個字符串的頻率
  • 項目

    • 詳細說一下你用的這用到的這幾個技術,分別是怎麼用的
    • 整個項目中你認爲最有技術價值的點在哪
    • Spring的IOC和AOP知道吧,單實例無狀態你怎麼理解
    • 分頁和排序這兩個功能,在Hibernate打印出來的SQL語句裏是怎麼樣的?
    • SQL語句怎麼執行的知道嗎,底層原理是什麼?
    • 重點問了Netty,啓動、連接建立、NIO特點、適用場景。

特殊題:

  1. 作者:EternityY
    鏈接:https://www.nowcoder.com/discuss/192224

    算法題:把一個包含n個正整數的序列劃分成m個連續的子序列。設第i個序列的各數之和爲S(i),求所有S(i)的最大值最小是多少?

    例子:

    序列1 2 3 2 5 4劃分爲3個子序列的最優方案爲 1 2 3 | 2 5 | 4,其中S(1),S(2),S(3)分別爲6,7,4,那麼最大值爲7;

    如果劃分爲 1 2 | 3 2 | 5 4,則最大值爲9,不是最小

時間線很有參考價值:https://www.nowcoder.com/discuss/190665

mybatis實現原理、springmvc實現原理

  1. 給一張表:學號,姓名,成績,學號唯一,成績有重複。實現根據學號差成績,根據成績區間查學號
    問把這些信息讀入內存,應該怎麼存放。我說成績用紅黑樹變種區間樹,學號是B+樹,
    然後面試管說成績用區間樹實現不好,我改成B+樹,然後說了時間複雜度,過
    學號B+樹是lgn,面試官說有沒有更快,我說hash表
  2. AB拋硬幣,A先拋硬幣,正面爲贏,直到其中一個人拋出正面, 求A贏的概率
  • 編程:一個有10萬條記錄的log文件,每行有三個字段,“域名,ip,time”,求文件中IP出現次數top10的ip
  • 代碼題。找數組中第k大的數。使用堆做了,然後問時間複雜度。
  • 代碼題。給出一個元素不重複的排序數組,問v如果插入數組中是第幾大。一開始直接使用lower_bound實現,然後問lower_bound和upper_bound的區別,回答了lower_bound是查找第一個大於等於v的數的位置,upper_bound是查找第一個大於v的數的位置。接着問能不能自己實現二分,然後就寫了個二分。
  • 數據庫問題。需要以字段(B,A)和B進行查詢,問怎樣建立索引。回答了建立(B,A)索引。問這樣查詢B可以使用索引嗎。回答可以,因爲最左前綴原則。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章