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

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程语言 > java >内容正文

java

百度Java电面一面面经

發(fā)布時間:2024/2/28 java 42 豆豆
生活随笔 收集整理的這篇文章主要介紹了 百度Java电面一面面经 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

百度Java電面一面面經(jīng)


最近開始刷面經(jīng)。

首先聲明這個面經(jīng)不是我的,是牛客上的大佬發(fā)出來的,然后沒有答案,我把答案整理出來,因為很多你看上去知道,但真要你說就不知道如何開口,我先整理出答案,如果下次遇到就可以有思路去回答,這里面的答案只是自己的看法,具體的內(nèi)容在其他分類博客也有總結(jié)。

面經(jīng)原地址:百度Java電面一面

如果需要看面經(jīng),牛客有個帖子也整理了不同方法的面經(jīng)—— 2020秋招面經(jīng)大匯總!(崗位劃分)


目錄

  • 自我介紹
  • 介紹一下項目
  • 講解一下GC過程,包括GC算法、常用的GC收集器工作原理,對象分配與晉身條件等等,相關(guān)的都一把梭。
  • 介紹一下Java集合,ArrayList與LinkedList有什么區(qū)別,分別有什么適用場景(高頻考點)
  • HashMap與HashSet有什么區(qū)別,兩者在查詢某個值的效率上是否有區(qū)別
  • ConcurrentHashMap原理,與HashMap有什么區(qū)別(高頻考點)
  • (1)volatile原理
    (2)volatile修飾long變量,修飾一個數(shù)組能否保證內(nèi)存可見性
  • (1)Mysql索引的底層實現(xiàn)原理。
    (2)(a,b,c)復(fù)合索引,(b,c)能不能用到索引
    (3)Mysql為什么要遵循最左匹配原則,可以從索引的底層實現(xiàn)來考慮。
  • 兩道算法題,口述思路即可。
    (1)求二叉樹的高度與寬度
    (2)求一個無序數(shù)組中是否存在兩個值相加等于給定值,然后是否存在3個值呢–twoSum, threeSum問題

  • 1. 自我介紹

    xxx


    2. 介紹一下項目

    xxx


    3. 講解一下GC過程,包括GC算法、常用的GC收集器工作原理,對象分配與晉身條件等等,相關(guān)的都一把梭。

    GC的過程:
  • 分代回收器有兩個分區(qū),分別為新生區(qū)和老年區(qū),新生代和老年代的默認(rèn)的空間占比為1:2;

  • 新生代使用的是復(fù)制算法,新生代里有3個分區(qū),Eden,To survivor,From survivor,默認(rèn)占比為8:1:1,當(dāng) Eden 區(qū)的空間用完時,程序又需要創(chuàng)建對象,JVM 的垃圾收回器就會執(zhí)行 minor GC。

    • 把 Eden + From 區(qū)存活的對象放到 to 區(qū);
    • 清空 Eden + from 區(qū);
    • From 區(qū)和 To 區(qū)交換,From 區(qū)變?yōu)?To 區(qū),To 區(qū)變?yōu)?From 區(qū)。
  • 每次 From 區(qū) 和 To 區(qū)移動時存活的對象,年齡就 +1,當(dāng)年齡到達(dá) 15(默認(rèn)為15),升級為老年代,大對象也會直接進(jìn)入老年代。

  • 老年代空間占比達(dá)到某個值之后就會觸發(fā)全局垃圾回收,一般是使用標(biāo)記整理算法。如果老年代執(zhí)行 full gc 依然無法進(jìn)行對象的保存,就會產(chǎn)生 OOM 異常。

  • 循環(huán)往復(fù)就構(gòu)成了整個分代垃圾收集器的執(zhí)行過程。

  • GC的算法
  • 引用計數(shù)法:每個對象維護(hù)一個引用計數(shù)器,當(dāng)對象被引用時計數(shù)器+1,當(dāng)引用的對象被釋放后計數(shù)器 -1,當(dāng)計數(shù)器為 0 時就會被回收。缺點是

  • 每次對對象賦值時均要維護(hù)引用計數(shù)器,且計數(shù)器本身也有一定的消耗。
  • 較難處理循環(huán)引用的問題。
  • 復(fù)制算法:按照容量劃分兩個大小相同的內(nèi)存區(qū)域,當(dāng)一塊用完的時候?qū)⒒钪膶ο髲?fù)制到另一塊上,然后再把已使用的內(nèi)存空間一次清理掉。缺點:內(nèi)存利用率不高,只有原來的一半。

  • 標(biāo)記-清除算法:從根集合開始掃描,對存活的對象進(jìn)行標(biāo)記。掃描整個內(nèi)存空間,回收未標(biāo)記的對象。缺點:

  • 兩次掃描,耗時嚴(yán)重。
  • 會產(chǎn)生內(nèi)存碎片。
  • 標(biāo)記-整理算法:從根集合開始掃描,對存活的對象進(jìn)行標(biāo)記。再次掃描,并往一端滑動存活的對象。優(yōu)點:沒有內(nèi)存碎片。缺點:需要移動對象的成本高。


  • 4. 介紹一下Java集合,ArrayList與LinkedList有什么區(qū)別,分別有什么適用場景(高頻考點)

    ArrayList與LinkedList區(qū)別
  • 是否保證線程安全:ArrayList 和 LinkedList 都是不同步的,不保證線程安全。

  • 底層數(shù)據(jù)結(jié)構(gòu):ArrayList 是基于動態(tài)數(shù)組的數(shù)據(jù)結(jié)構(gòu),實現(xiàn)了 list 接口。動態(tài)數(shù)組即如果沒有指定數(shù)組的大小,則默認(rèn)申請大小為10 的數(shù)組,當(dāng)元素個數(shù)增加,數(shù)據(jù)無法存儲,系統(tǒng)就會申請一個長度為當(dāng)前長度的1.5 倍的數(shù)組,然后把之前的數(shù)據(jù)拷貝到新建的數(shù)組中。LinkedList底層使用的是雙向鏈表數(shù)據(jù)結(jié)構(gòu)(JDK1.6之前為循環(huán)雙向鏈表,1.7 之后取消的循環(huán))

  • 插入和刪除是否受元素位置的影響:

  • ArrayList 采用數(shù)組存儲,所以插入和刪除的時間復(fù)雜度受元素位置的影響。比如添加到數(shù)組的指定位置,可能就會移動大量的數(shù)組元素,并可能觸發(fā)擴(kuò)容機(jī)制;如果是刪除數(shù)組指定位置的元素,那么可能會移動大量的元素;AarrayList 里面的刪除元素,就是將該位置置為null。
  • LinkedList 采用鏈表存儲,所以插入,刪除元素的時間復(fù)雜度不受元素位置的影響,都是近似為O(1),而數(shù)組的時間復(fù)雜度近似為O(n);
  • 是否支持快速隨機(jī)訪問:LinkedList 不支持高效的隨機(jī)元素訪問,而 ArrayList支持快速隨機(jī)訪問。快速隨機(jī)訪問就是通過元素的序號快速獲取元素對象。

  • 內(nèi)存空間占用:ArrayList 的空間浪費主要體現(xiàn)在 list列表的尾部會預(yù)留一定的容量空間,而 LinkedList的空間花費則體現(xiàn)在它的每一個元素都需要消耗比 ArrayList 更多的空間(因為要存放直接后繼和直接前驅(qū)以及數(shù)據(jù))

  • 適用場景
  • 如果應(yīng)用程序?qū)?shù)據(jù)有較多的隨機(jī)訪問,ArrayList要優(yōu)于LinkedList,因為LinedList要移動指針。
  • 如果應(yīng)用程序?qū)?shù)據(jù)更多的是插入或者刪除操作,較少讀取操作,LinkedList 要優(yōu)于 ArrayList,因為ArrayList 插入或者刪除數(shù)據(jù)后要移動數(shù)據(jù)。
  • 具體可以參考博客:ArrayList與LinkedList區(qū)別源碼分析


    5. HashMap與HashSet有什么區(qū)別,兩者在查詢某個值的效率上是否有區(qū)別

    HashMapHashSet
    接口實現(xiàn)HashMap實現(xiàn)了Map接口HashSet實現(xiàn)了Set接口
    存儲對象HashMap存儲鍵值對HashSet僅僅存儲對象,而且不允許集合中有重復(fù)的值
    添加方法HashMap使用put()方法將元素放入map中HashSet使用add() 方法將元素放入set中
    hashCode值計算HashMap使用鍵對象來計算hashCode值HashSet使用成員對象來計算hashCode值,對于兩個對象來說hashCode可能相同,所以equals()方法用來判斷對象的相等性,如果兩個對象不同,則返回false
    獲取對象速度HashMap比較快,因為使用唯一的鍵來獲取對象HashSet較HashMap來說比較慢

    ConcurrentHashMap原理,與HashMap有什么區(qū)別(高頻考點)

    ConcurrentHashMap的數(shù)據(jù)結(jié)構(gòu)已經(jīng)接近HashMap,相對而言,ConcurrentHashMap只是增加了同步的操作來控制并發(fā),從JDK1.7 版本的 ReentrantLock+Segment+HashEntry,到JDK1.8版本中的synchronized + CAS + HashEntry+紅黑樹。

  • 數(shù)據(jù)結(jié)構(gòu):取消了Segment分段鎖的數(shù)據(jù)結(jié)構(gòu),取而代之的是 數(shù)組+鏈表+紅黑樹的結(jié)構(gòu)。
  • 保證線程安全機(jī)制:JDK1.7采用segment的分段鎖機(jī)制實現(xiàn)線程安全,其中segment繼承自ReentrantLock。JDK1.8采用 CAS+synchronized來保證線程安全。
  • 鎖的粒度:JDK1.7對需要進(jìn)行數(shù)據(jù)操作的segment 加鎖,JDK1.8調(diào)整為對每個數(shù)組元素加鎖(Node)
  • 鏈表轉(zhuǎn)化為紅黑樹:定位節(jié)點的hash算法簡化會帶來弊端,Hash沖突加劇,因此在鏈表節(jié)點數(shù)量大于8時,會將鏈表轉(zhuǎn)化為紅黑樹進(jìn)行存儲。
  • 查詢時間復(fù)雜度:從原來的遍歷鏈表O(n),變成遍歷紅黑樹O(logN)
  • HashMap的特點之前詳見:HashMap源碼解析(JDK1.8)


    7. Volatile原理

    1. volatile原理
  • 保證可見性
  • 不保證原子性
  • 禁止指令重排
  • 詳細(xì)總結(jié)見博客:Java多線程之volatile詳解

    2. volatile修飾long變量,修飾一個數(shù)組能否保證內(nèi)存可見性

    volatile 修飾long遍歷,修飾一個數(shù)組都可以保證可見性。


    8. MySQL相關(guān)

    1)Mysql索引的底層實現(xiàn)原理。

    索引是幫助MySQL高效獲取數(shù)據(jù)的排好序的數(shù)據(jù)結(jié)構(gòu)。

    (2)(a,b,c)復(fù)合索引,(b,c)能不能用到索引
    (3)Mysql為什么要遵循最左匹配原則,可以從索引的底層實現(xiàn)來考慮。

    總結(jié)

    以上是生活随笔為你收集整理的百度Java电面一面面经的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。