2020上半年百度Android崗(初級到高級)面試真題全收錄+解析,備戰金九銀十!(上篇)

版權聲明:本文爲博主原創文章,首發簡書。未經博主容許不得轉載。 https://www.jianshu.com/u/3348b92f77a4 java

前言

今天給你們帶來的是百度2020上半年網友分享以及我我的收錄的面試真題大全。而且花了大量時間爲你們尋找到了最佳的答案解析。但願能夠收到幫助到你們。喜歡的朋友能夠點個贊支持一下,謝謝。git

Java相關

一、HashMap 有用過嗎?您能給我說說他的主要用途嗎?程序員

有用過,我在日常工做中常常會用到HashMap 這種數據結構,HashMap 是基於Map 接口實現的一種鍵-值對<key,value>的存儲結構,容許null 值,同時非有序,非同步(即線程不安全)。HashMap 的底層實現是數組+ 鏈表+ 紅黑樹(JDK1.8 增長了紅黑樹部分)。它存儲和查找數據時,是根據鍵key 的hashCode的值計算出具體的存儲位置。HashMap 最多隻容許一條記錄的鍵key 爲null,HashMap 增刪改查等常規操做都有不錯的執行效率,是ArrayList 和LinkedList等數據結構的一種折中實現。面試

二、說一說本身對於synchronized 關鍵字的瞭解算法

synchronized 關鍵字解決的是多個線程之間訪問資源的同步性,synchronized關鍵字能夠保證被它修飾的方法或者代碼塊在任意時刻只能有一個線程執行。另外,在Java 早期版本中,synchronized 屬於重量級鎖,效率低下,由於監視器鎖(monitor)是依賴於底層的操做系統的Mutex Lock 來實現的,Java 的線程是映射到操做系統的原生線程之上的。若是要掛起或者喚醒一個線程,都須要操做系統幫忙完成,而操做系統實現線程之間的切換時須要從用戶態轉換到內核態,這個狀態之間的轉換須要相對比較長的時間,時間成本相對較高,這也是爲何早期的synchronized 效率低的緣由。慶幸的是在Java 6 以後Java 官方對從JVM 層面對synchronized 較大優化,因此如今的synchronized 鎖效率也優化得很不錯了。JDK1.6 對鎖的實現引入了大量的優化,如自旋鎖、適應性自旋鎖、鎖消除、鎖粗化、偏向鎖、輕量級鎖等技術來減小鎖操做的開銷。數據庫

三、synchronized 和volatile 、ReentrantLock 、CAS 的區別。編程

這個問題被問頻率不在HashMap 之下,由於併發編程,真的很重要。能問到這幾個點的方式真的是太多了,咱們能發揮的空間也一樣很大。CAS 的ABA 問題?上面幾個東西的特性?使用場景?大概我不用再例舉了吧?對了,我屢次被問到的一個問題是:synchronized 修飾實例方法和修飾靜態方法有啥不同。設計模式

四、String、StringBuffer、StringBuilder 區別數組

都是字符串類,String 類中使用字符數組保存字符串,因有final 修飾符,String 對象是不可變的,每次對String 操做都會生成新的String 對象,這樣效率低,且浪費內存空間。但線程安全。StringBuilder 和StringBuffer 也是使用字符數組保存字符,但這兩種對象都是可變的,即對字符串進行append 操做,不會產生新的對象。它們的區別是:StringBuffer 對方法加了同步鎖,是線程安全的,StringBuilder 非線程安全。瀏覽器

五、進程和線程的區別

進程:具備必定獨立功能的程序,是系統進行資源分配和調度運行的基本單位。 線程:進程的一個實體,是CPU 調度的苯單位,也是進程中執行運算的最小單位,即執行處理機調度的基本單位,若是把進程理解爲邏輯上操做系統所完成的任務,線程則表示完成該任務的許多可能的子任務之一。 關係:一個進程可有多個線程,至少一個;一個線程只能屬於一個進程。同一進程的全部線 程共享該進程的全部資源。不一樣進程的線程間要利用消息通訊方式實現同步。 區別:進程有獨立的地址空間,而多個線程共享內存;進程具備一個獨立功能的程序,線程不能 獨立運行,必須依存於應用程序中;

六、序列化Serializable 和Parcelable 的區別

序列化:將一個對象轉換成可存儲或可傳輸的狀態,序列化後的對象能夠在網絡上傳輸,也 能夠存儲到本地,或實現跨進程傳輸; Serializable:表示將一個對象轉換成可存儲或可傳輸的狀態。 Parcelable:與Serializable 實現的效果相同,也是將一個對象轉換成可傳輸的狀態,但它的實現原理是將一個完整的對象進行分解,分解後的每一部分都是Intent 所支持的數據類型,這樣實現傳遞對象的功能。 區別:Serializable 在序列化時會產生大量臨時變量,引發頻繁GC。Serializable 本質上使用了反射,序列化過程慢。Parcelable 不能將數據存儲在磁盤上,在外界變化時,它不能很好的保證數據的持續性。

七、靜態代理和動態代理的區別,什麼場景使用?

代理是一種經常使用的設計模式,目的是:爲其餘對象提供一個代理以控制對某個對象的訪問,將兩個類的關係解耦。代理類和委託類都要實現相同的接口,由於代理真正調用的是委託類的方法。 區別: 1)靜態代理:由程序員建立或是由特定工具生成,在代碼編譯時就肯定了被代理的類是哪個是靜態代理。靜態代理一般只代理一個類; 2)動態代理:在代碼運行期間,運用反射機制動態建立生成。動態代理代理的是一個接口下的多個實現類; 實現步驟:a.實現InvocationHandler 接口建立本身的調用處理器;b.給Proxy 類提供ClassLoader 和代理接口類型數組建立動態代理類;c.利用反射機制獲得動態代理類的構造函數;d.利用動態代理類的構造函數建立動態代理類對象; 使用場景:Retrofit 中直接調用接口的方法;Spring 的AOP 機制

八、說說你對Java 反射的理解

在運行狀態中,對任意一個類,都能知道這個類的全部屬性和方法,對任意一個對象,都能調用它的任意一個方法和屬性。這種能動態獲取信息及動態調用對象方法的功能稱爲java語言的反射機制。 反射的做用:開發過程當中,常常會遇到某個類的某個成員變量、方法或屬性是私有的,或只對系統應用開放,這裏就能夠利用java 的反射機制經過反射來獲取所需的私有成員或是方法。

九、說一下泛型原理

泛型就是將類型變成參數傳入,使得可使用的類型多樣化,從而實現解耦。Java 泛型是在Java1.5 之後出現的,爲保持對之前版本的兼容,使用了擦除的方法實現泛型。擦除是指在必定程度無視類型參數T,直接從T 所在的類開始向上T 的父類去擦除,如調用泛型方法,傳入類型參數T 進入方法內部,若沒在聲明時作相似public T methodName(T extends Fathert){},Java 就進行了向上類型的擦除,直接把參數t 當作Object 類來處理,而不是傳進去的T。即在有泛型的任何類和方法內部,它都沒法知道本身的泛型參數,擦除和轉型都是在邊界上發生,即傳進去的參在進入類或方法時被擦除掉,但傳出來的時候又被轉成了咱們設置的T。在泛型類或方法內,任何涉及到具體類型(即擦除後的類型的子類)操做都不能進行,如new T(),或者T.play()(play 爲某子類的方法而不是擦除後的類的方法)

十、哪些狀況下的對象會被垃圾回收機制處理掉?

利用可達性分析算法,虛擬機會將一些對象定義爲GC Roots,從GC Roots 出發沿着引用鏈 向下尋找,若是某個對象不能經過GC Roots 尋找到,虛擬機就認爲該對象能夠被回收掉。

十一、談談你對解析與分派的認識。

解析指方法在運行前,即編譯期間就可知的,有一個肯定的版本,運行期間也不會改變。解析是靜態的,在類加載的解析階段就可將符號引用轉變成直接引用。 分派可分爲靜態分派和動態分派,重載屬於靜態分派,覆蓋屬於動態分派。靜態分派是指在重載時經過參數的靜態類型而非實際類型做爲判斷依據,在編譯階段,編譯器可根據參數的 靜態類型決定使用哪個重載版本。動態分派則須要根據實際類型來調用相應的方法。

十二、線程中sleep 和wait 的區別

(1)這兩個方法來自不一樣的類,sleep 是來自Thread,wait 是來自Object; (2)sleep 方法沒有釋放鎖,而wait 方法釋放了鎖。 (3)wait,notify,notifyAll 只能在同步控制方法或者同步控制塊裏面使用,而sleep 能夠在任何地 方使用。

1三、Thread 中的start()和run()方法有什麼區別

start()方法是用來啓動新建立的線程,而start()內部調用了run()方法,這和直接調用run()方法是不同的,若是直接調用run()方法,則和普通的方法沒有什麼區別。

1四、Jvm 內存區域是如何劃分的?

程序計數器:當前線程的字節碼執行位置的指示器,線程私有。 Java 虛擬機棧:描述的Java 方法執行的內存模型,每一個方法在執行的同時會建立一個棧幀,存儲着局部變量、操做數棧、動態連接和方法出口等,線程私有。 本地方法棧:本地方法執行的內存模型,線程私有。 Java 堆:全部對象實例分配的區域。 方法區:全部已經被虛擬機加載的類的信息、常量、靜態變量和即時編輯器編譯後的代碼數據。

1五、GC 的經常使用算法?

  • 標記- 清除:首先標記出須要回收的對象,標記完成後統一回收全部被標記的對象。容易產生碎片空間。
  • 複製算法:它將可用的內存分爲兩塊,每次只用其中的一塊,當須要內存回收的時候,將存活的對象複製到另外一塊內存,而後將當前已經使用的內存一次性回收掉。須要浪費一半的內存。
  • 標記- 整理:讓存活的對象向一端移動,以後清除邊界外的內存。
  • 分代蒐集:根據對象存活的週期,Java 堆會被分爲新生代和老年代,根據不一樣年代的特性,選擇合適的GC 收集算法。

1六、說一下四種引用以及他們的區別?

  • 強引用:強引用還在,垃圾蒐集器就不會回收被引用的對象。
  • 軟引用:對於軟引用關聯的對象,在系統發生內存溢出異常以前,將會把這些對象列進回收範圍進行第二次回收,若是此次回收尚未足夠的內存,纔會拋出內存溢出異常。
  • 弱引用:被若引用關聯的對象只能存活到下一次GC 以前。
  • 虛引用:爲對象設置虛引用的目的僅僅是爲了GC 以前收到一個系統通知。

1七、類加載的過程?

類加載的過程能夠分爲:

  1. 加載:將類的全限定名轉化爲二進制流,再將二進制流轉化爲方法區中的類型信息,從而生成一個Class 對象。
  2. 驗證:對類的驗證,包括格式、字節碼、屬性等。
  3. 準備:爲類變量分配內存並設置初始值。
  4. 解析:將常量池的符號引用轉化爲直接引用。
  5. 初始化:執行類中定義的Java 程序代碼,包括類變量的賦值動做和構造函數的賦值。
  6. 使用
  7. 卸載

只有加載、驗證、準備、初始化和卸載的這個五個階段的順序是肯定的。

看個mm放鬆一下

計算機網絡相關

一、HTTP 是哪一層的協議,常見的HTTP 狀態碼有哪些,分別表明什麼意思?

HTTP 協議是應用層的協議。 常見的HTTP 狀態碼有:

二、HTTP 1.1 和HTTP 2 有什麼區別?

HTTP 2.0 基於HTTP 1.1,與HTTP 2.0 增長了: 1.二進制格式:HTTP 1.1 使用純文本進行通訊,HTTP 2.0 使用二進制進行傳輸。 2.Head 壓縮:對已經發送的Header 使用鍵值創建索引表,相同的Header 使用索引表示。 3.服務器推送:服務器能夠進行主動推送 4.多路複用:一個TCP 鏈接能夠劃分紅多個流,每一個流都會分配Id,客戶端能夠藉助流和服務端創建全雙工進行通訊,而且流具備優先級。

三、HTTP 和HTTPS 有什麼區別?

簡單來講,HTTP 和HTTPS 的關係是這樣的:HTTPS = HTTP + SSL/TLS 區別以下: HTTP 做用於應用層,使用80 端口,起始地址是http://,明文傳輸,消息容易被攔截,串改。 HTTPS 做用域傳輸層,使用443 端口,起始地址是https://,須要下載CA 證書,傳輸的過程須要加密,安全性高。

四、爲何鏈接的時候是三次握手,關閉的時候倒是四次揮手?

爲當Server 端收到Client 端的SYN 鏈接請求報文後,能夠直接發送SYN+ACK報文,其中ACK 報文是用來應答的,SYN 報文是用來同步的。可是關閉鏈接時,當Server 端收到FIN 報文時,極可能並不會當即關閉SOCKET,因此只能先回復一個ACK 報文,告訴Client 端,"你發的FIN 報文我收到了"。只有等到我Server 端全部的報文都發送完了,我才能發送FIN 報文,所以不能一塊兒發送。故須要四步揮手。

五、OKHttp的特色和缺點

特色: 1.相較於Volley,它的最大併發量爲64 2.使用鏈接池技術,支持5 個併發的socket 鏈接默認keepAlive 時間爲5 分鐘,解決TCP 握手和揮手的效率問題,減小握手次數 3.支持Gzip 壓縮,且操做對用戶透明,能夠經過header 設置,在發起請求的時候自動加入headerAccept-Encoding: gzip,而咱們的服務器返回的時候header中有Content-Encoding: gzip 4.利用響應緩存來避免重複的網絡請求 5.很方便的添加攔截器,一般狀況下,攔截器用來添加,移除,轉換請求和響應的頭部信息,好比添加公參等 6.請求失敗,自動重連,發生異常時重連,看源碼調用recover 方法重連了一次 7.支持SPDY 協議(SPDY 是Google 開發的基於TCP 的應用層協議,用以最小化網絡延遲,提高網絡速度,優化用戶的網絡使用體驗。SPDY 並非一種用於替代HTTP 的協議,而是對HTTP 協議的加強。新協議的功能包括數據流的多路複用、請求優先級以及HTTP 報頭壓縮。谷歌表示,引入SPDY 協議後,在實驗室測試中頁面加載速度比原先快64%) 8.使用Okio 來簡化數據的訪問與存儲,提升性能 缺點: 1.消息回來須要切到主線程,主線程要本身去寫。 2.調用比較複雜,須要本身進行封裝。 3.緩存失效:網絡請求時通常都會獲取手機的一些硬件或網絡信息,好比使用的網絡環境。同時爲了信息傳輸的安全性,可能還會對請求進行加密。在這些狀況下OkHttp 的緩存系統就會失效了,致使用戶在無網絡狀況下不能訪問緩存。

六、WebSocket 與Socket 的區別

爲了解決Web 端即時通信的需求就出現了WebSocket WebSocket 與Socket 的區別: Socket 是傳輸控制層的接口。用戶能夠經過Socket 來操做底層TCP/IP 協議族通訊。 WebSocket 是一個完整應用層協議。 Socket 更靈活,WebSocket 更易用。 二者都能作即時通信複製代碼

七、請解釋安卓爲何要加簽名機制?

爲何要簽名: 1.發送者的身份認證 2.保證信息傳輸的完整性 3.防止交易中的抵賴發生 給apk 簽名能夠帶來如下好處 1.應用程序升級 2.應用程序模塊化 3.代碼或者數據共享 簽名的說明 1.全部的應用程序都必須有數字證書 2.Android 程序包使用的數字證書能夠是自簽名的 3.使用一個合適的私鑰生成的數字證書來給程序簽名 4.數字證書都是有有效期的

八、TCP 和UDP 有什麼區別?

  • TCP:基於字節流、面向鏈接、可靠、可以進行全雙工通訊,除此之外,還能進行流量控制和擁塞控制,不過效率略低
  • UDP:基於報文、面向無鏈接、不可靠,可是傳輸效率高。

九、TCP 爲何是一種可靠的協議?如何作到流量控制和擁塞控制?

  • TCP 可靠:是由於能夠作到數據包發送的有序、無差錯和無重複。
  • 流量控制:是經過滑動窗口實現的,由於發送發和接收方消息發送速度和接收速度不必定對等,因此須要一個滑動窗口來平衡處理效率,而且保證沒有差錯和有序的接收數據包。
  • 擁塞控制:慢開始和擁塞避免、快重傳和快恢復算法。這寫算法主要是爲了適應網 絡中的帶寬而做出的調整。

十、如何驗證證書的合法性?

證書的安全性 證書存在的目的就是避免中間人攻擊,避免發生經典的傳令兵問題 由CA 組織承認的根證書Root 簽發的 DV Digital Verification、OV Organization Verification、EV Extended Verification 證書是須要預裝的,特別是根證書。 證書的校驗

  • 證書是否爲值得信任的有效證書。是否爲信任根(瀏覽器內置有信任的根證書)或信任根的二級證書機構頒發的。是否爲信任根(瀏覽器內置有信任的根證書)或信任根的二級證書機構頒發的。
  • 對方是否持有證書對應的私鑰。驗證方式有兩種: o 對方簽名,瀏覽器用證書對簽名進行驗證。 o 使用證書做爲信封,判斷對方是否可以解開。 檢查流程: 1.客戶端發送信息,帶上支持的SSL 或者TLS 版本(不一樣瀏覽器支持程* * 度不一樣)。 2.服務器返回確認使用的加密通訊協議版本以及加密隨機數和CA 證書。 3.瀏覽器驗證證書(存在雙向驗證和單項驗證) -> OCSP 或者CRL * 結合自帶truststore。 4.檢查CA 證書的根證書頒發機構是否受瀏覽器信任。 5.檢查CA 證書中的證書吊銷列表,檢查證書是否被吊銷。 6.檢查CA 證書是否在有效期內。 7.檢查部署CA 證書的網站域名與證書頒發的域名是否一致。 8.瀏覽器覈對該網站是否存在於欺詐網站數據庫中。

草草收尾

寫着寫着發現篇幅太長,寫不下了,因此放到下一篇講了,喜歡的小夥伴能夠點個收藏關注,插個眼,下集在個人主頁,立刻更新~

BATJ大廠面試真題收錄大全PDF電子書已上傳在石墨文檔:【BATJ面試大全】須要的小夥伴自取就行了。別忘了給文章點個贊~

相關文章
相關標籤/搜索