頭條
一面
-
算法題:二分搜尋相關
二分搜尋:又叫二分查找,即折半查找
關鍵代碼:
方法一:遞歸調用
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;
}
-
概念題:解釋 分布式、微服務、負載均衡、高可用
分布式:就是将一個系統的各個元件分布在網絡上的各台主機,并且各元件之間僅通過消息傳遞通信并協調工作。
分布式與叢集的差別:分布式是指将不同的子業務分布在不同的地方,叢集是指将幾台伺服器完成同一個業務。分布式的每一個節點都可以做叢集,可是叢集不一定是分布式。若分布式的某一節點垮了,則該節點的業務無法通路,因為分布式不同的節點完成不同的業務。若叢集的某一節點垮了,則其他伺服器頂上,該業務繼續正常被通路。
微服務:單個服務的設計,是以參與人從設計、開發、測試、運維所有人加起來隻需要兩個人。服務一個或者一組相對較小且獨立的功能單元。
負載均衡:就是指将負載(工作任務)進行平衡、分攤到多個操作單元上進行運作,例如FTP伺服器、Web伺服器、企業核心應用伺服器和其它主要任務伺服器等,進而協同完成工作任務。
連結:https://www.cnblogs.com/xzwblog/p/7255364.html
高可用:描述一個系統經過專門的設計,,進而減少停工時間,而保持其服務的高度可用性。百度百科解釋
-
http是有狀态還是無狀态? TCP是有狀态還是無狀态?
http是無狀态的,tcp是有狀态的。
無狀态是指協定對于事務處理沒有記憶能力,伺服器不知道用戶端是什麼狀态。即我們給伺服器發送HTTP請求之後,伺服器根據請求,會給我們發送資料過來,但是,發送完,不會記錄任何資訊。
http無狀态帶來的問題:使用者登入後,切換到其他界面,進行操作,伺服器端是無法判斷是哪個使用者登入的。 每次進行頁面跳轉的時候,得重新登入。
怎樣讓http變成有狀态的?Cookie 和 Session 兩種保持http狀态的技術。
詳細解析https://blog.csdn.net/H_Expect/article/details/99967490
-
用戶端禁用cookie怎麼辦? 你說的實作方式安全嗎?
還有URL重寫技術和Session。
-
SSL,http和https,https是有狀态還是無狀态?
https是有狀态的,用為https=http+ssl,而ssl是面向連接配接的。
- String為什麼設計成final不可變? 是怎麼實作不可變的?
- 自己能實作一個不可變的類嗎?
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;
}
}
-
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。
-
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)
- 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);
}
- 多線程:并發和并行,原子類,CAS操作
- mysql的索引:B+樹底層實作?B樹的底層實作?為什麼要用B+樹而不用B樹?
- 最左字首比對具體是怎麼實作查找的?最左字首比對用了B+樹的哪些特性?
- (a,b,c)聯合索引,為什麼不能單用(b),而一定要用(a,b)?B+樹是怎麼實作的?
- 什麼是幻讀,不可重複讀?這些概念是在事務内還是事務外? 事務内
- mysql怎麼實作可重複讀?設定了可重複讀隔離級别底層是怎麼實作的? (MVCC)
- 了解MVCC嗎?怎麼實作的?什麼是快照讀?快照讀能讀取到最新的嗎?快照讀和目前讀的差別?
- 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 垃圾收集器了解哪些?
二面
算法題: 實作一個四則運算電腦(兩個棧 + 優先級) , 冒泡排序
輸入一個網站的全過程。從計算機網絡到伺服器内部技術實作流程。
日常怎麼學習。
阿裡
各部門履歷面
- volatile的底層如何實作,怎麼就能保住可見性了?
- 三個線程如何實作交替列印ABC
- 線程池有哪些建立方式和安全性問題
- 有哪些線程池的類型
- 線程池中LinkedBlockingQueue滿了的話,線程會怎麼樣
- 線程池的底層原理和實作方法
- 線程之間的互動方式有哪些?有沒有線程互動的封裝類 (join)
- 算法:堆排序、棧實作隊列、反轉連結清單
- Java鎖機制,都說一下~
- 除了@ResponseBody,controller層如何标準傳回給前端所要的資料類型?你會怎麼實作?
- 異常捕獲處理
- Spring MVC的原理和流程
- HashMap和ConcurrentHashMap哪個效率更高?為什麼?
- Redis的緩存淘汰政策有哪些?
- Java記憶體模型說一下
- mybatis如何進行類型轉換
- mybatis的xml有什麼标簽
- MySQL鎖機制
- 如何修改linux的檔案權限
- jvm的回收算法
- 你會怎麼設計資料庫表結構
- 資料庫有哪些索引?
- 如何防止sql注入
- 抽象類和接口有什麼不同
- myql間歇鎖的實作原理
- future的底層實作異步原理
- SpringBoot Starter原理
- rpc原理
- 多個服務端上下線怎麼感覺
- 緩存和資料一緻性,怎麼處理。流式計算
- 多線程講一下,FutureTask
- Java和mysql的鎖介紹,樂觀鎖和悲觀鎖
- 分布式一緻性講一講
- 分布式鎖的實作方式,zk實作和redis實作哪個比較好
- 多點登陸怎麼實作
- 把樂觀鎖加在資料庫上面,怎麼實作
- 項目介紹
- 降級處理hystrix了解過麼
- 兩次點選,怎麼防止重複下訂單
- ioc原理詳細講講,源碼看過麼
- 靜态***和動态***的差別
- JUC說說你知道的東西
- B+樹的葉子節點
菜鳥
一面
- Java記憶體模型
- full gc怎麼觸發
- gc算法
- 高吞吐量的話用哪種gc算法
- ConcurrentHashMap和HashMap
- JDK8的stream的操作
- volatile原理
- 有參與過開源的項目
- 項目介紹
- 線程池原理,拒絕政策,核心線程數
- 1億個手機号碼,判斷重複
- 是否有寫過小工具
- 單元測試介紹一下,多子產品依賴怎麼單元測試。Mockito
二面
- 項目介紹
- dubbo、netty介紹原理
- 限流算法
- zk挂了怎麼辦
- 秒殺場景設計,應付突然的爆發流量
- redis的熱點key問題
- redis的更新政策(先操作資料庫還是先操作緩存)
- 分布式資料一緻性
- 一緻性哈希
- 消息隊列原理介紹(不太會)
- full gc問題,怎麼排查
- jvm的回收政策
- ClassLoader原理和應用
- 注解的原理
- 資料庫原理,資料庫中間件,索引優化
- aop原理和應用
- 大資料相關,MapReduce
- 機器學習有了解麼?
- Java的新技術,以及技術最新進展
- Docker的原理
三面
1、全程項目
2、讨論了一下資料庫表設計
四面
1、項目介紹
2、分布式事務
3、Java三大特性
4、資料庫表設計
5、RPC原理
6、netty原理
7、降級政策和降級架構
騰訊
一面(電話)(50分鐘)
- 算法題:六七道,都是劍指offer難度
- 半小時項目介紹 & 問答
- 分布式相關:rpc原理、微服務架構
- 海量資料問題:套路題
- 計網:傳輸層、網絡層(必須要非常熟,ping的原理,tcp的三次握手、四次揮手、擁塞控制。UDP的不可靠、一對一、一對多)
- 作業系統:虛拟記憶體、段式、頁式、程序排程算法
- 資料一緻性: 分布式資料一緻性、緩存資料一緻性
- Java相關:線程池、HashMap、CopyOnWriteArrayList
- Redis相關:複制原理、持久化原理
- 雜談:最近看什麼書,實習地點。
二面(牛客視訊)(85分鐘)
- 算法題:最長不重複字串
- 半小時鐘項目介紹 & 問答
- 作業系統:Linux的namespace(不會)、程序線程、線程通信方式、程序通信方式
- 計算機網絡:傳輸層和網絡層,因為我項目做了鍊路層,也講了一下。
- Java相關: 線程池
- 資料庫相關: 一條連表查詢語句。資料庫索引原理
- 海量資料問題: 套路題
- 雜談:介紹了部門業務
三面(電話) (20分鐘)
- 應該是大老闆面試了,問的都很哲學:技術背景、學習方法、項目介紹
- 問了一些簡單技術問題。主要考察邏輯表達和整體的素質。
- 雜談:介紹了部門業務
hr(電話)(15分鐘)
- 家庭情況
- 面騰訊原因,還有面其他公司麼
- 興趣愛好
- 業務介紹
- 口頭offer