跟誰學面經
-
微信點贊測試
(1)功能測試
是否可以點贊
是否可以取消點贊
多次點贊是什麼情況
多人點贊順序是否按照時間順序排列
點贊後是否顯示頭像和名稱
點贊後是否能進行評論
點贊後退出再進入時是否還存在點贊消息
多用戶點贊再次打開朋友圈是否可以按照順序看誰點讚了
點贊之後相同好友是否收到點贊信息
相同好友收到的點贊信息是否按照時間排列
相同好友的點贊是否顯示頭像和名稱
(2)兼容性測試
不同手機端和電腦端是否可以點贊和取消
不同移動端是否可以點贊和取消
(3)性能測試
弱網點贊
網絡斷開是否可以點贊
用戶點贊後多長時間可以看到點贊成功,還有取消時間
多用戶同時點贊是否可以完全收到提示信息
(4)安全性測試
點贊是否會泄漏用戶信息 -
數據庫查詢語句
Select語句 -
平時怎麼學習
如果有時間會拿專業的書和視頻配合學習,如果時間很趕的話就會看網上的文檔、經驗貼、技術博客來學習 -
手寫快排
-
數據庫逆序查詢
Select * from table order by filename desc.
(desc是逆序查詢) -
鏈表查詢
-
排序
直接插入排序
void InsertionSort(vector<int> &data){
for(int i = 1;i<data.size();++i){
int tmp = data[i];
for(int j = i;j>0&&tmp<data[j-1];--j){
data[j]=data[j-1]; //向後覆蓋
}
data[j]=tmp;
}
}
簡單選擇排序
void SelectSort(vector<int> &data){
for(int i = 0;i<n-1;++i){
int min = i;
for(int j = i;j<n;j++){
if(data[j]<data[min])
min = j;
}
if(i!=min) swap(data[i],data[min]);
}
}
-
手撕歸併排序
-
數組查重
-
字符串最長連續子串
-
如果你是一個小組的領導,和另一個小組合作一個任務,然而另外一個小組的小組長去幹別的任務了,會影響到你們組的進度,你該咋辦
與那個小組長協商,讓他們組選出一個熟悉業務的代理小組長,和代理小組長交涉。主要思想就是讓對方組除了小組長之外的人一起完成任務。 -
如果你是個領導,你的下屬說不想做枯燥乏味的搬磚工作了,想幹別的活,你該咋辦(一下子感覺自己走錯片場)
-
瞭解一下他到底想做什麼。告訴他,看別人的工作老是覺得這是光鮮亮麗、多姿多彩的,但其實不深入瞭解根本不知道那個工作到底是什麼樣子,想換的工作只是處於想象之中。
-
如果他沒有特定的想做的工作,我就會讓他多思考一下自己到底想要什麼,大家都是成年人,除了興趣之外還要考慮生活,考慮很多東西,不能憑一時衝動就做出一些不一定正確的決定。況且,我認爲任何工作做一段時間失去新鮮感可能都會有一個疲倦期,多做一些相關的有趣的事情,比如自己去實現一些有趣的項目啊,找到成就感,就不會對自己的事業那麼排斥了。
-
如果他真的有什麼遠大理想,畢生追求,自己想得很清楚的話,我覺得應該鼓勵他去追求。
-
你有男朋友嗎,他是哪個學校的,幹啥的,他找實習了嗎,以後你倆想去哪發展呀(一下子感覺到了來自面試官的母愛)!!!
無 -
索引種類
普通索引,加速查詢
唯一索引,加速查詢+列值唯一(可以有null)
主鍵索引,加速查詢+列值唯一(不可以有null)+表中只有一個
組合索引,多列值組成一個索引,專門用於組合搜索,效率大於索引合併
全文索引,對文本內容進行分詞搜索
索引類型:
Fulltext,全文索引。只有char、varchar、text列可以建立全文索引。
Hash,類似於鍵值對,高效
Btree,默認和最常用的索引類型
Rtree,少用,優勢在於範圍查找。存儲引擎MyISAM、BDb、innoDb、NDb -
建立索引應該注意什麼
把該字段按照一定的方式排序,建立索引。
注意: -
如果對權標都要掃描,那麼建立索引沒有意義。
-
對非唯一字段,比如性別,增加索引沒有意義
-
對於記錄比較少的表,如果建立索引就要佔用很多空間,不會帶來速度優化反而浪費存儲空間。 對於update/insert/delete執行,字段的索引都要重新計算
-
sql怎麼優化
-
數據庫設計方面
表與表的業務聯繫要明確
表字段儘量使用數值型,數值型字段在mysql底層應用性能比string類型好
建立合理的索引 -
Sql語句優化
-
合理使用表連接(不超過5個表連接)
考慮使用臨時表或表變量存放中間結果
視圖嵌套不要過深(不超過2個)
表連接得越多性能越差
最好將連接拆分成若干個過程逐一執行
外連接效果差,必須對左右表都進行掃描
儘量使用inner join查詢(outer join意味着必須對左表或右表查詢所有行) -
合理使用索引,
通配符中like的使用 select id,name from userinfo where name like ‘name%’這樣是會使用索引的,而用‘%name%‘或者‘%name‘的形式是會全表掃描的。(通配符使用在首位就無法用索引)
Where子句左邊不要用函數、算數運算、其他表達式運算。用了就不會用索引了
Where子句不要用is null, is not null判斷,用了就不是索引了
避免在where子句中使用!=或者< >操作符
少用in和not in
少用or,用union代替
不要建立太多索引,索引會提高select的效率,但是會降低insert和update的效率
Select … from … on … where … group by…having …order by…limit…
On where having,儘量在where過濾,比having早
Not in 效率低用not exists代替
數據量過大的時候少用select*
讀寫分離和分庫分表 -
索引數據結構,爲什麼用B+樹
首先,B+樹的一個結點就是一頁,磁盤讀取以頁爲單位,減少磁盤io次數,會使查詢效率提高(局部性原理)。B+樹的內結點不存數據,只存索引。 -
聚集索引和非聚集索引
聚集索引通過索引可以查到需要查找的數據,而非聚集索引可以查找到對應的主鍵值,再通過主鍵的值查找到需要的數據 -
- JVM分區
堆
棧
本地方法棧
程序計數器
方法區
- JVM分區
-
垃圾回收算法
標記清除算法:標記清除過程效率不高,清除後產生不連續的內部碎片
複製算法:分成兩塊,每次只對其中一塊內存進行回收,效率高。最大可分配內存少了一半。
標記整理算法:讓所有對象都移向一邊,然後清理到端邊界以外的內存。
分代收集:根據對象的存活週期將內存劃分爲幾塊。分爲新生代和老年代。新生代用複製算法,老年代用標記清除算法或者標記整理算法。
增量算法:垃圾收集線程和應用程序線程交替執行,直到垃圾收集完成。 -
volatile作用
用volatile修飾的變量,線程在每次使用變量時都會讀取變量修改後的值,不進行編譯器優化,volatile變量隨時可能變化,每次從地址中讀取。 -
get和post請求的區別和用法
區別: -
get在瀏覽器回退是無害的,post會再次提交請求
-
get請求會被瀏覽器主動cache,post不會
-
get請求只支持url編碼,post請求支持多種編碼
-
get請求參數會被完整保存在瀏覽器歷史記錄,post參數不會被保留
-
get請求在url中傳送的參數有長度限制,post沒有長度限制
-
get只接受ascii字符,post沒有限制
-
get更不安全,參數直接暴露在url
-
get參數通過url傳遞,post放在request body
post更安全
post能發送的數據量更大
post能發送更多的數據類型
post比get慢
post請求產生兩個tcp包,get請求產生一個tcp包
get是從服務器獲取數據,post是給服務器傳送數據
數據查詢時建議用get,數據添加、修改、刪除時建議用post
包含機密的話用post更好
-
從技術層面講講在線教育和抖音這種短視頻平臺的區別
-
最長的無重複子字符串 https://leetcode.com/problems/longest-substring-without-repeating-characters
-
10萬個數找出最大的不重複的10個
先hash去重,用最小堆,不斷往最小堆中插入數字,當堆的元素超過10個時,就將堆頂的元素彈出。最後中序遍歷小頂堆是有序的最大不重複的十個數 -
重載和重寫
重載:一個類中多個方法有相同的名字,方法的參數列表不同。是多態性的體現。
重寫:重寫是針對子類對父類的重寫,有相同的方法名,參數列表,返回值 -
Java面向對象的特點
封裝:根據職能將屬性和方法封裝在一個抽象的類中,用類創建對象,用對象調用方法,對象方法的細節都封裝在類中。
繼承:實現代碼重用,相同的代碼不需要重複寫。子類擁有父類的屬性和方法。
多態:由於子類重寫了父類的方法,用父類的引用指向子類的對象,調用方法時進行動態綁定。提高可擴展可維護性。 -
mysql的存儲引擎,區別
myisam:不支持事務,不支持外鍵
innodb:支持事務 -
複合索引的查找規則
-
表中(id,Name) ,根據name查找,怎麼個查找過程
-
TCPIP哪層t
Tcp傳輸層,ip網絡層 -
TCP UDP區別,聊天爲什麼UDP。
-
1、TCP面向連接(如打電話要先撥號建立連接);UDP是無連接的,即發送數據之前不需要建立連接
-
2、TCP提供可靠的服務。也就是說,通過TCP連接傳送的數據,無差錯,不丟失,不重複,且按序到達;UDP盡最大努力交付,即不保 證可靠交付
-
3、TCP面向字節流,實際上是TCP把數據看成一連串無結構的字節流;UDP是面向報文的,應用層交給UDP多長的報文,UDP就照樣發送,即一次發送一個報文。UDP沒有擁塞控制,因此網絡出現擁塞不會使源主機的發送速率降低(對實時應用很有用,如IP電話,實時視頻會議等)
-
4、每一條TCP連接只能是點到點的;UDP支持一對一,一對多,多對一和多對多的交互通信
-
5、TCP首部開銷20字節;UDP的首部開銷小,只有8個字節
-
6、TCP的邏輯通信信道是全雙工的可靠信道,UDP則是不可靠信道
-
線程間通信
Wait/notify 等待
Volatile 內存共享
阻塞隊列 -
進程間通信
管道
消息隊列
信號量
共享內存 -
堆區和棧區的區別
-
棧是自動分配,堆是人爲分配
-
棧獲得空間較小,堆獲得空間較大
-
棧分配的速度較快,堆分配的速度較慢
-
棧向下生長,堆向上生長
-
同步異步
同步:程序1調用程序2時,程序1停下來等待,直到程序2完成回到程序1,程序1才繼續執行下去
異步:程序1調用程序2,程序1繼續執行自己的下一個動作,不受程序2的影響 -
什麼是野指針
指向不可知位置的指針
危害:觸發段錯誤
避免:定義指針時初始化爲null;使用完之後賦值爲null -
常見的hash算法
MD4,MD5 -
hash表滿了,效率變低之後,你想怎樣處理?
虛函數原理
被virtual關鍵字修飾的成員函數就是虛函數。主要是爲了實現多態。
實現原理:虛函數表+虛表指針。每個類使用一個虛函數表,每個類對象使用一個虛表指針 -
malloc和new
malloc是庫函數,new是運算符
new底層是用malloc實現的,但是new更加智能,因爲會自動執行構造函數和析構函數
new返回指定類型的指針,malloc返回void* -
指針和引用
指針是地址,引用是別名
指針可以爲空,引用不能爲空
指針可以有多級,引用只能有一級
指針可以改變指向,引用不能改變
有const指針,沒有const引用
Sizeof指針是指針的大小,sizeof引用時對象的大小 -
判斷一個點在不在三角形內部(這種題我居然也想了快三分鐘。。。我真是個智障。。)
用double算面積相等只能跑出百分之五十多
3次握手,4次揮手
48.http狀態碼(gg)
100-199請求收到繼續處理
200-299成功
300-399資源重定向
400-499客戶端請求出錯
500-599服務器端出錯
200響應成功
302跳轉,重定向
400客戶端語法錯誤
403服務器拒絕提供服務
404資源不存在
505服務器內部錯誤
score (id, 科目, 分數, 學生id) 學生表(學生id,姓名) 求數學排名前三的學生id,及分數。
49. 編程是斐波拉契數列和反轉整數
50. 數學問題(不知道怎麼就考這個,,):時鐘,時針指向1,分針指向0,一點整時,時針和分針夾角多少度。然後當分針越過時針,夾角再爲30度時,時間是多少?(感覺像是在考編程。。可以理解爲下次30度在什麼時間)
30度
- 測試的職責
搭建測試環境、撰寫測試用例、執行測試用例、寫測試計劃和測試報告、測試、提交bug表單跟蹤bug修改情況、執行自動化測試、執行性能測試
非遞歸遍歷二叉樹
遞歸
修飾符作用範圍
時間複雜度