百度Java面试题及答案(2022最新版)
其他互聯(lián)網(wǎng)大廠面試題
1:阿里巴巴Java面試題
2:阿里云Java面試題-實習(xí)生崗
3:騰訊Java面試題-高級
4:字節(jié)跳動Java面試題
5:字節(jié)跳動Java面試題-大數(shù)據(jù)方向
6:百度Java面試題
7:螞蟻金服Java面試題-中級
8:螞蟻金服Java面試題-高級
9:京東Java面試題-中級
10:拼多多Java面試題-電商部
11:商湯科技Java面試題
12:中軟國際Java面試題-初級
13:唯品會Java面試題
14:攜程Java面試題-高級
15:軟通動力Java面試題
下載鏈接:全部大廠面試題及答案PDF
1.int a=10是原子操作嗎?
是的。
注意點:
i++(或++i)是非原子操作,i++是一個多步操作,而且是可以被中斷的。i++可以被分割成3步,第一步讀取i的值,第二步計算i+1;第三部將最終值賦值給i。
- int a = b;不是原子操作。從語法的級別來看,這是也是一條語句,是原子的;但是從實際執(zhí)行的二進制指令來看,由于現(xiàn)代計算機CPU架構(gòu)體系的限制,數(shù)據(jù)不可以直接從內(nèi)存搬運到另外一塊內(nèi)存,必須借助寄存器中斷,這條語句一般對應(yīng)兩條計算機指令,即將變量b的值搬運到某個寄存器(如eax)中,再從該寄存器搬運到變量a的內(nèi)存地址:
既然是兩條指令,那么多個線程在執(zhí)行這兩條指令時,某個線程可能會在第一條指令執(zhí)行完畢后被剝奪CPU時間片,切換到另外一個線程而產(chǎn)生不確定的情況。
2.innodb支持全文索引嗎?
5.6版本之后InnoDB存儲引擎開始支持全文索引,5.7版本之后通過使用ngram插件開始支持中文。之前僅支持英文,因為是通過空格作為分詞的分隔符,對于中文來說是不合適的。MySQL允許在char、varchar、text類型上建立全文索引。
3.innodb支持表鎖嗎?
支持,補充:普通的增刪改 是表鎖,加入索引的增刪改是行鎖,執(zhí)行查詢時不加任何鎖的。
4.HTTP短連接怎么變成長連接。
在header中加入 --Connection:keep-alive。
5.調(diào)用yeild()會阻塞嗎?
阻塞指的是暫停一個線程的執(zhí)行以等待某個條件發(fā)生(如某資源就緒)。
yield() 方法:yield() 使得線程放棄當前分得的 CPU 時間,但是不使線程阻塞,即線程仍處于可執(zhí)行狀態(tài),隨時可能再次分得 CPU 時間。調(diào)用 yield() 的效果等價于調(diào)度程序認為該線程已執(zhí)行了足夠的時間從而轉(zhuǎn)到另一個線程。yield()只是使當前線程重新回到可執(zhí)行狀態(tài),所以執(zhí)行yield()的線程有可能在進入到可執(zhí)行狀態(tài)后馬上又被執(zhí)行。sleep()可使優(yōu)先級低的線程得到執(zhí)行的機會,當然也可以讓同優(yōu)先級和高優(yōu)先級的線程有執(zhí)行的機會;yield()只能使同優(yōu)先級的線程有執(zhí)行的機會。
6.虛擬機棧是線程共享的嗎?
不是。
JVM初始運行的時候都會分配好 Method Area(方法區(qū)) 和Heap(堆) ,而JVM 每遇到一個線程,就為其分配一個 Program Counter Register(程序計數(shù)器) , VM Stack(虛擬機棧)和Native Method Stack (本地方法棧), 當線程終止時,三者(虛擬機棧,本地方法棧和程序計數(shù)器)所占用的內(nèi)存空間也會被釋放掉。這也是為什么我把內(nèi)存區(qū)域分為線程共享和非線程共享的原因,非線程共享的那三個區(qū)域的生命周期與所屬線程相同,而線程共享的區(qū)域與JAVA程序運行的生命周期相同,所以這也是系統(tǒng)垃圾回收的場所只發(fā)生在線程共享的區(qū)域(實際上對大部分虛擬機來說只發(fā)生在Heap上)的原因。
棧區(qū):
每個線程包含一個棧區(qū),棧中只保存基礎(chǔ)數(shù)據(jù)類型的值(比如int i=1中1就是基礎(chǔ)類型的對象)和對象的引用以及基礎(chǔ)數(shù)據(jù)的引用
每個棧中的數(shù)據(jù)(基礎(chǔ)數(shù)據(jù)類型和對象引用)都是私有的,其他棧不能訪問。
棧分為3個部分:基本類型變量區(qū)、執(zhí)行環(huán)境上下文、操作指令區(qū)(存放操作指令)。
堆區(qū):
存儲的全部是對象,每個對象都包含一個與之對應(yīng)的class的信息。(class的目的是得到操作指令)
jvm只有一個堆區(qū)(heap)被所有線程共享,堆中不存放基本類型和對象引用,只存放對象本身 。
方法區(qū):
又叫靜態(tài)區(qū),跟堆一樣,被所有的線程共享。方法區(qū)包含所有的class和static變量。
方法區(qū)中包含的都是在整個程序中永遠唯一的元素,如class,static變量。(兩者區(qū)別為堆區(qū)存放new出來的對象信息,方法區(qū)存放本身就具有的類信息)
7.常量存放在JVM的那個區(qū)域?
方法區(qū): 又叫靜態(tài)區(qū),跟堆一樣,被所有的線程共享。它用于存儲已經(jīng)被虛擬機加載的類信息、常量、靜態(tài)變量、即時編譯器編譯后的代碼等數(shù)據(jù)。
window.postMessage() 方法可以安全地實現(xiàn)跨源通信。通常,對于兩個不同頁面的腳本,只有當執(zhí)行它們的頁面位于具有相同的協(xié)議(通常為https),端口號(443為https的默認值),以及主機 (兩個頁面的模數(shù) Document.domain設(shè)置為相同的值) 時,這兩個腳本才能相互通信。window.postMessage() 方法提供了一種受控機制來規(guī)避此限制,只要正確的使用,這種方法就很安全。
8.所有的對象都分配到堆中嗎?
答:不一定。
9.CopyOnWriteArrayList是線程安全的嗎?
答:是的。
CopyOnWriteArrayList使用了一種叫寫時復(fù)制的方法,當有新元素添加到CopyOnWriteArrayList時,先從原有的數(shù)組中拷貝一份出來,然后在新的數(shù)組做寫操作,寫完之后,再將原來的數(shù)組引用指向到新數(shù)組。創(chuàng)建新數(shù)組,并往新數(shù)組中加入一個新元素,這個時候,array這個引用仍然是指向原數(shù)組的。???????當元素在新數(shù)組添加成功后,將array這個引用指向新數(shù)組。
CopyOnWriteArrayList的整個add操作都是在鎖的保護下進行的。這樣做是為了避免在多線程并發(fā)add的時候,復(fù)制出多個副本出來,把數(shù)據(jù)搞亂了,導(dǎo)致最終的數(shù)組數(shù)據(jù)不是我們期望的。
public boolean add(E e) {//1、先加鎖final ReentrantLock lock = this.lock;lock.lock();try {Object[] elements = getArray();int len = elements.length;//2、拷貝數(shù)組Object[] newElements = Arrays.copyOf(elements, len + 1);//3、將元素加入到新數(shù)組中newElements[len] = e;//4、將array引用指向到新數(shù)組setArray(newElements);return true;} finally {//5、解鎖lock.unlock();} }由于所有的寫操作都是在新數(shù)組進行的,這個時候如果有線程并發(fā)的寫,則通過鎖來控制,如果有線程并發(fā)的讀,則分幾種情況:
如果寫操作未完成,那么直接讀取原數(shù)組的數(shù)據(jù);
如果寫操作完成,但是引用還未指向新數(shù)組,那么也是讀取原數(shù)組數(shù)據(jù);
如果寫操作完成,并且引用已經(jīng)指向了新的數(shù)組,那么直接從新數(shù)組中讀取數(shù)據(jù)。
可見,CopyOnWriteArrayList的讀操作是可以不用加鎖的。
CopyOnWriteArrayList 有幾個缺點:
由于寫操作的時候,需要拷貝數(shù)組,會消耗內(nèi)存,
如果原數(shù)組的內(nèi)容比較多的情況下,可能導(dǎo)致young gc或者full gc
不能用于實時讀的場景,像拷貝數(shù)組、新增元素都需要時間,
所以調(diào)用一個set操作后,讀取到數(shù)據(jù)可能還是舊的,
雖然CopyOnWriteArrayList 能做到最終一致性,但是還是沒法滿足實時性要求;
CopyOnWriteArrayList 合適讀多寫少的場景,不過這類慎用
因為誰也沒法保證CopyOnWriteArrayList 到底要放置多少數(shù)據(jù),
萬一數(shù)據(jù)稍微有點多,每次add/set都要重新復(fù)制數(shù)組,這個代價實在太高昂了。
在高性能的互聯(lián)網(wǎng)應(yīng)用中,這種操作分分鐘引起故障。
CopyOnWriteArrayList透露的思想
讀寫分離,讀和寫分開
最終一致性
使用另外開辟空間的思路,來解決并發(fā)沖突???????
10.數(shù)組越界問題
一般來講我們使用時,會用一個線程向容器中添加元素,一個線程來讀取元素,而讀取的操作往往更加頻繁。寫操作加鎖保證了線程安全,讀寫分離保證了讀操作的效率,簡直完美。
如果這時候有第三個線程進行刪除元素操作,讀線程去讀取容器中最后一個元素,讀之前的時候容器大小為i,當去讀的時候刪除線程突然刪除了一個元素,這個時候容器大小變?yōu)榱薸-1,讀線程仍然去讀取第i個元素,這時候就會發(fā)生數(shù)組越界。
測試一下,首先向CopyOnWriteArrayList里面塞10000個測試數(shù)據(jù),啟動兩個線程,一個不斷的刪除元素,一個不斷的讀取容器中最后一個數(shù)據(jù)。
public void test(){for(int i = 0; i<10000; i++){list.add("string" + i);}new Thread(new Runnable() {@Overridepublic void run() {while (true) {if (list.size() > 0) {String content = list.get(list.size() - 1);}else {break;}}}}).start();new Thread(new Runnable() {@Overridepublic void run() {while (true) {if(list.size() <= 0){break;}list.remove(0);try {Thread.sleep(10);} catch (InterruptedException e) {e.printStackTrace();}}}}).start();}11.Java接口可以多繼承嗎?
12.(byte)300==(byte)100+(short)200?
13.操作系統(tǒng)具有進程管理,存儲管理,文件管理和設(shè)備管理的功能,下列有關(guān)描述中,哪一項是不正確的? (A)
14.this和super正確的是(C):
15.引用計數(shù)法是JVM GC算法嗎?
16.能在try{}catch(){}finally{}結(jié)構(gòu)的finally{}中再次拋出異常嗎?
17.HTTP2新特性?
18.索引可以將隨機IO變成順序IO嗎?
19.transient修飾的變量是臨時變量嗎?
20.高、中、低三級調(diào)度。
21.TCP第四次揮手后為什么要等待2MSL后才斷開鏈接?等待時間為什么是2MSL?
22.進程有那些狀態(tài),并簡單描述一下?
23.創(chuàng)建NIO客戶端代碼
24.獲取一個類的class實例的方法有那些?
下載鏈接:博主已將以上這些大廠面試題整理成了一個面試手冊,是PDF版的
總結(jié)
以上是生活随笔為你收集整理的百度Java面试题及答案(2022最新版)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: php fckeditor,FCKedi
- 下一篇: creo图纸管理系统 creo企业图纸管