百度2020春招Java開發實習生筆試_基礎部分總結

1.磁盤訪問-電梯算法SCAN

  • 電梯總是朝向一個方向運行,直到該方向上沒有請求爲止,然後再改變運行的方向;
  • 電梯算法解決了最短尋道優先SSTF算法中進程“飢餓”的現象,由於若一直有新的進程請求到達,且新進程的磁道請求距離當前進程較近,則導致老進程長期處於等待的“飢餓”狀態;

2.SQL語句-limit用法

  • limit用來限制返回的行數,可以有兩個參數,第一個參數爲起始行,從0開始,第二個參數爲返回的總行數;

  • 選取考試中前11~20名的同學;

    SELECT *
    FROM t_class_grade
    GROUP BY grade
    LIMIT 1010;
    

3.JVM-垃圾回收策略中垃圾收集器的作用範圍:

上圖展示了7種作用於不同分代的收集器,如果兩個收集器之間存在連線,就說明它們可以搭配使用。

新生代:

  • Serial收集器 :最基本,最悠久,單線程,工作時暫停其他所有的工作進程,Client模式默認GC-Collector;

  • ParNew收集器:Serial收集器的多線程版本,Server模式下的虛擬機中首選,能與CMS收集器配合工作;

  • Parallel Scavenge(並行回收)收集器:控制吞吐量,在ParNew之上實現了自適應調節策略;

老年代:

  • Serial Old 收集器:Serial Old是Serial收集器的老年代版本,它同樣是一個單線程收集器,使用標記整理算法。這個收集器的主要意義也是在於給Client模式下的虛擬機使用。
  • Parallel Old 收集器:Parallel Old 是Parallel Scavenge收集器的老年代版本,使用多線程和“標記-整理”算法。
  • CMS(Concurrent Mark Sweep)收集器:收集器是一種以獲取最短回收停頓時間爲目標的收集器。目前很大一部分的Java應用集中在互聯網站或者B/S系統的服務端上,這類應用尤其重視服務器的響應速度,希望系統停頓時間最短,以給用戶帶來較好的體驗。CMS收集器就非常符合這類應用的需求。優點:併發收集,低停頓

前沿成果(新生代&&老年代):

  • G1收集器

    優勢:(1)並行與併發(2)分代收集(3)空間整理 (標記整理算法,複製算法)(4)可預測的停頓;

    使用G1收集器時,Java堆的內存佈局是整個規劃爲多個大小相等的獨立區域(Region),雖然還保留有新生代和老年代的概念,但新生代和老年代不再是物理隔離的了,它們都是一部分Region的集合。

    G1收集器之所以能建立可預測的停頓時間模型,是因爲它可以有計劃地避免在整個Java堆中進行全區域的垃圾收集。G1跟蹤各個Region裏面的垃圾堆積的價值大小(回收所獲取的空間大小以及回收所需要的時間的經驗值),在後臺維護一個優先列表,每次根據允許的收集時間,優先回收價值最大的Region(這也就是Garbage-First名稱的又來)。這種使用Region劃分內存空間以及有優先級的區域回收方式,保證了G1收集器在有限的時間內可以獲取儘量可能高的收集效率;


4.在Java中,線程請求過多時,會觸發拒絕策略,各種拒絕策略的定義:

​ 線程池中,有三個重要的參數,決定影響了拒絕策略:corePoolSize - 核心線程數,也即最小的線程數。workQueue - 阻塞隊列 。 maximumPoolSize - 最大線程數

當提交任務數大於 corePoolSize 的時候,會優先將任務放到 workQueue 阻塞隊列中。當阻塞隊列飽和後,會擴充線程池中線程數,直到達到 maximumPoolSize 最大線程數配置。此時,再多餘的任務,則會觸發線程池的拒絕策略了。

總結,當提交的任務數大於(workQueue.size() + maximumPoolSize ),就會觸發線程池的拒絕策略

  • ThreadPoolExecutor.AbortPolicy:丟棄任務並拋出RejectedExecutionException異常。
  • ThreadPoolExecutor.DiscardPolicy:丟棄任務,但是不拋出異常。
  • ThreadPoolExecutor.DiscardOldestPolicy:丟棄隊列最前面的任務,然後重新提交被拒絕的任務
  • ThreadPoolExecutor.CallerRunsPolicy:由調用線程(提交任務的線程)處理該任務

5.分佈式鎖的實現方式:

  • 數據庫悲觀鎖,數據庫樂觀鎖

在這裏插入圖片描述

  • redis的setnx()、expire()方法,用於分佈式鎖

  • 基於zookeeper實現分佈式鎖


6.AOP的定義:

面向切面編程AOP是通過另一種程序結構的思維方式,對面向對象編程OOP方式進行擴展和補充。在OOP中的核心模塊是,而在AOP中的核心模塊是切面Aspects。

切面Aspects使得程序的關注點(如事務管理)的模塊化跨越多個類型和對象。(這種關注在AOP文獻中通常被稱爲“跨領域”關注。)

  • Pointcut,定義當前的橫切邏輯準備織入那些連接點,就是連接點的集合。
  • Advice:通知,就字面意思,但是有2個部分組成,通知內容和通知到哪裏去。
  • JoinPoint連接點:程序執行過程中的一個點,是指目標對象上定義的各個方法就是一個連接點,例如:方法執行或異常處理。
  • Aspect方面:涉及多個類別的關注點的模塊化,是一個用來封裝切點和通知的組件,包括連接點,切點,通知的一個載體。(如果用AspectJ它就是一個類,如果用springXML的時候它就是一個標籤)並且交給spring管理。事務管理是企業Java應用程序中橫切關注的一個很好的例子。

7.對字符串"Hello world"進行哈弗曼編碼後,最少佔多少bit空間?

  • 1.對"Hello world"按字符出現的頻率進行排序:
字符 l o " " h e w r d
頻率 3 2 1 1 1 1 1 1
  • 每次從中選取出現頻率最少的兩個字符合並:

在這裏插入圖片描述

  • 對其進行哈弗曼編碼:
字符 l o " " h e w r d
頻率 3 2 1 1 1 1 1 1
編碼 01 11 101 100 0010 0011 0000 0001
  • 計算使用哈弗曼編碼上述字符串佔用Bit總數=3x2 + 2x2 +(1 + 1)x3 + (1+1+1+1) x4 = 32bit

8.網絡數據傳輸中的粘包問題:

TCP是個"流"協議,所謂流,就是沒有界限的一串數據.大家可以想想河裏的流水,是連成一片的,其間是沒有分界線的。TCP保證的是數據流正確傳輸的機制,不管應用端怎麼去用這個數據。

這裏的“粘包”其實是應用程序中沒有處理好數據包分割,兩個應用層的數據包粘在一塊了。但一般通訊程序開發是需要定義一個個相互獨立的數據包的,比如用於登陸的數據包,用於註銷的數據包。由於TCP"流"的特性以及網絡狀況,在進行數據傳輸時會出現以下幾種情況。
假設我們連續調用兩次send分別發送兩段數據data1和data2,在接收端有以下幾種接收情況(當然不止這幾種情況,這裏只列出了有代表性的情況)。

  • A.先接收到data1,然後接收到data2.
  • B.先接收到data1的部分數據,然後接收到data1餘下的部分以及data2的全部.
  • C.先接收到了data1的全部數據和data2的部分數據,然後接收到了data2的餘下的數據.
  • D.一次性接收到了data1和data2的全部數據.

對於A這種情況正是我們需要的,不再做討論;

對於B,C,D的情況就是大家經常說的"粘包",就需要我們把接收到的數據進行拆包,拆成一個個獨立的數據包。爲了拆包就必須在發送端進行封包。

另:對於UDP來說就不存在拆包的問題,因爲UDP是個"數據包"協議,也就是兩段數據間是有界限的,在接收端要麼接收不到數據要麼就是接收一個完整的一段數據,不會少接收也不會多接收。

BCD這幾種情況出現的原因:發送端發送不及時,或者接收端接受不及時;

解決方法:

​ 1.減緩發送的速率;

​ 2.進行合理的封包和拆包(將消息頭分成消息頭和消息體,頭上包含消息的長度;發送固定長度的消息;增加結尾的定界符);


9.進程中線程所擁有資源的區別:

線程共享的資源包括:

​ 1.進程代碼段;

​ 2.進程的公有數據(利用這些共享的數據,線程很容易的實現相互之間的通訊,包括進程堆、全局變量等) ;

​ 3.進程打開的文件描述符、信號的處理器、進程的當前目錄和進程用戶ID與進程組ID。

線程獨佔的資源包括:

​ 1.線程ID:每個線程都有自己的線程ID,這個ID在本進程中是唯一的。進程用此來標識線程。

​ 2.寄存器組的值:由於線程間是併發運行的,每個線程有自己不同的運行線索,當從一個線程切換到另一個線程 上時,必須將原有的線程的寄存器集合的狀態保存,以便將來該線程在被重新切換到時能得以恢復。

​ 3.線程的堆棧:堆棧是保證線程獨立運行所必須的。線程函數可以調用函數,而被調用函數中又是可以層層嵌套 的,所以線程必須擁有自己的函數堆棧, 使得函數調用可以正常執行,不受其他線程的影響。

​ 4.錯誤返回碼:由於同一個進程中有很多個線程在同時運行,可能某個線程進行系統調用後設置了errno值,而 在該線程還沒有處理這個錯誤,另外一個線程就在此時被調度器投入運行,這樣錯誤值就有可能被修改。所以, 不同的線程應該擁有自己的錯誤返回碼變量。

​ 5.線程的信號屏蔽碼:由於每個線程所感興趣的信號不同,所以線程的信號屏蔽碼應該由線程自己管理。但所有 的線程都 共享同樣的信號處理器。

​ 6.線程的優先級:由於線程需要像進程那樣能夠被調度,那麼就必須要有可供調度使用的參數,這個參數就是線 程的優先級。

​ 7.程序計數器:表示線程程序當前執行程序執行的位置。


10.下列選項中,不可能是快速排序第2趟排序結果的是 ()

​ A. 2,3,5,4,6,7,9;

​ B. 2,7,5,6,4,3,9;

​ C. 3,2,5,4,7,6,9;

​ D. 4,2,3,5,7,6,9;

四個選項都是同樣的數組元素,若完全有序,應爲2345679
每經過一趟快排,軸點元素都必然就位,也就是說,一趟下來至少有1個元素在其最終位置
所以考察各個選項,看有幾個元素就位即可。
A:2、3、6、7、9
B:2、9
C:9
D:5、9
第二趟至少應有2個元素就位,所以C不對。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章