天天看點

2020秋招頭條百度阿裡騰訊面試題

頭條

一面

  1. 算法題:二分搜尋相關

    二分搜尋:又叫二分查找,即折半查找

    關鍵代碼:

方法一:遞歸調用
public int search1(int num[],int target,int left,int right){
        int mid = (left+right)/2;
        if(num[mid]==target){
            return mid;
        } else if(num[mid]>target){
            search(num,target,left,mid-1);
        }else{
            search(num,target,mid+1,right);
        }
        return -1;
    }
方法二:while循環
public int search2(int num[],int target){
        int left=0;
        int right=num.length-1;
        while(left <= right){
            int mid = (left + right)/2;
            if(num[mid] == target){
                return mid;
            }else if(num[mid]<target){
                left = mid+1;
            }else{
                right = mid-1;
            }
        }
        return -1;
    }
           
  1. 概念題:解釋 分布式、微服務、負載均衡、高可用

    分布式:就是将一個系統的各個元件分布在網絡上的各台主機,并且各元件之間僅通過消息傳遞通信并協調工作。

    分布式與叢集的差別:分布式是指将不同的子業務分布在不同的地方,叢集是指将幾台伺服器完成同一個業務。分布式的每一個節點都可以做叢集,可是叢集不一定是分布式。若分布式的某一節點垮了,則該節點的業務無法通路,因為分布式不同的節點完成不同的業務。若叢集的某一節點垮了,則其他伺服器頂上,該業務繼續正常被通路。

    微服務:單個服務的設計,是以參與人從設計、開發、測試、運維所有人加起來隻需要兩個人。服務一個或者一組相對較小且獨立的功能單元。

    負載均衡:就是指将負載(工作任務)進行平衡、分攤到多個操作單元上進行運作,例如FTP伺服器、Web伺服器、企業核心應用伺服器和其它主要任務伺服器等,進而協同完成工作任務。

    連結:https://www.cnblogs.com/xzwblog/p/7255364.html

    高可用:描述一個系統經過專門的設計,,進而減少停工時間,而保持其服務的高度可用性。百度百科解釋

  2. http是有狀态還是無狀态? TCP是有狀态還是無狀态?

    http是無狀态的,tcp是有狀态的。

    無狀态是指協定對于事務處理沒有記憶能力,伺服器不知道用戶端是什麼狀态。即我們給伺服器發送HTTP請求之後,伺服器根據請求,會給我們發送資料過來,但是,發送完,不會記錄任何資訊。

    http無狀态帶來的問題:使用者登入後,切換到其他界面,進行操作,伺服器端是無法判斷是哪個使用者登入的。 每次進行頁面跳轉的時候,得重新登入。

    怎樣讓http變成有狀态的?Cookie 和 Session 兩種保持http狀态的技術。

    詳細解析https://blog.csdn.net/H_Expect/article/details/99967490

  3. 用戶端禁用cookie怎麼辦? 你說的實作方式安全嗎?

    還有URL重寫技術和Session。

  4. SSL,http和https,https是有狀态還是無狀态?

    https是有狀态的,用為https=http+ssl,而ssl是面向連接配接的。

  5. String為什麼設計成final不可變? 是怎麼實作不可變的?
  6. 自己能實作一個不可變的類嗎?
package cn.lsy.test;

public class FINAL_CLASS {
    private final String name;
    private final int id;
    public FINAL_CLASS(String name,int id){
        this.name=name;
        this.id=id;
    }

    public final String getName() {
        return name;
    }

    public final int getId() {
        return id;
    }
}

           
  1. equals 和 hashcode 為什麼要一起重寫?如果不重寫hashcode會出現什麼問題?

    現有兩個對象

    Student s1 = new Student(“小明”,18);

    Student s2 = new Student(“小明”,18);

    假如隻重寫了equals 沒有重寫hashcode,那麼student類的hashcode方法就是Object裡預設的hashcode方法,由于預設的hashcode方法是根據對象的記憶體位址經過雜湊演算法得來的,顯然此時s1!=s2,故兩者的hashcode不一定相等。

    然而重寫了equals,且s1.equals(s2)傳回true,根據hashcode的規則,兩個對象相等則hashcode則一定相等。于是沖突産生了,是以重寫equals一定要重寫hashcode。

  2. hashmap插入的時候,哈希沖突解決? 查找的時候,哈希沖突怎麼解決?

    源碼

static final int MAXIMUM_CAPACITY = 1 << 30;
//為什麼是2的30次方,因為Integer.MAX_VALUE == 1 << 30;
static final float DEFAULT_LOAD_FACTOR = 0.75f;//負載因子。目前容量大于整個容量的75%,開始擴容。
void resize(int newCapacity) {
        Entry[] oldTable = table;
        int oldCapacity = oldTable.length;
        if (oldCapacity == MAXIMUM_CAPACITY) {
            threshold = Integer.MAX_VALUE;
            return;
        }

        Entry[] newTable = new Entry[newCapacity];
        transfer(newTable);
        table = newTable;
        threshold = (int)(newCapacity * loadFactor);
    }
           

1.如果HashMap的大小超過了負載因子(load factor)定義的容量,怎麼辦?

預設的負載因子大小為0.75,也就是說,當一個map填滿了75%的bucket時候,和其它集合類(如ArrayList等)一樣,将會建立原來HashMap大小的兩倍的bucket數組,來重新調整map的大小,并将原來的對象放入新的bucket數組中。這個過程叫作rehashing,因為它調用hash方法找到新的bucket位置。這個值隻可能在兩個地方,一個是原下标的位置,另一種是在下标為<原下标+原容量>的位置

2.重新調整HashMap大小存在什麼問題嗎?

當重新調整HashMap大小的時候,确實存在條件競争,因為如果兩個線程都發現HashMap需要重新調整大小了,它們會同時試着調整大小。在調整大小的過程中,存儲在連結清單中的元素的次序會反過來,因為移動到新的bucket位置的時候,HashMap并不會将元素放在連結清單的尾部,而是放在頭部,這是為了避免尾部周遊(tail traversing)。如果條件競争發生了,那麼就死循環了。(多線程的環境下不使用HashMap)

擴容步驟:

1.擴容:建立一個新的Entry空數組,長度是原數組的2倍。

2.ReHash:周遊原Entry數組,把所有的Entry重新Hash到新數組。為什麼要重新Hash呢?因為長度擴大以後,Hash的規則也随之改變。

hash公式:index = HashCode(Key) & (Length - 1)

  1. hashset是怎麼實作的? hashmap是怎麼實作hashset的?
通過new HashMap()實作的,底層資料結構是哈希表,cun存取比較友善,線程不安全。
private transient HashMap<E,Object> map;

    // Dummy value to associate with an Object in the backing Map
    private static final Object PRESENT = new Object();

    /**
     * Constructs a new, empty set; the backing <tt>HashMap</tt> instance has
     * default initial capacity (16) and load factor (0.75).
     */
    public HashSet() {
        map = new HashMap<>();
    }
     public HashSet(Collection<? extends E> c) {
        map = new HashMap<>(Math.max((int) (c.size()/.75f) + 1, 16));
        addAll(c);
    }
           
  1. 多線程:并發和并行,原子類,CAS操作
  2. mysql的索引:B+樹底層實作?B樹的底層實作?為什麼要用B+樹而不用B樹?
  3. 最左字首比對具體是怎麼實作查找的?最左字首比對用了B+樹的哪些特性?
  4. (a,b,c)聯合索引,為什麼不能單用(b),而一定要用(a,b)?B+樹是怎麼實作的?
  5. 什麼是幻讀,不可重複讀?這些概念是在事務内還是事務外? 事務内
  6. mysql怎麼實作可重複讀?設定了可重複讀隔離級别底層是怎麼實作的? (MVCC)
  7. 了解MVCC嗎?怎麼實作的?什麼是快照讀?快照讀能讀取到最新的嗎?快照讀和目前讀的差別?
  8. synchronized和reentrentlock哪個效率高?

二面

23. 算法:實作一個緩存隊列 ,二叉樹的鏡像

24. 程序和線程的差別?記憶體管理說一下你的了解。程序排程算法。

25. 為啥B+樹最後葉子節點需要用連結清單相連接配接? 便于區間查找

26. TCP狀态轉換圖,畫一下。

27. 作業系統I/O模型了解嗎?epoll模型了解嗎?

28. CopyOnWriteArrayList的相關特性?

29. ArrayList周遊的時候能删除元素嗎? 删除的時候會報什麼異常?

三面

30. 算法題: (1)樹的節點最大距離(2)區間覆寫 例 [1 3] [2 5] [3 6]能否覆寫[2 6]

31. Linux相關指令。

32. 手寫SQL,join

百度

資訊中心

一面

算法:字元串反轉 、 倒着列印連結清單(為什麼用遞歸比用棧差?) 、 單例模式

線程start 、 run方法差別

可以不通過構造函數建立對象嗎? object.clone() 反序列化

volatile關鍵字

Spring AOP原理(cglib 和 JDK的動态***實作有什麼差別?)

重寫equals方法,為什麼一定要重寫hashcode方法?

字元串 == 比較。輸出true還是false;

看了七八個程式,然後問輸出什麼?

HashMap 能不能存儲 null 能,放在第一個格子裡?concurrentHashMap 能不能存儲 null?

分布式系統設計:現在有一個方法,可以給10台伺服器調用,如何統計一天内10台電腦調用的次數和?

分布式鎖的設計:每天早上8:00輸出前一天的業務報表發到老闆郵箱。如果現在有10台伺服器,如果設計這個定時任務?

法1:分布式鎖。法2:通過外部發來一個http請求,傳給ngnix,通過ngnix自動進行配置設定到某一台伺服器上。

二面

你對哪方面知識比較自信?

HashMap初始容量多少?(16)為啥要設計初始為16?如果傳入容量10會怎麼樣?(還是會建構16容量的);

知道什麼異常?(說幾個)

http的狀态碼說幾個。403是什麼狀态?

String有什麼方法?

list,set集合在iterator輸出的時候能删去值嗎?

SimpleDateFormat是線程安全的嗎?

手寫左連接配接。

聚合函數有哪些?

三面

算法題:數組A和數組B,求 A并B - A交B;(說了幾種,好像不滿意不是最優解)

算法題:矩陣搜尋(說完之後問優化,沒想到,提示二分搜尋);

SSM的運作流程,說說你做的項目難點。

GET POST請求,url裡面的參數

說說索引,如果對每一列都建索引有什麼不好?

白盒測試、黑盒測試

Linux會嗎?

鳳巢

一面

算法題:手寫堆排序

Spring IOC原理 AOP原理,如何利用AOP實作日志,寫過嗎?

Spring bean建立的方法 注解 @Service xml配置 @bean

Java反射原理?

SpringBoot 裡面 @bean 解釋一下

Java記憶體模型和運作時資料區

Spring 中事務@Tranctional,出現異常復原是怎麼實作的

資料庫MVCC原理

樂觀鎖和悲觀鎖概念

悲觀鎖的實際例子。 select * from table for update …

樂觀鎖實際上有沒有加鎖?

用兩個線程去操作資料庫,樂觀鎖具體是什麼實作的?示範一遍,畫一畫

資料庫常用存儲引擎,差別,鎖範圍。

寫過單純的非web項目的 Spring工程, 用main實作的嗎?例子。

SSM 三層技術架構的總體流程

@component @service @controller 三個差別

mybatis中 # 和 $ 的差別?哪個會出現SQL注入?

JVM 新生代,老年代。survival是不是在任意時刻都隻有一塊有對象?

JVM 垃圾收集器了解哪些?

二面

算法題: 實作一個四則運算電腦(兩個棧 + 優先級) , 冒泡排序

輸入一個網站的全過程。從計算機網絡到伺服器内部技術實作流程。

日常怎麼學習。

阿裡

各部門履歷面

  1. volatile的底層如何實作,怎麼就能保住可見性了?
  2. 三個線程如何實作交替列印ABC
  3. 線程池有哪些建立方式和安全性問題
  4. 有哪些線程池的類型
  5. 線程池中LinkedBlockingQueue滿了的話,線程會怎麼樣
  6. 線程池的底層原理和實作方法
  7. 線程之間的互動方式有哪些?有沒有線程互動的封裝類 (join)
  8. 算法:堆排序、棧實作隊列、反轉連結清單
  9. Java鎖機制,都說一下~
  10. 除了@ResponseBody,controller層如何标準傳回給前端所要的資料類型?你會怎麼實作?
  11. 異常捕獲處理
  12. Spring MVC的原理和流程
  13. HashMap和ConcurrentHashMap哪個效率更高?為什麼?
  14. Redis的緩存淘汰政策有哪些?
  15. Java記憶體模型說一下
  16. mybatis如何進行類型轉換
  17. mybatis的xml有什麼标簽
  18. MySQL鎖機制
  19. 如何修改linux的檔案權限
  20. jvm的回收算法
  21. 你會怎麼設計資料庫表結構
  22. 資料庫有哪些索引?
  23. 如何防止sql注入
  24. 抽象類和接口有什麼不同
  25. myql間歇鎖的實作原理
  26. future的底層實作異步原理
  27. SpringBoot Starter原理
  28. rpc原理
  29. 多個服務端上下線怎麼感覺
  30. 緩存和資料一緻性,怎麼處理。流式計算
  31. 多線程講一下,FutureTask
  32. Java和mysql的鎖介紹,樂觀鎖和悲觀鎖
  33. 分布式一緻性講一講
  34. 分布式鎖的實作方式,zk實作和redis實作哪個比較好
  35. 多點登陸怎麼實作
  36. 把樂觀鎖加在資料庫上面,怎麼實作
  37. 項目介紹
  38. 降級處理hystrix了解過麼
  39. 兩次點選,怎麼防止重複下訂單
  40. ioc原理詳細講講,源碼看過麼
  41. 靜态***和動态***的差別
  42. JUC說說你知道的東西
  43. B+樹的葉子節點

菜鳥

一面

  1. Java記憶體模型
  2. full gc怎麼觸發
  3. gc算法
  4. 高吞吐量的話用哪種gc算法
  5. ConcurrentHashMap和HashMap
  6. JDK8的stream的操作
  7. volatile原理
  8. 有參與過開源的項目
  9. 項目介紹
  10. 線程池原理,拒絕政策,核心線程數
  11. 1億個手機号碼,判斷重複
  12. 是否有寫過小工具
  13. 單元測試介紹一下,多子產品依賴怎麼單元測試。Mockito

二面

  1. 項目介紹
  2. dubbo、netty介紹原理
  3. 限流算法
  4. zk挂了怎麼辦
  5. 秒殺場景設計,應付突然的爆發流量
  6. redis的熱點key問題
  7. redis的更新政策(先操作資料庫還是先操作緩存)
  8. 分布式資料一緻性
  9. 一緻性哈希
  10. 消息隊列原理介紹(不太會)
  11. full gc問題,怎麼排查
  12. jvm的回收政策
  13. ClassLoader原理和應用
  14. 注解的原理
  15. 資料庫原理,資料庫中間件,索引優化
  16. aop原理和應用
  17. 大資料相關,MapReduce
  18. 機器學習有了解麼?
  19. Java的新技術,以及技術最新進展
  20. Docker的原理

三面

1、全程項目

2、讨論了一下資料庫表設計

四面

1、項目介紹

2、分布式事務

3、Java三大特性

4、資料庫表設計

5、RPC原理

6、netty原理

7、降級政策和降級架構

騰訊

一面(電話)(50分鐘)

  1. 算法題:六七道,都是劍指offer難度
  2. 半小時項目介紹 & 問答
  3. 分布式相關:rpc原理、微服務架構
  4. 海量資料問題:套路題
  5. 計網:傳輸層、網絡層(必須要非常熟,ping的原理,tcp的三次握手、四次揮手、擁塞控制。UDP的不可靠、一對一、一對多)
  6. 作業系統:虛拟記憶體、段式、頁式、程序排程算法
  7. 資料一緻性: 分布式資料一緻性、緩存資料一緻性
  8. Java相關:線程池、HashMap、CopyOnWriteArrayList
  9. Redis相關:複制原理、持久化原理
  10. 雜談:最近看什麼書,實習地點。

二面(牛客視訊)(85分鐘)

  1. 算法題:最長不重複字串
  2. 半小時鐘項目介紹 & 問答
  3. 作業系統:Linux的namespace(不會)、程序線程、線程通信方式、程序通信方式
  4. 計算機網絡:傳輸層和網絡層,因為我項目做了鍊路層,也講了一下。
  5. Java相關: 線程池
  6. 資料庫相關: 一條連表查詢語句。資料庫索引原理
  7. 海量資料問題: 套路題
  8. 雜談:介紹了部門業務

三面(電話) (20分鐘)

  1. 應該是大老闆面試了,問的都很哲學:技術背景、學習方法、項目介紹
  2. 問了一些簡單技術問題。主要考察邏輯表達和整體的素質。
  3. 雜談:介紹了部門業務

hr(電話)(15分鐘)

  1. 家庭情況
  2. 面騰訊原因,還有面其他公司麼
  3. 興趣愛好
  4. 業務介紹
  5. 口頭offer

繼續閱讀