百度Java电面一面面经
百度Java電面一面面經(jīng)
最近開始刷面經(jīng)。
首先聲明這個面經(jīng)不是我的,是牛客上的大佬發(fā)出來的,然后沒有答案,我把答案整理出來,因為很多你看上去知道,但真要你說就不知道如何開口,我先整理出答案,如果下次遇到就可以有思路去回答,這里面的答案只是自己的看法,具體的內(nèi)容在其他分類博客也有總結(jié)。
面經(jīng)原地址:百度Java電面一面
如果需要看面經(jīng),牛客有個帖子也整理了不同方法的面經(jīng)—— 2020秋招面經(jīng)大匯總!(崗位劃分)
目錄
(2)volatile修飾long變量,修飾一個數(shù)組能否保證內(nèi)存可見性
(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 時就會被回收。缺點是
復(fù)制算法:按照容量劃分兩個大小相同的內(nèi)存區(qū)域,當(dāng)一塊用完的時候?qū)⒒钪膶ο髲?fù)制到另一塊上,然后再把已使用的內(nèi)存空間一次清理掉。缺點:內(nèi)存利用率不高,只有原來的一半。
標(biāo)記-清除算法:從根集合開始掃描,對存活的對象進(jìn)行標(biāo)記。掃描整個內(nèi)存空間,回收未標(biāo)記的對象。缺點:
標(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))
插入和刪除是否受元素位置的影響:
是否支持快速隨機(jī)訪問:LinkedList 不支持高效的隨機(jī)元素訪問,而 ArrayList支持快速隨機(jī)訪問。快速隨機(jī)訪問就是通過元素的序號快速獲取元素對象。
內(nèi)存空間占用:ArrayList 的空間浪費主要體現(xiàn)在 list列表的尾部會預(yù)留一定的容量空間,而 LinkedList的空間花費則體現(xiàn)在它的每一個元素都需要消耗比 ArrayList 更多的空間(因為要存放直接后繼和直接前驅(qū)以及數(shù)據(jù))
適用場景
具體可以參考博客:ArrayList與LinkedList區(qū)別源碼分析
5. HashMap與HashSet有什么區(qū)別,兩者在查詢某個值的效率上是否有區(qū)別
| 接口實現(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+紅黑樹。
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)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Spring/SpingMVC常见问题总
- 下一篇: 面经——Java基础