記錄2025的面著玩
1.8 蟲下
1.java里面如何判斷比如一個hashmap它的鍵是一樣的,比如鍵是一個對象的時候
是否相同依賴于該對象的equals() 方法和hashCode() 方法的實現(xiàn)
2.ssl是在tcp之前還是之后?哪里用到對稱加密和非對稱加密,哪個更安全?如何判斷公鑰是安全的
三次握手會在 SSL/TLS 握手之前完成,SSL/TLS 加密處理后,生成的加密數(shù)據(jù)通過 TCP/IP 傳輸。
3.synchronized底層是通過什么實現(xiàn)的?synchronized可以作用于哪些地方
它的底層實現(xiàn)依賴于 JVM(Java 虛擬機)和對象監(jiān)視器(Monitor)。具體實現(xiàn)如下:
(1) 基于 Monitor 對象
synchronized實現(xiàn)依賴于 JVM 中的對象監(jiān)視器(Monitor)。在字節(jié)碼層面,synchronized 被編譯成兩條主要的字節(jié)碼指令:
monitorenter:線程進入同步塊時調(diào)用,嘗試獲取監(jiān)視器鎖。
monitorexit:線程退出同步塊時調(diào)用,釋放監(jiān)視器鎖。
(2) 內(nèi)置鎖
每個對象在 Java 中都關(guān)聯(lián)一個對象頭,其中包括一個鎖標志位和指向 Monitor 的引用。它支持以下幾種鎖狀態(tài):
無鎖(Unlocked):默認狀態(tài),沒有線程持有鎖。
偏向鎖(Biased Locking):
為了減少鎖的開銷,如果一個線程獨占訪問一個同步塊,JVM 會將鎖偏向這個線程。
輕量級鎖(Lightweight Locking):
適用于多個線程競爭,但沒有真正發(fā)生阻塞的情況。
通過 CAS操作來嘗試獲取鎖。
重量級鎖(Heavyweight Locking):
如果多個線程同時競爭,發(fā)生阻塞時,鎖會升級為重量級鎖。
線程會掛起并進入操作系統(tǒng)的阻塞隊列。
(3) 操作系統(tǒng)級別的實現(xiàn)
在重量級鎖狀態(tài)下,底層通過 操作系統(tǒng)的互斥量(Mutex)或線程調(diào)度機制 來實現(xiàn)線程的同步和阻塞。
4.java hashmap底層是紅黑樹還是散列表?擴容的時候是需要重新計算所有鍵值嗎
底層數(shù)據(jù)結(jié)構(gòu):HashMap 的核心是基于 散列表,鏈表和紅黑樹用于優(yōu)化哈希沖突。鏈表在鏈過長時會轉(zhuǎn)換為紅黑樹。
擴容行為:擴容時會 重新計算鍵值對的位置,這是因為哈希的目標桶數(shù)量發(fā)生了變化。經(jīng)過 Java 8 的優(yōu)化,位置重新計算時不需要完全重新哈希,而是基于原有的哈希值對索引簡單調(diào)整。
5.反轉(zhuǎn)字符串中的單詞
tx圖形學課題
1.uras原理
2.asan是如何檢測內(nèi)存泄露的
3.urp和hdrp 區(qū)別
1.14百度
不同數(shù)據(jù)庫怎么遷移,怎么保證數(shù)據(jù)庫高可用?
大模型應用怎么搭建
2.14 二面掛
神人部門,前面人鴿了又撈
2.27 aliyun
1.什么時候用map什么時候用unordered_map?map的復雜度n指什么?
有序數(shù)據(jù)、范圍查詢 → 用 std::map
大數(shù)據(jù)量、頻繁查找 → 用 std::unordered_map
n 指的是 map 中存儲的元素數(shù)量
2.手寫B(tài)樹B+樹
struct BTreeNode { int leaf; // 是否是葉子節(jié)點 int n; // 當前關(guān)鍵字數(shù)量 int keys[ORDER - 1]; // 關(guān)鍵字數(shù)組 struct BTreeNode* child[ORDER]; // 子節(jié)點數(shù)組 };
3.索引下推和謂詞下推
索引下推針對單表模糊查詢
4.分片有哪些策略范圍分片,哈希分片,列表分片,復合分片
5.多線程輪流打印數(shù)字
https://blog.csdn.net/qq_51274317/article/details/132621731
https://blog.csdn.net/chuxinchangcun/article/details/130378838
6.多個線程獲取某線程的shared_ptr的引用,計數(shù)會增加嗎?peterson多線程算法是啥
多個線程獲取某個線程的 shared_ptr 引用時,引用計數(shù)會增加。這是因為 shared_ptr 的引用計數(shù)機制是線程安全的,旨在支持多線程環(huán)境下的共享所有權(quán)管理。
7.力扣,最大數(shù)
3.6 wx客戶端
1.inline的優(yōu)點和缺點
2.c++里malloc再delete,new再free分別會有什么問題
3.如何讓進程一個函數(shù)只執(zhí)行一次
static,鎖
4.有問題嗎
int i=1; class A{ A(){ i++; } ~A() { i--; } int main() { mutex.lock(); class A; mutex.unlock(); }
5.napi
6.兩個升序單向鏈表合并降序返回
這里有兩種方法可以實現(xiàn)將兩個升序的單向鏈表合并成降序的單向鏈表:
- 直接合并后反轉(zhuǎn)(先合并成升序,然后反轉(zhuǎn)鏈表)
- 頭插法構(gòu)造降序鏈表(遍歷兩個鏈表,較大的節(jié)點優(yōu)先插入新鏈表頭部)
下面是頭插法的實現(xiàn),避免了額外的反轉(zhuǎn)操作,時間復雜度為 (O(n + m)):
代碼實現(xiàn):
#include <iostream> struct ListNode { int val; ListNode* next; ListNode(int x) : val(x), next(nullptr) {} }; // 合并兩個升序單鏈表并返回降序鏈表 ListNode* mergeAndReverse(ListNode* l1, ListNode* l2) { ListNode* newHead = nullptr; // 結(jié)果鏈表的頭節(jié)點 while (l1 && l2) { ListNode* temp; if (l1->val < l2->val) { temp = l1; l1 = l1->next; } else { temp = l2; l2 = l2->next; } temp->next = newHead; // 頭插法 newHead = temp; } // 處理剩余的節(jié)點 while (l1) { ListNode* temp = l1; l1 = l1->next; temp->next = newHead; newHead = temp; } while (l2) { ListNode* temp = l2; l2 = l2->next; temp->next = newHead; newHead = temp; } return newHead; }
復雜度分析:
- 時間復雜度:(O(n + m)),遍歷兩個鏈表合并。
- 空間復雜度:(O(1)),原地修改鏈表,無額外空間開銷。
這種方法比合并后反轉(zhuǎn)更高效,因為避免了額外的鏈表反轉(zhuǎn)操作。
美團
3.19 最長無重復字符子串
3.25 洗牌,每個位置不重復
4.10 刪除鏈表倒數(shù)n個節(jié)點
抽象類,普通類和接口區(qū)別
4.14 最長有效括號長度
4.21 mihoyo
1.dynamic cast失敗會發(fā)送什么
dynamic_cast<指針>返回 nullptr,不拋出異常
dynamic_cast<引用>會拋出異常std::bad_cast
5.6 tet
1.concurrentHashMap底層實現(xiàn)
分段鎖,cas
2.aop底層原理
代理和反射
3.maven快照庫和重視庫?
4.golang協(xié)程
5.redis一般的ops?