手撕代碼題:
其他
數(shù)據(jù)結(jié)構(gòu)與算法中有那些奇技淫巧
位運算裝逼指南 ---- 帶你領(lǐng)略位運算的魅力單項列表實現(xiàn)加法運算
舉例:list1:1->2->3; list2: 4->5->6->7;返回list:4->6->9->0
思路:用2個棧存儲兩個list,然后一起彈出,并記錄進位,然后把每一次計算的結(jié)果拼接成list返回即可
代碼:后續(xù)補充。。。。求一個整數(shù)二進制表示中1的個數(shù)
最笨的方式是逐位取值,判斷是否為1;復雜度是O(n)
快速的方式是只找1的位置,n&(n+1)是找到最右邊的1,然后n-n&(n+1)是舍棄最右邊的1,當n變成0,即所有的1都找到了
代碼:
int n = 0b10001010010100;
int count = 0;
while(n != 0){
count++;
n -= n&(~n + 1);
}
System.out.println(count);
- Bit-map
海量數(shù)據(jù)下 BitMap 理解及應用場景
如何只用2GB內(nèi)存從20億,40億,80億個整數(shù)中找到出 - 打家劫舍
- 找到數(shù)組中出現(xiàn)次數(shù)大于N/k的數(shù)
線程安全&不安全
volatile、AtomicInteger、LongAdder、synchronize
· volatile解決多線程內(nèi)存不可見問題。對于一寫多讀,是可以解決變量同步問題,但是如果多寫,同樣無法解決線程安全問題。如果是count++操作,使用如下類實現(xiàn):AtomicInteger count = new AtomicInteger(); count.addAndGet(1); 如果是JDK8,推薦使用LongAdder對象,比AtomicLong性能更好(減少樂觀鎖的重試次數(shù))。
CAS是一個原子性操作理解線程安全與不安全
https://www.cnblogs.com/kubidemanong/p/9505944.html對象實例
對象實例由對象頭、實例數(shù)據(jù)組成,其中對象頭包括markword和類型指針,如果是數(shù)組,還包括數(shù)組長度;
Mark word
Mark word與鎖的關(guān)系鎖
鎖膨脹:
偏向鎖->輕量級鎖(自旋鎖、自適應自旋鎖,也叫作非阻塞同步、樂觀鎖)->重量級鎖(又被叫做互斥鎖MutexLock、阻塞同步、悲觀鎖)