日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > java >内容正文

java

快手提前批--Java开发面经

發布時間:2024/1/8 java 25 豆豆
生活随笔 收集整理的這篇文章主要介紹了 快手提前批--Java开发面经 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

一面

泊松分布下,出現8次的概率已經非常低了

hashmap在jdk1.8中的變化? 如何實現解決死循環? 經常問
參考鏈接
hashMap很不錯的總結

1.8還有4點主要的優化: 1:數組+鏈表改成了數組+鏈表或紅黑樹;: 2:鏈表的插入方式從頭插法改成了尾插法,簡單說就是插入時,如果數組位置上已經有元素,1.7將新元素放到數組中,原始節點作為新節點的后繼節點,1.8遍歷鏈表,將元素放置到鏈表的最后; 3:擴容的時候1.7需要對原數組中的元素進行重新hash定位在新數組的位置,1.8采用更簡單的判斷邏輯,位置不變或索引+舊容量大小; 4:在插入時,1.7先判斷是否需要擴容,再插入,1.8先進行插入,插入完成再判斷是否需要擴容;jdk1.7中:put過程中的resize方法在調用transfer方法的時候導致的死鎖 多線程同時put時,如果同時觸發了rehash操作,會導致HashMap中的鏈表中出現循環節點,進而使得后面get的時候,會死循環get(key)方法時獲取key的hash值,計算hash&(n-1)得到在鏈表數組中的位置

hashMap在Jdk1.7中為何出現死循環?
https://blog.csdn.net/qq_36520235/article/details/86653136

CAS與ABA問題?什么時候出現ABA問題?
空間擔保失敗

空間分配擔保: 當出現大量對象在Minor GC后仍然存活時,就需要老年代進行分配擔保,把survivor無法容納的對象直接進入到老年代中,前提是老年代本身還有容納這些對象的剩余空間 把每一次回收晉升到老年代對象容量的平均值作為參考,與老年代的剩余空間進行比較,如果老年代空間不足(擔保失敗),需要進行Full GC(回收新生代與老年代)

Cms的過程,四個過程
Cms與G1的區別 不會的面經中有
G1收集器有什么特點?哪些會stop the world?

讓三個線程順序執行的方法,一直問,很多很多

join() countdownLatch wait()notify() 使用線程池 將所有線程放入一個阻塞隊列 ,保證順序輸出 通過一個ReentrantLock和三個conditon實現 synchronized+一個狀態變量 信號量

零拷貝

mmap: 通過內存映射,將文件映射到內核緩沖區,同時,用戶空間可以共享內核空間的數據。這樣,在進行網絡傳輸時,就可以減少內核空間到用戶空間的拷貝次數sendFile:數據被 DMA 引擎從文件復制到內核緩沖區,然后調動 write 方法時,從內核緩沖區進入到 Socket,這時,是沒有上下文切換的,因為在一個用戶空間。最后,數據從 Socket 緩沖區進入到協議棧。區別: mmap 適合小數據量讀寫,sendFile 適合大文件傳輸。 mmap 需要 4 次上下文切換,3 次數據拷貝;sendFile 需要 3 次上下文切換,最少 2 次數據拷貝。 sendFile 可以利用 DMA 方式,減少 CPU 拷貝,mmap 則不能(必須從內核拷貝到 Socket 緩沖區)。

內存映射文件

內存映射文件,是指文件和內存邏輯地址映射起來。 mmap()返回一個指針ptr,可以通過指針進行讀寫,而不必通過read()或者write() ptr指向一個邏輯地址,需要MMU把邏輯地址轉換成物理地址。

mmap,和 read,write的區別,mmap減少了哪一次拷貝?

1:mmap是一種內存映射文件的方法,即將一個文件映射到進程的地址空間,實現文件磁盤地址和進程地址空間之間的映射 2:進程就可以使用指針讀寫這一段內存,而系統會自動回寫臟頁面到對應的文件磁盤上,不必再調用read,write等系統調用函數。 相反,內核空間對這段地址區域的修改也直接反映到用戶空間,從而可以實現不同進程間的文件共享區別: 系統調用read(), 讀文件時需要先將文件頁從磁盤拷貝到頁緩存中,由于頁緩存處在內核空間,不能被用戶進程直接尋址,所以還需要將頁緩存中數據頁再次拷貝到內存對應的用戶空間中。 這樣,通過了兩次數據拷貝過程,才能完成進程對文件內容的獲取任務。 write() 寫操作也是一樣,也是需要兩次數據拷貝而使用mmap操作文件中,創建新的虛擬內存區域和建立文件磁盤地址和虛擬內存區域映射這兩步,沒有任何文件拷貝操作。 而之后訪問數據時發現內存中并無數據而發起的缺頁異常過程,可以通過已經建立好的映射關系,只使用一次數據拷貝,就從磁盤中將數據傳入內存的用戶空間中,供進程使用。

Redis速度快的原因?
單線程會有什么問題?

單進程單線程弊端 無法發揮多核CPU性能,不過可以通過在單機開多個Redis實例來完善;

然后問io多路復用,epoll模型的過程? 使用什么數據結構
eventpoll結構體

用戶態與核心態
拜占庭算法

拜占庭問題又叫拜占庭將軍問題,討論的是允許存在少數節點作惡(消息可能被偽造)場景下的如何達成共識問題。 拜占庭容錯(Byzantine Fault Tolerant,BFT)討論的是容忍拜占庭錯誤的共識算法

大數據相關問題,我不會
為什么使用B+樹?
覆蓋索引

性別上建索引會用到嗎? 重復度超過30%不會走索引
ACID特性
幻影讀
bin log/ redo log的區別

算法,最長回文子串

數據服務部門,做大數據的

java技術棧,spring, spring cloud, mysql, redis,卡夫卡,然后還有大數據的開發的工具,比如hadoop啥的

9.3 二面

Spring
Servlet的生命周期
ArrayList插入元素時其他元素怎么移動?
LinkedHashMap的實現,這次加深了理解了
Java中樂觀鎖悲觀鎖,各自怎么實現?有什么優缺點?
Mysql中的語句

算法:計數器
int calculate(String exp)
exp = “3-125+34*5”

正整數 ±*

#coding=utf-8 import sys #str = raw_input() import collectionsdef mul(exp):res = 0i = 0stack = []while i < len(exp):if '0'<=exp[i]<='9':start = iwhile i < len(exp) and '0' <= exp[i] <= '9':i += 1stack.append(int(exp[start: i]))i -= 1else:if len(stack) >= 2:res *= (stack.pop() * stack.pop())i += 1return resexp = '9*2*3*2' print(mul(exp))def calculate(exp):s1 = exp.split('+') # "3-12*5, 3*4*5"s2 = []for s in s1:s3 = s.split('-') # 3 12*5, 3*4*5s2.append(s3)mapp = collections.defaultdict()for ex in s2:if '*' in ex:mapp[ex] = mul(ex)for key, value in mapp: # 3-60+60exp.replace(key, value)res = 0i = 0sign = [1]while i < len(exp):if '0'<=exp[i]<='9':start = iwhile i < len(exp) and '0' <= exp[i] <= '9':i += 1res += (sign.pop()* int(exp[start: i]))i -= 1elif exp[i] == '+':sign.append(1)elif exp[i] == '-':sign.append(-1)i += 1return res

重寫了一下!

def calExp(strs):if not strs: return []stack1 = []stack2 = []i = 0while i < len(strs):if '0' <= strs[i] <= '9':start = iwhile i < len(strs) and '0' <= strs[i] <= '9':i += 1num = int(strs[start:i])stack1.append(num)i -= 1elif strs[i] == '+' or strs[i] == '-':stack2.append(strs[i])elif strs[i] == '*':pre = stack1.pop()i = i + 1start = iwhile i < len(strs) and '0' <= strs[i] <= '9':i += 1#print(start, i)cur = int(strs[start: i])print(start, i, cur)stack1.append(pre*cur)i -= 1i += 1stack1.reverse()stack2.reverse()while stack1 and stack2:first = stack1.pop()second = stack1.pop()op = stack2.pop()if op == '+':stack1.append(first + second)else:stack1.append(first - second)return stack1[0]strs = '90+8*3*40-9-19+23' res = calExp(strs) print(res)''' 90+8*3*40-9-19+23數字 stack1 = [90, 8] 操作 stack2 = [+]'''

總結

以上是生活随笔為你收集整理的快手提前批--Java开发面经的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。