前言
這是我字節一面的回憶錄,可能有些不全。
由于博主是Java面試Go崗,操作系統和計網問的還是比較多。
個人感覺字節很喜歡追問,博主被追問拷打的找不到北了,總結還是學的太淺了。
面試官給我的建議:再更深挖一些。
如果感覺對你有幫助,請點點關注點點贊吧,謝謝你!
1?八股
1.1 操作系統
線程和進程講解
線程如何通信(區分進程的通信)
線程通信
? 進程通信
虛擬地址如何找到物理地址
1.2 計算機網絡
IP報文組成(格式)(區分TCP和UDP報文)
IP報文(最后其實還有數據)(下面展示的是頭部信息)
TCP頭部格式
UDP頭部
子網掩碼的作用(舉例說明)(有待補充,我有點忘了,去學習一下在補充)
子網掩碼不能單獨存在,它必須結合IP地址一起使用。IP地址我們都知道是計算機在網絡內的唯一標識,而子網掩碼顧名思義是用于劃分子網的。
子網掩碼只有一個作用,就是將某個IP地址劃分成網絡地址和主機地址兩部分。
子網掩碼是一個32位地址,用于屏蔽IP地址的一部分以區別網絡標識和主機標識,并說明該IP地址是在局域網上,還是在遠程網上。
tcp的可靠性(我當時回答的三次握手和四次揮手的實現方式)
四次揮手為什么一定是四次(其實就是中間兩次揮手能不能合一)
1.3 Java相關內容
我的另外的博客要細致一些
Java集合相關面試題-CSDN博客
JVM相關面試題-CSDN博客
Java后端線程面試筆記-CSDN博客
volatile關鍵字的作用(追問:為什么可以實現線程間的可見性)
泛型的作用 (追問:除了通用之外還有其他的作用嘛)
其他作用
synchronized關鍵字的作用 (追問:可以重入嘛)
更細致的看:Java后端線程面試筆記-CSDN博客? ?的2.1部分
重量級不可以,在輕量級和偏向鎖里面都可以重入
注解的工作原理 (追問:編譯時生效嘛)
Java中的注解(Annotation)是一種為代碼添加元數據的機制,本身不會直接影響代碼邏輯,但可以通過特定的處理工具(如編譯器、框架或自定義處理器)來觸發行為。以下是其工作原理的詳細說明:
多線程開發如何實現
創建線程的方法:四種
Java后端線程面試筆記-CSDN博客?1.3、3
講一下多態
1.4 數據庫
?常用的redis的數據結構? (追問:底層實現:String的底層)
大廠面試-redis-CSDN博客
追問:底層實現:String的底層
redis的原子性如何實現(追問:可以回滾嘛,多條redis如何實現原子性,可以回滾嘛)
單條命令的原子性
可以回滾嗎:不可以
多條redis如何實現原子性
可以回滾,如果內部命令執行失敗就會回滾
但是在Lua里面要先預判可以成功嗎,預判失敗直接不執行
如果Lua在執行中某個命令失敗了,那么成功的不能回滾,失敗的不在執行
mysql事務的四大特征
大廠面試:MySQL篇_mysql 大廠面試題-CSDN博客
2. 算法題
2.1 k等分多邊形
題目描述(數據不是很記得了)
給定一個固定的多邊形,給定坐標,多邊形數據如下:
現在輸入k,將多邊形邊長分成等長的k段
求出k1到k8的坐標
思路
0.求出多邊形周長len
1.找到每個點分的長度:例如第二個點就是:length=(len/k)*(i-1)
2.從第一個(T1)點出發,往下個點走:例如 T1-t2
3.如果|T1-T2|>=length,說明這個點在這條直線上,直接可以求出 坐標
4.如果|T1-T2|<length,說明這個點不在在這條直線上,length-=|T1-T2|,在往下一個點走T2-T3
5.重復2-4,但是為啥補找到上一個分界點,往下走呢,有精度損失。
例子
輸入:13
輸出
代碼
import java.util.Scanner;public class Main {public static void main(String[] args) {//多邊形點的坐標,把第一個點還要加入最后,方便計算double[][] T={{10,20},{20,20},{20,30},{40,30},{40,20},{50,20},{50,5},{10,5},{10,20}};//計算多邊形的邊長,初始化節點double len=0;Node[] nodes=new Node[T.length-1];for (int i = 0; i < T.length-1; i++) {int index=T[i][0]==T[i+1][0]?1:0;nodes[i]=new Node(T[i][0],T[i][1],index==1?'y':'x',T[i][index]>T[i+1][index]?'-':'+',Math.abs(T[i][index]-T[i+1][index]));len+=nodes[i].len;}//輸入KScanner in=new Scanner(System.in);int k=in.nextInt();double kLen=len/k;//計算每一份for(int i=1;i<=k;i++){//每個點離起點T1的位置double length=kLen*(i-1);double x=0,y=0;//記錄每個分界點的坐標for(int j=0;j<nodes.length;j++){if(nodes[j].len>=length){//在這條線上if(nodes[j].c=='x'){x=nodes[j].x+(nodes[j].d=='+'?length:-length);y=nodes[j].y;}else{x=nodes[j].x;y=nodes[j].y+(nodes[j].d=='+'?length:-length);}break;}else{length-=nodes[j].len;}}System.out.println("K"+i+"("+x+","+y+")");}}
}
class Node{public double x;public double y;public char c;// 'x' 'y'public char d;//+,-public double len;//與下個節點的長度public Node() {}public Node(double x, double y, char c, char d, double len) {this.x = x;this.y = y;this.c = c;this.d = d;this.len = len;}
}