快手提前批--Java开发面经
一面
泊松分布下,出現8次的概率已經非常低了
hashmap在jdk1.8中的變化? 如何實現解決死循環? 經常問
參考鏈接
hashMap很不錯的總結
hashMap在Jdk1.7中為何出現死循環?
https://blog.csdn.net/qq_36520235/article/details/86653136
CAS與ABA問題?什么時候出現ABA問題?
空間擔保失敗
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速度快的原因?
單線程會有什么問題?
然后問io多路復用,epoll模型的過程? 使用什么數據結構
eventpoll結構體
用戶態與核心態
拜占庭算法
大數據相關問題,我不會
為什么使用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开发面经的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: PIC16F877A单片机 (中断与定时
- 下一篇: 京东疯狂月薪36k程序员最新Java面试