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

歡迎訪問 生活随笔!

生活随笔

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

java

百度Java面试题及答案(2022最新版)

發(fā)布時(shí)間:2024/8/1 java 31 豆豆
生活随笔 收集整理的這篇文章主要介紹了 百度Java面试题及答案(2022最新版) 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

其他互聯(lián)網(wǎng)大廠面試題

1:阿里巴巴Java面試題

2:阿里云Java面試題-實(shí)習(xí)生崗

3:騰訊Java面試題-高級(jí)

4:字節(jié)跳動(dòng)Java面試題

5:字節(jié)跳動(dòng)Java面試題-大數(shù)據(jù)方向

6:百度Java面試題

7:螞蟻金服Java面試題-中級(jí)

8:螞蟻金服Java面試題-高級(jí)

9:京東Java面試題-中級(jí)

10:拼多多Java面試題-電商部

11:商湯科技Java面試題

12:中軟國際Java面試題-初級(jí)

13:唯品會(huì)Java面試題

14:攜程Java面試題-高級(jí)

15:軟通動(dòng)力Java面試題


下載鏈接全部大廠面試題及答案PDF

1.int a=10是原子操作嗎?

是的。

注意點(diǎn):

i++(或++i)是非原子操作,i++是一個(gè)多步操作,而且是可以被中斷的。i++可以被分割成3步,第一步讀取i的值,第二步計(jì)算i+1;第三部將最終值賦值給i。

  • int a = b;不是原子操作。從語法的級(jí)別來看,這是也是一條語句,是原子的;但是從實(shí)際執(zhí)行的二進(jìn)制指令來看,由于現(xiàn)代計(jì)算機(jī)CPU架構(gòu)體系的限制,數(shù)據(jù)不可以直接從內(nèi)存搬運(yùn)到另外一塊內(nèi)存,必須借助寄存器中斷,這條語句一般對(duì)應(yīng)兩條計(jì)算機(jī)指令,即將變量b的值搬運(yùn)到某個(gè)寄存器(如eax)中,再從該寄存器搬運(yùn)到變量a的內(nèi)存地址:
mov eax, dword ptr [b] mov dword ptr [a], eax

既然是兩條指令,那么多個(gè)線程在執(zhí)行這兩條指令時(shí),某個(gè)線程可能會(huì)在第一條指令執(zhí)行完畢后被剝奪CPU時(shí)間片,切換到另外一個(gè)線程而產(chǎn)生不確定的情況。

2.innodb支持全文索引嗎?

5.6版本之后InnoDB存儲(chǔ)引擎開始支持全文索引,5.7版本之后通過使用ngram插件開始支持中文。之前僅支持英文,因?yàn)槭峭ㄟ^空格作為分詞的分隔符,對(duì)于中文來說是不合適的。MySQL允許在char、varchar、text類型上建立全文索引。

3.innodb支持表鎖嗎?

支持,補(bǔ)充:普通的增刪改 是表鎖,加入索引的增刪改是行鎖,執(zhí)行查詢時(shí)不加任何鎖的。

4.HTTP短連接怎么變成長連接。

在header中加入 --Connection:keep-alive。

5.調(diào)用yeild()會(huì)阻塞嗎?

阻塞指的是暫停一個(gè)線程的執(zhí)行以等待某個(gè)條件發(fā)生(如某資源就緒)。

yield() 方法:yield() 使得線程放棄當(dāng)前分得的 CPU 時(shí)間,但是不使線程阻塞,即線程仍處于可執(zhí)行狀態(tài),隨時(shí)可能再次分得 CPU 時(shí)間。調(diào)用 yield() 的效果等價(jià)于調(diào)度程序認(rèn)為該線程已執(zhí)行了足夠的時(shí)間從而轉(zhuǎn)到另一個(gè)線程。yield()只是使當(dāng)前線程重新回到可執(zhí)行狀態(tài),所以執(zhí)行yield()的線程有可能在進(jìn)入到可執(zhí)行狀態(tài)后馬上又被執(zhí)行。sleep()可使優(yōu)先級(jí)低的線程得到執(zhí)行的機(jī)會(huì),當(dāng)然也可以讓同優(yōu)先級(jí)和高優(yōu)先級(jí)的線程有執(zhí)行的機(jī)會(huì);yield()只能使同優(yōu)先級(jí)的線程有執(zhí)行的機(jī)會(huì)。

6.虛擬機(jī)棧是線程共享的嗎?

不是。

JVM初始運(yùn)行的時(shí)候都會(huì)分配好 Method Area(方法區(qū)) 和Heap(堆) ,而JVM 每遇到一個(gè)線程,就為其分配一個(gè) Program Counter Register(程序計(jì)數(shù)器) , VM Stack(虛擬機(jī)棧)和Native Method Stack (本地方法棧), 當(dāng)線程終止時(shí),三者(虛擬機(jī)棧,本地方法棧和程序計(jì)數(shù)器)所占用的內(nèi)存空間也會(huì)被釋放掉。這也是為什么我把內(nèi)存區(qū)域分為線程共享和非線程共享的原因,非線程共享的那三個(gè)區(qū)域的生命周期與所屬線程相同,而線程共享的區(qū)域與JAVA程序運(yùn)行的生命周期相同,所以這也是系統(tǒng)垃圾回收的場所只發(fā)生在線程共享的區(qū)域(實(shí)際上對(duì)大部分虛擬機(jī)來說只發(fā)生在Heap上)的原因。

棧區(qū):

每個(gè)線程包含一個(gè)棧區(qū),棧中只保存基礎(chǔ)數(shù)據(jù)類型的值(比如int i=1中1就是基礎(chǔ)類型的對(duì)象)和對(duì)象的引用以及基礎(chǔ)數(shù)據(jù)的引用

每個(gè)棧中的數(shù)據(jù)(基礎(chǔ)數(shù)據(jù)類型和對(duì)象引用)都是私有的,其他棧不能訪問。

棧分為3個(gè)部分:基本類型變量區(qū)、執(zhí)行環(huán)境上下文、操作指令區(qū)(存放操作指令)。

堆區(qū):

存儲(chǔ)的全部是對(duì)象,每個(gè)對(duì)象都包含一個(gè)與之對(duì)應(yīng)的class的信息。(class的目的是得到操作指令)
jvm只有一個(gè)堆區(qū)(heap)被所有線程共享,堆中不存放基本類型和對(duì)象引用,只存放對(duì)象本身 。

方法區(qū):

又叫靜態(tài)區(qū),跟堆一樣,被所有的線程共享。方法區(qū)包含所有的class和static變量。

方法區(qū)中包含的都是在整個(gè)程序中永遠(yuǎn)唯一的元素,如class,static變量。(兩者區(qū)別為堆區(qū)存放new出來的對(duì)象信息,方法區(qū)存放本身就具有的類信息)

7.常量存放在JVM的那個(gè)區(qū)域?

方法區(qū): 又叫靜態(tài)區(qū),跟堆一樣,被所有的線程共享。它用于存儲(chǔ)已經(jīng)被虛擬機(jī)加載的類信息、常量、靜態(tài)變量、即時(shí)編譯器編譯后的代碼等數(shù)據(jù)。

window.postMessage() 方法可以安全地實(shí)現(xiàn)跨源通信。通常,對(duì)于兩個(gè)不同頁面的腳本,只有當(dāng)執(zhí)行它們的頁面位于具有相同的協(xié)議(通常為https),端口號(hào)(443為https的默認(rèn)值),以及主機(jī) (兩個(gè)頁面的模數(shù) Document.domain設(shè)置為相同的值) 時(shí),這兩個(gè)腳本才能相互通信。window.postMessage() 方法提供了一種受控機(jī)制來規(guī)避此限制,只要正確的使用,這種方法就很安全。

8.所有的對(duì)象都分配到堆中嗎?

答:不一定。

9.CopyOnWriteArrayList是線程安全的嗎?

答:是的。

CopyOnWriteArrayList使用了一種叫寫時(shí)復(fù)制的方法,當(dāng)有新元素添加到CopyOnWriteArrayList時(shí),先從原有的數(shù)組中拷貝一份出來,然后在新的數(shù)組做寫操作,寫完之后,再將原來的數(shù)組引用指向到新數(shù)組。創(chuàng)建新數(shù)組,并往新數(shù)組中加入一個(gè)新元素,這個(gè)時(shí)候,array這個(gè)引用仍然是指向原數(shù)組的。???????當(dāng)元素在新數(shù)組添加成功后,將array這個(gè)引用指向新數(shù)組。

CopyOnWriteArrayList的整個(gè)add操作都是在鎖的保護(hù)下進(jìn)行的。這樣做是為了避免在多線程并發(fā)add的時(shí)候,復(fù)制出多個(gè)副本出來,把數(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ù)組進(jìn)行的,這個(gè)時(shí)候如果有線程并發(fā)的寫,則通過鎖來控制,如果有線程并發(fā)的讀,則分幾種情況:

如果寫操作未完成,那么直接讀取原數(shù)組的數(shù)據(jù);

如果寫操作完成,但是引用還未指向新數(shù)組,那么也是讀取原數(shù)組數(shù)據(jù);

如果寫操作完成,并且引用已經(jīng)指向了新的數(shù)組,那么直接從新數(shù)組中讀取數(shù)據(jù)。

可見,CopyOnWriteArrayList的讀操作是可以不用加鎖的。

CopyOnWriteArrayList 有幾個(gè)缺點(diǎn):

由于寫操作的時(shí)候,需要拷貝數(shù)組,會(huì)消耗內(nèi)存,

如果原數(shù)組的內(nèi)容比較多的情況下,可能導(dǎo)致young gc或者full gc

不能用于實(shí)時(shí)讀的場景,像拷貝數(shù)組、新增元素都需要時(shí)間,

所以調(diào)用一個(gè)set操作后,讀取到數(shù)據(jù)可能還是舊的,

雖然CopyOnWriteArrayList 能做到最終一致性,但是還是沒法滿足實(shí)時(shí)性要求;

CopyOnWriteArrayList 合適讀多寫少的場景,不過這類慎用

因?yàn)檎l也沒法保證CopyOnWriteArrayList 到底要放置多少數(shù)據(jù),

萬一數(shù)據(jù)稍微有點(diǎn)多,每次add/set都要重新復(fù)制數(shù)組,這個(gè)代價(jià)實(shí)在太高昂了。

在高性能的互聯(lián)網(wǎng)應(yīng)用中,這種操作分分鐘引起故障。

CopyOnWriteArrayList透露的思想

讀寫分離,讀和寫分開
最終一致性
使用另外開辟空間的思路,來解決并發(fā)沖突???????

10.數(shù)組越界問題

一般來講我們使用時(shí),會(huì)用一個(gè)線程向容器中添加元素,一個(gè)線程來讀取元素,而讀取的操作往往更加頻繁。寫操作加鎖保證了線程安全,讀寫分離保證了讀操作的效率,簡直完美。

如果這時(shí)候有第三個(gè)線程進(jìn)行刪除元素操作,讀線程去讀取容器中最后一個(gè)元素,讀之前的時(shí)候容器大小為i,當(dāng)去讀的時(shí)候刪除線程突然刪除了一個(gè)元素,這個(gè)時(shí)候容器大小變?yōu)榱薸-1,讀線程仍然去讀取第i個(gè)元素,這時(shí)候就會(huì)發(fā)生數(shù)組越界。

測試一下,首先向CopyOnWriteArrayList里面塞10000個(gè)測試數(shù)據(jù),啟動(dòng)兩個(gè)線程,一個(gè)不斷的刪除元素,一個(gè)不斷的讀取容器中最后一個(gè)數(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)具有進(jìn)程管理,存儲(chǔ)管理,文件管理和設(shè)備管理的功能,下列有關(guān)描述中,哪一項(xiàng)是不正確的? (A)

14.this和super正確的是(C):

15.引用計(jì)數(shù)法是JVM GC算法嗎?

16.能在try{}catch(){}finally{}結(jié)構(gòu)的finally{}中再次拋出異常嗎?

17.HTTP2新特性?

18.索引可以將隨機(jī)IO變成順序IO嗎?

19.transient修飾的變量是臨時(shí)變量嗎?

20.高、中、低三級(jí)調(diào)度。

21.TCP第四次揮手后為什么要等待2MSL后才斷開鏈接?等待時(shí)間為什么是2MSL?

22.進(jìn)程有那些狀態(tài),并簡單描述一下?

23.創(chuàng)建NIO客戶端代碼

24.獲取一個(gè)類的class實(shí)例的方法有那些?

下載鏈接博主已將以上這些大廠面試題整理成了一個(gè)面試手冊(cè),是PDF版的

總結(jié)

以上是生活随笔為你收集整理的百度Java面试题及答案(2022最新版)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

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